一、基于MATLAB的双目标定

一、使用的工具及器件

1、双目摄像头(OV9732)
在这里插入图片描述

2、MATLAB2018a
3、pycharm
4、格子图(棋牌格)
5、电脑自带相机

二、图像收集及预处理

(一)图像获取

1、打印出下面的棋牌格子图并固定好
在这里插入图片描述
2、将摄像头通过USB线与电脑连接
在这里插入图片描述
3、调整分辨率为2560720、1280480、640*240
在这里插入图片描述
4、连续拍摄10张照片后,将棋牌格子图调整位置再拍10张照片,总共拍摄40张照片(可多一点)
在这里插入图片描述

(二)图像处理

1、命名

打开pycharm,对收集的照片统一命名(当然也可以自己一个个命名,但是会很麻烦)

import os


class BatchRename():
    def __init__(self):
        self.path = r'F:\asd'

    def rename(self):
        filelist = os.listdir(self.path)
        total_num = len(filelist)
        i = 0
        for item in filelist:
            if item.endswith('.jpg'):
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(self.path), (str(i)) + '.jpg')
                try:
                    os.rename(src, dst)
                    print('converting %s to %s ...' % (src, ('pyp.' + dst)))
                    i = i + 1
                except:
                    continue
        print('total %d to rename & converted %d jpgs' % (total_num, i))


if __name__ == '__main__':
    demo = BatchRename()
    demo.rename()

目的是命名统一,方便后面对图片进行切割和处理

2、切割

首先创建两个文件夹,一个命名为left,一个命名为right,打开MATLAB编写代码进行图片切割

clc;
for i=0:39	%40张照片,根据我自己的命名的方法从0到39
    C=strcat('F:\asd\',num2str(i),'.jpg'); 
    A=imread(C); 
    [m ,n,~]=size(A); 
    n1=n/2;

    p_1=zeros(m,n1,3);
    p_2=zeros(m,n1,3);
    p_1=A(:,1:n1,:);
    p_2=A(:,n1+1:n,:);
    a=num2str(i);
    cd('F:\asdzong\left'); 
    imwrite(p_1,strcat(a,'_l.jpg'));
    cd('F:\asdzong\right');
    imwrite(p_2,strcat(a,'_r.jpg'));
end

效果图如下:
在这里插入图片描述

三、标定

1、打开matlab中的APP找到stereoCameraCalibrator运行
在这里插入图片描述
在这里插入图片描述
2、点击左上角的AddImages并将leftright文件夹地址分别输入,Size of checkerboard square后面填上棋牌格子图的格子尺寸(边长),点击确定,等待出现下面这个图

在这里插入图片描述
3、然后点击Calibrate出现下图:
在这里插入图片描述
4、去除误差比较大的数据:
在这里插入图片描述
5、得出最后结果:
在这里插入图片描述
6、打印标定结果(Export Camera Parameters):
在这里插入图片描述
在这里插入图片描述7、退出stereoCameraCalibrator并保存结果生成一个mat文件
然后就可以利用标定结果进行校正和深度图的获取,在后续文章介绍

猜你喜欢

转载自blog.csdn.net/weixin_46627856/article/details/120508683