精华内容
下载资源
问答
  • 机器人双目视觉定位技术研究
  • 球体的双目视觉定位(matlab,附代码)标签(空格分隔): 机器视觉引言双目视觉定位是我们的一个课程设计,最近刚做完,拿出来与大家分享一下,实验的目的是在拍摄的照片中识别球体,并求出该球体到相机的实际距离吗,...

    球体的双目视觉定位(matlab,附代码)

    标签(空格分隔): 机器视觉

    引言

    双目视觉定位是我们的一个课程设计,最近刚做完,拿出来与大家分享一下,实验的目的是在拍摄的照片中识别球体,并求出该球体到相机的实际距离吗,我们要求需要用matlab,但是matlab调用双目摄像头(一个USB口)却老是只能调用双目摄像头中的一个,但是利用Python的OpenCV库却可以同时调用两个,因此我们选用了Python用于拍摄图片。

    1.基本流程

    备注:因为根据得出的视差图识别出圆球略困难,我们没有采用视差图深度图去得出球体的深度,而是直接利用校正后的图片像素差,代入公式直接求出距离。

    1.相机标定

    首先我们要知道在摄像机模型中,一般要涉及四种坐标系:世界坐标系、摄像机坐标系、图像坐标系、像素坐标系。相机标定的作用可以理解为找到一种将世界坐标系和图像坐标系之间的变换关系。

    具体标定可以参考这篇文章:双目视觉相机标定

    1.像素坐标系(u,v):

    顾名思义,每一点都是一个像素,原点通常设置在图像的左上角处,点的横纵坐标分别代表相应的像素在图像中位于第几行第几列;

    2.图像坐标系(x,y):

    将原点设置在相机光轴与图像平面的交点处,横轴、纵轴与像素坐标系的横轴、纵轴平行; 图像平面的中心为坐标原点,为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置。

    3.相机坐标系(x,y,z):

    摄像机站在自己角度上衡量的物体的坐标系。摄像机坐标系的原点在摄像机的光心上,z轴与摄像机光轴平行。它是与拍摄物体发生联系的桥头堡,世界坐标系下的物体需先经历刚体变化转到摄像机坐标系,然后在和图像坐标系发生关系。它是图像坐标与世界坐标之间发生关系的纽带,沟通了世界上最远的距离。单位为长度单位如mm。

    4.世界坐标系 (Xw,Yw,Zw):

    物体在真实世界中的坐标。

    具体标定利用matlab的工具箱,步骤如下:

    1.打印标定板:

    2.拿着标定板拍照(拍照代码在文末),效果图如图:

    3.将上面的照片按left,right分为两组,放到两个文件夹中,打开matlab进行标定。在命令行窗口输入stereoCameraCalibrator,出现如下界面:

    4.然后将上面的“Skew”、“Tangential Distortion”以及“2 Coefficients”等选项选上,将“3 Coefficients”选项去掉,如下:

    5.载入图像:

    备注:标定板打印的标准一点,图中的25是小方格边长,方格!边长!根据你的实际情况修改。

    6.点击按钮进行标定:

    7.选中直方图中误差较大的一些组,(与此同时左侧的图片也会被选中),将这些删除,然后他会自动重新标定。

    8.觉得没问题了,就把标定的数据导出(那个绿色的对勾符号)。之后关掉这个工具箱,会弹出一个框,然后选择yes保存生成的.mat文件。记住自己保存的路径,下次用的时候提前在matlab中打开这个文件。至此,标定完成。

    标定的参数包括很多,包括相机的内参,外参等,有旋转矩阵,平移矩阵等。可以自己去查查。

    2.图像校正

    图像校正是根据标定获取的畸变矩阵,来校正相机拍摄时造成的误差,包括径向畸变和切向畸变。两者合起来是一个15的矩阵,不过matlab标定的时候却只显示两个12的矩阵,查了知道缺失的一个参数可以设置为0,.如果你利用python双目测距这篇文章做的双目视觉定位,这句话肯定会给予你帮助。

    3.识别圆球

    这里采用了霍夫变换去识别小球,霍夫变换找圆的基本思想是,对于一个圆

    我们可以把它放入以a,b,r为坐标轴的三维坐标系系中,而不是以x,y为坐标轴的二维坐标系中,又因为同一平面不在一条直线的三个点就可以确定一个圆,所以图中对应的A点(a,b,r)就是一个圆心,但是如果这样找的话,图中可以找到很多这样的三个点,所以也肯定能找到很多圆,因此需要进行‘投票’,即如果有很多点交于这一点,那么这个点极有可能是圆心:

    具体代码如下,(github上找的):

    function [Hough_space,Hough_circle_result,Para] = Hough_circle(BW,Step_r,Step_angle,r_min,r_max,p)

    %---------------------------------------------------------------------------------------------------------------------------

    % input:

    % BW:二值图像;

    % Step_r:检测的圆半径步长;

    % Step_angle:角度步长,单位为弧度;

    % r_min:最小圆半径;

    % r_max:最大圆半径;

    % p:以p*Hough_space的最大值为阈值,p取0,1之间的数.

    % a = x-r*cos(angle); b = y-r*sin(angle);

    %---------------------------------------------------------------------------------------------------------------------------

    % output:

    % Hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数;

    % Hough_circle:二值图像,检测到的圆;

    % Para:检测到的圆的圆心、半径.

    %---------------------------------------------------------------------------------------------------------------------------

    circleParaXYR=[];

    Para=[];

    %得到二值图像大小

    [m,n] = size(BW);

    %计算检测半径和角度的步数、循环次数 并取整,四舍五入

    size_r = round((r_max-r_min)/Step_r)+1;

    size_angle = round(2*pi/Step_angle);

    %建立参数空间

    Hough_space = zeros(m,n,size_r);

    %查找非零元素的行列坐标

    [rows,cols] = find(BW);

    %非零坐标的个数

    ecount = size(rows);

    % Hough变换

    % 将图像空间(x,y)对应到参数空间(a,b,r)

    % a = x-r*cos(angle)

    % b = y-r*sin(angle)

    i = 1;

    ecount = ecount(1);

    for i=1:ecount

    for r=1:size_r %半径步长数按一定弧度把圆几等分

    for k=1:size_angle

    a = round(rows(i)-(r_min+(r-1)*Step_r)*cos(k*Step_angle));

    b = round(cols(i)-(r_min+(r-1)*Step_r)*sin(k*Step_angle));

    if (a>0&&a<=m&&b>0&&b<=n)

    Hough_space(a,b,r)=Hough_space(a,b,r)+1;%h(a,b,r)的坐标,圆心和半径

    end

    end

    end

    end

    % 搜索超过阈值的聚集点,对于多个圆的检测,阈值要设的小一点!通过调此值,可以求出所有圆的圆心和半径返回值就是这个矩阵的最大值

    max_para = max(max(max(Hough_space)));

    %一个矩阵中,想找到其中大于max_para*p数的位置

    index = find(Hough_space>=max_para*p);

    length = size(index);%符合阈值的个数

    Hough_circle_result=zeros(m,n);

    %通过位置求半径和圆心。

    length = length(1);

    k = 1;

    par = 1;

    for i=1:ecount

    for k=1:length

    par3 = floor(index(k)/(m*n))+1;

    par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;

    par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;

    if((rows(i)-par1)^2+(cols(i)-par2)^2

    (rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*Step_r)^2-5)

    Hough_circle_result(rows(i),cols(i)) = 1;%检测的圆

    end

    end

    end

    % 从超过峰值阈值中得到

    for k=1:length

    par3 = floor(index(k)/(m*n))+1;%取整

    par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;

    par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;

    circleParaXYR = [circleParaXYR;par1,par2,par3];

    Hough_circle_result(par1,par2)= 1; %这时得到好多圆心和半径,不同的圆的圆心处聚集好多点,这是因为所给的圆不是标准的圆

    end

    %集中在各个圆的圆心处的点取平均,得到针对每个圆的精确圆心和半径;

    while size(circleParaXYR,1) >= 1

    num=1;

    XYR=[];

    temp1=circleParaXYR(1,1);

    temp2=circleParaXYR(1,2);

    temp3=circleParaXYR(1,3);

    c1=temp1;

    c2=temp2;

    c3=temp3;

    temp3= r_min+(temp3-1)*Step_r;

    if size(circleParaXYR,1)>1

    for k=2:size(circleParaXYR,1)

    if (circleParaXYR(k,1)-temp1)^2+(circleParaXYR(k,2)-temp2)^2 > temp3^2

    XYR=[XYR;circleParaXYR(k,1),circleParaXYR(k,2),circleParaXYR(k,3)]; %保存剩下圆的圆心和半径位置

    else

    c1=c1+circleParaXYR(k,1);

    c2=c2+circleParaXYR(k,2);

    c3=c3+circleParaXYR(k,3);

    num=num+1;

    end

    end

    end

    c1=round(c1/num);

    c2=round(c2/num);

    c3=round(c3/num);

    c3=r_min+(c3-1)*Step_r;

    Para=[Para;c1,c2,c3]; %保存各个圆的圆心和半径的值

    circleParaXYR=XYR;

    End

    4.计算距离

    计算距离采用了一个公式:

    ,其中f为焦距,T为两个相机之间的距离,分母为两个图片的像素差,例如校正之后,球心在第一张图片的像素坐标为(u,v1),在第二章图片的像素坐标为(u,v2),则像素差为|v1-v2|。

    注意这个参数,rectifyStereoImages()这个函数要用:

    代码如下,读入两幅图,但是只在一张图上进行了距离标注,另一张图只负责提供圆心坐标

    注意如果不能准确识别出圆球,需要修改最小,最大圆半径这两个参数:

    I1 = imread('E:\image\left_0.jpg');%读取左右图片

    I2 = imread('E:\image\right_0.jpg');

    %%%注意校正的第三个参数,他的名字由你得到的标定文件得到,看上图%%%%

    [J1, J2] = rectifyStereoImages(I1,I2,calibrationSession.CameraParameters);

    I1=rgb2gray(J1)

    I=rgb2gray(J2)

    %------------------------------------------

    BW1=edge(I1,'sobel')

    BW=edge(I2,'sobel')

    %----------

    Step_r = 0.5;

    %角度步长0.1,单位为弧度

    Step_angle = 0.1;

    %最小圆半径2

    minr =5;

    %最大圆半径30

    maxr = 8;

    %以thresh*hough_space的最大值为阈值,thresh取0-1之间的数

    thresh = 1;

    %-----------这个只负责提供其中一张图片的圆心坐标,这个函数是上一段代码

    [Hough_space,Hough_circle_result,Para] = Hough_circle(BW1,Step_r,Step_angle,minr,maxr,thresh);

    %开始检测另一个圆

    [Hough_space,Hough_circle_result,Para1] = Hough_circle(BW,Step_r,Step_angle,minr,maxr,thresh);

    %两幅图像素差

    sub=(Para(2)-Para1(2)) %*100/67%如果这里有67%缩放比例

    %焦距

    jiaoju=3.6

    %相机距离

    jixian=12.2

    depth=(jiaoju*jixian)/abs(sub)

    %距离,转成字符串才能放上去

    depth=num2str(depth)

    axis equal

    figure(1);

    imshow(BW,[]),title('边缘(图一)');

    axis equal

    figure(2);

    imshow(Hough_circle_result,[]),title('检测结果(图一)');

    axis equal

    figure(3),imshow(I,[]),title('检测出图中的圆(图一)')

    hold on;

    %--------------------------------------------------------------

    %以红色线标记出的检测圆心与圆

    plot(circleParaXYR(:,2), circleParaXYR(:,1), 'r+');

    %打上距离值

    text(circleParaXYR(:,2)+circleParaXYR(3), circleParaXYR(:,1)-circleParaXYR(3),depth,'color','red')

    for k = 1 : size(circleParaXYR, 1)

    t=0:0.01*pi:2*pi;

    x=cos(t).*circleParaXYR(k,3)+circleParaXYR(k,2);

    y=sin(t).*circleParaXYR(k,3)+circleParaXYR(k,1);

    plot(x,y,'r-');

    End

    得到的效果图:

    随便改改代码甚至还可以皮一下:

    5.生成视差图

    视差图还好说,深度图却相当诡异,所以我们把深度图注释掉了。

    clear all

    clc

    I1 = imread('E:\image\left_0.jpg');%读取左右图片

    I2 = imread('E:\image\right_0.jpg');

    %I1=imcrop(I1,[0,118,320,320])%去除黑边

    %I2=imcrop(I2,[0,118,320,320])

    figure

    imshowpair(I1, I2, 'montage');

    title('Original Images');

    %---------------------------------------------------------------

    load('E:\image\calibrationSession.mat');%加载你保存的相机标定的mat

    %校正图片

    [J1, J2] = rectifyStereoImages(I1,I2,calibrationSession.CameraParameters);

    % figure

    % imshow(J1)

    figure

    imshowpair(J1, J2, 'montage');

    title('Undistorted Images');

    %-----------------------------------------

    figure; imshow(cat(3, J1(:,:,1), J2(:,:,2:3)), 'InitialMagnification', 100)

    %----------------------------------------------------------------------------

    %disparityRange = [-6 10];如此果想生成彩色视差图,将此注释解除

    disparityMap1 = disparity(rgb2gray(J1),rgb2gray(J2),'DisparityRange',[0,16],'BlockSize',5,'ContrastThreshold',0.3,'UniquenessThreshold',5);

    figure

    imshow(disparityMap1)%%%,disparityRange);如此果想生成彩色视差图,将此注释解除

    % title('Disparity Map');%生成彩色视差图,将此注释解除

    % colormap(gca,jet) %生成彩色视差图,将此注释解除

    % colorbar%生成彩色视差图,将此注释解除

    %---深度图注释掉

    %pointCloud3D = reconstructScene(disparityMap1, %calibrationSession.CameraParameters);%深度图

    %figure;

    %imshow(pointCloud3D);

    效果图:

    6.拍照用的Python代码,参考python双目测距:

    import cv2

    import time

    AUTO = True # 自动拍照,或手动按s键拍照

    INTERVAL = 2 # 自动拍照间隔

    cv2.namedWindow("shuangmu")

    cv2.moveWindow("shuangmu", 400, 0)

    shuangmu_camera = cv2.VideoCapture(1)#打开双目摄像头

    counter = 0

    utc = time.time()

    ###pattern = (12, 8) # 棋盘格尺寸

    folder = "e:/keshe/" # 拍照文件目录

    def shot(pos, frame):

    global counter

    path = folder + pos + "_" + str(counter) + ".jpg"

    cv2.imwrite(path, frame)#保存图像

    print("snapshot saved into: " + path)

    while True:

    #ret是布尔值,如果读取帧是正确的则返回True,frame就是每一帧的图像

    ret,double_frame = shuangmu_camera.read()

    heigh=len(double_frame)

    width=len(double_frame[0])

    width2=int(width/2)

    left1=double_frame[:heigh,0:width2]

    right1=double_frame[:heigh,width2:width]

    cv2.imshow("shuangmu", double_frame)

    now = time.time()

    if AUTO and now - utc >= INTERVAL:

    shot("left", left1)

    shot("right", right1)

    counter += 1

    utc = now

    key = cv2.waitKey(1)#等待键盘输入,1表示延时1ms切换到下一帧图像,对于视频而言

    if key == ord("q"):

    break

    elif key == ord("s"):

    shot("right", right_frame)

    counter += 1

    cv2.destroyWindow("shuangmu")#释放窗口

    展开全文
  • 基于SIFT特征点的双目视觉定位,双目视差测距,三维重建
  • 武汉大学摄影测量 图像理解与计算机视觉 机器人双目视觉定位技术研究
  • 双目视觉定位系统坐标系特征提取方法的研究,温进,娄平,论文以双目视觉定位系统的坐标图像为研究对象,以提取双目视觉定位系统的坐标系特征为研究目标,研究过程中针对普通采集方法图像��
  • 本文阐述了基于H--S(hue-saturation)直方图反向投影结合特征点提取的双目视觉定位算法,可提取左右摄像头图像特征点,并用左图特征点和极线约束对右图特征点进行修正,从而可实现双目视觉定位.在此基础上,为了进一步...
  • 本文利用双目视觉定位技术,实现了机器人对目标的识别与定位。首先,提出了一种介于传统标定和自标定的内外参数标定分离的方法,摄像机内部参数以透视成像模型为基础,用物理方法来提取; 外参数标定时合理选取参考...
  • 基于点线特征的室内环境双目视觉定位和2D激光雷达建图.pdf
  • 图像双目视觉定位

    千次阅读 2019-01-07 19:14:29
    今天与大家分享一下关于图像的双目定位法,对于实际工程有很大参考意义!! 顾名思义:双目定位就是用两部相机来定位双目定位过程中,两部相机在同一平面上,并且光轴互相平行,就像是人的两只眼睛一样,针对物体...

    今天与大家分享一下关于图像的双目定位法,对于实际工程有很大参考意义!!

    顾名思义:双目定位就是用两部相机来定位。双目定位过程中,两部相机在同一平面上,并且光轴互相平行,就像是人的两只眼睛一样,针对物体上某一个或某些特征点,用两部固定于不同位置的相机摄得物体的像,分别获得该点在两部相机像平面上的坐标。只要知道两部相机精确的相对位置,就可用几何的方法得到该特征点在固定一部相机的坐标系中的坐标,即确定了特征点的位置。

    双目视觉图像定位系统是Microvision(维视图像)开发的一套针对芯片压焊过程中对芯片位置进行识别定位,以便更好的将芯片固化在想要的位置上。双目视觉图像定位系统,双目定位系统利用两台Microvision MV-808H工业相机、VS-M1024工业连续放大变倍镜头、MV-8002两路高清图像采集卡,同时对图像进行获取,在安装中,对芯片点焊位置进行准确定位。

    双目视觉检测系统通过图像分析处理和图像测量的方式精确获取电路板上的安装或加工位置的坐标信息,计算出位置坐标,提供给机械臂运行控制。双目视觉图像定位系统,双目定位广泛用于丝网印刷机械、贴合、切割、PS打孔机、PCB补线机、PCB打孔机、玻璃割片机、点胶机、SMT检测、贴版机等工业精密对位、定位、零件确认、尺寸测量、工业显微等CCD视觉对位、测量装置等领域,主要应用,IC、芯片、电路板的位置识别定位、视觉图像定位系统上。如:打孔机定位、绑定机定位、晶体管吸取定位、IC贴片机对位、机器坐标定位、机器手定位、方向辨别定位。

    双目相机系统主要的任务就是测距,而视差求距离公式是在双目系统处于理想情况下推导的,所以在解算特征点深度信息时需要保证左右摄像机在数学上对准到同一观察平面上。但是在现实的双目立体视觉系统中,是不存在完全共面且行对准的两个摄像机图像平面的。所以对于在单独标定左右两个摄像头之后还需要进行双目立体校正,得到两个摄像头之间的相对位置,从而对双目图像进行共面且行对准。

     

    展开全文
  • 球体的双目视觉定位(matlab,附代码) 标签(空格分隔): 机器视觉 引言 双目视觉定位是我们的一个课程设计,最近刚做完,拿出来与大家分享一下,实验的目的是在拍摄的照片中识别球体,并求出该球体到相机的实际...

    球体的双目视觉定位(matlab,附代码)

    标签(空格分隔): 机器视觉


    引言

    双目视觉定位是我们的一个课程设计,最近刚做完,拿出来与大家分享一下,实验的目的是在拍摄的照片中识别球体,并求出该球体到相机的实际距离吗,我们要求需要用matlab,但是matlab调用双目摄像头(一个USB口)却老是只能调用双目摄像头中的一个,但是利用Python的OpenCV库却可以同时调用两个,因此我们选用了Python用于拍摄图片。

    1.基本流程

    1701224-20190702105111352-162238449.png

    备注:因为根据得出的视差图识别出圆球略困难,我们没有采用视差图深度图去得出球体的深度,而是直接利用校正后的图片像素差,代入公式直接求出距离。

    1.相机标定

    首先我们要知道在摄像机模型中,一般要涉及四种坐标系:世界坐标系、摄像机坐标系、图像坐标系、像素坐标系。相机标定的作用可以理解为找到一种将世界坐标系和图像坐标系之间的变换关系。
    具体标定可以参考这篇文章:双目视觉相机标定

    • 1.像素坐标系(u,v):
      顾名思义,每一点都是一个像素,原点通常设置在图像的左上角处,点的横纵坐标分别代表相应的像素在图像中位于第几行第几列;
    • 2.图像坐标系(x,y):
      将原点设置在相机光轴与图像平面的交点处,横轴、纵轴与像素坐标系的横轴、纵轴平行; 图像平面的中心为坐标原点,为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置。
    • 3.相机坐标系(x,y,z):
      摄像机站在自己角度上衡量的物体的坐标系。摄像机坐标系的原点在摄像机的光心上,z轴与摄像机光轴平行。它是与拍摄物体发生联系的桥头堡,世界坐标系下的物体需先经历刚体变化转到摄像机坐标系,然后在和图像坐标系发生关系。它是图像坐标与世界坐标之间发生关系的纽带,沟通了世界上最远的距离。单位为长度单位如mm。
    • 4.世界坐标系 (Xw,Yw,Zw):
      物体在真实世界中的坐标。

    具体标定利用matlab的工具箱,步骤如下:
    1.打印标定板:
    1701224-20190702105811839-2033738506.jpg

    2.拿着标定板拍照(拍照代码在文末),效果图如图:
    1701224-20190702105848999-519378164.jpg

    3.将上面的照片按left,right分为两组,放到两个文件夹中,打开matlab进行标定。在命令行窗口输入stereoCameraCalibrator,出现如下界面:
    1701224-20190702110257243-428419155.jpg

    4.然后将上面的“Skew”、“Tangential Distortion”以及“2 Coefficients”等选项选上,将“3 Coefficients”选项去掉,如下:
    1701224-20190702105951990-1833673021.jpg

    5.载入图像:
    91432cd5f4a1ee8ff31b5f93b35252bf243.jpg
    备注:标定板打印的标准一点,图中的25是小方格边长,方格!边长!根据你的实际情况修改。

    6.点击按钮进行标定:
    8f6b42e7ba94ad3702240477ef901fb6a9b.jpg

    7.选中直方图中误差较大的一些组,(与此同时左侧的图片也会被选中),将这些删除,然后他会自动重新标定。

    8.觉得没问题了,就把标定的数据导出(那个绿色的对勾符号)。之后关掉这个工具箱,会弹出一个框,然后选择yes保存生成的.mat文件。记住自己保存的路径,下次用的时候提前在matlab中打开这个文件。至此,标定完成。
    ff42c23fd741c4b61eb0c820177bcb2246b.jpg

    标定的参数包括很多,包括相机的内参,外参等,有旋转矩阵,平移矩阵等。可以自己去查查。

    2.图像校正

    图像校正是根据标定获取的畸变矩阵,来校正相机拍摄时造成的误差,包括径向畸变和切向畸变。两者合起来是一个15的矩阵,不过matlab标定的时候却只显示两个12的矩阵,查了知道缺失的一个参数可以设置为0,.如果你利用python双目测距这篇文章做的双目视觉定位,这句话肯定会给予你帮助。

    3.识别圆球

    这里采用了霍夫变换去识别小球,霍夫变换找圆的基本思想是,对于一个圆 04fdeca807a8d7a3364230bdab56b63a818.jpg
    我们可以把它放入以a,b,r为坐标轴的三维坐标系系中,而不是以x,y为坐标轴的二维坐标系中,又因为同一平面不在一条直线的三个点就可以确定一个圆,所以图中对应的A点(a,b,r)就是一个圆心,但是如果这样找的话,图中可以找到很多这样的三个点,所以也肯定能找到很多圆,因此需要进行‘投票’,即如果有很多点交于这一点,那么这个点极有可能是圆心:
    e16591d440c2134fbd04ef9524f75e822a0.jpg
    具体代码如下,(github上找的):

    function [Hough_space,Hough_circle_result,Para] = Hough_circle(BW,Step_r,Step_angle,r_min,r_max,p)  
    %---------------------------------------------------------------------------------------------------------------------------  
    % input:  
    % BW:二值图像;  
    % Step_r:检测的圆半径步长;  
    % Step_angle:角度步长,单位为弧度;  
    % r_min:最小圆半径;  
    % r_max:最大圆半径;  
    % p:以p*Hough_space的最大值为阈值,p取0,1之间的数.  
    % a = x-r*cos(angle); b = y-r*sin(angle);  
    %---------------------------------------------------------------------------------------------------------------------------  
    % output:  
    % Hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数;  
    % Hough_circle:二值图像,检测到的圆;  
    % Para:检测到的圆的圆心、半径.  
    %---------------------------------------------------------------------------------------------------------------------------  
    circleParaXYR=[];  
    Para=[];  
    %得到二值图像大小  
    [m,n] = size(BW);  
    %计算检测半径和角度的步数、循环次数 并取整,四舍五入  
    size_r = round((r_max-r_min)/Step_r)+1;  
    size_angle = round(2*pi/Step_angle);  
    %建立参数空间  
    Hough_space = zeros(m,n,size_r);  
    %查找非零元素的行列坐标  
    [rows,cols] = find(BW);  
    %非零坐标的个数  
    ecount = size(rows);  
    % Hough变换  
    % 将图像空间(x,y)对应到参数空间(a,b,r)  
    % a = x-r*cos(angle)  
    % b = y-r*sin(angle)  
    i = 1;
    ecount = ecount(1);
    for i=1:ecount
        for r=1:size_r %半径步长数按一定弧度把圆几等分  
            for k=1:size_angle  
                a = round(rows(i)-(r_min+(r-1)*Step_r)*cos(k*Step_angle));  
                b = round(cols(i)-(r_min+(r-1)*Step_r)*sin(k*Step_angle));  
                if (a>0&&a<=m&&b>0&&b<=n)  
                    Hough_space(a,b,r)=Hough_space(a,b,r)+1;%h(a,b,r)的坐标,圆心和半径  
                end  
            end  
        end  
    end  
    % 搜索超过阈值的聚集点,对于多个圆的检测,阈值要设的小一点!通过调此值,可以求出所有圆的圆心和半径返回值就是这个矩阵的最大值  
    max_para = max(max(max(Hough_space)));  
    %一个矩阵中,想找到其中大于max_para*p数的位置  
    index = find(Hough_space>=max_para*p);  
    length = size(index);%符合阈值的个数  
    Hough_circle_result=zeros(m,n);  
    %通过位置求半径和圆心。  
    length = length(1);
    k = 1;
    par = 1;
    for i=1:ecount  
        for k=1:length  
            par3 = floor(index(k)/(m*n))+1;  
            par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;  
            par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;  
            if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*Step_r)^2+5&&...  
              (rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*Step_r)^2-5)  
                Hough_circle_result(rows(i),cols(i)) = 1;%检测的圆  
            end  
        end  
    end  
    % 从超过峰值阈值中得到    
    for k=1:length    
        par3 = floor(index(k)/(m*n))+1;%取整    
        par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;    
        par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;    
        circleParaXYR = [circleParaXYR;par1,par2,par3];    
        Hough_circle_result(par1,par2)= 1; %这时得到好多圆心和半径,不同的圆的圆心处聚集好多点,这是因为所给的圆不是标准的圆    
    end   
    %集中在各个圆的圆心处的点取平均,得到针对每个圆的精确圆心和半径;  
    while size(circleParaXYR,1) >= 1  
        num=1;  
        XYR=[];  
        temp1=circleParaXYR(1,1);  
        temp2=circleParaXYR(1,2);  
        temp3=circleParaXYR(1,3);  
        c1=temp1;  
        c2=temp2;  
        c3=temp3;  
        temp3= r_min+(temp3-1)*Step_r;  
        if size(circleParaXYR,1)>1  
            for k=2:size(circleParaXYR,1)  
                if (circleParaXYR(k,1)-temp1)^2+(circleParaXYR(k,2)-temp2)^2 > temp3^2  
                    XYR=[XYR;circleParaXYR(k,1),circleParaXYR(k,2),circleParaXYR(k,3)];  %保存剩下圆的圆心和半径位置  
                else  
                    c1=c1+circleParaXYR(k,1);  
                    c2=c2+circleParaXYR(k,2);  
                    c3=c3+circleParaXYR(k,3);  
                    num=num+1;  
                end  
            end  
        end  
        c1=round(c1/num);  
        c2=round(c2/num);  
        c3=round(c3/num);  
        c3=r_min+(c3-1)*Step_r;  
        Para=[Para;c1,c2,c3]; %保存各个圆的圆心和半径的值  
        circleParaXYR=XYR;  
    End

    4.计算距离

    计算距离采用了一个公式:27bdf7f10cca17c6ed8294d13d7b8870fa4.jpg,其中f为焦距,T为两个相机之间的距离,分母为两个图片的像素差,例如校正之后,球心在第一张图片的像素坐标为(u,v1),在第二章图片的像素坐标为(u,v2),则像素差为|v1-v2|。

    注意这个参数,rectifyStereoImages()这个函数要用:
    2e8175feeae9224f6d73f0852aadec7b878.jpg

    代码如下,读入两幅图,但是只在一张图上进行了距离标注,另一张图只负责提供圆心坐标
    注意如果不能准确识别出圆球,需要修改最小,最大圆半径这两个参数

    I1 = imread('E:\image\left_0.jpg');%读取左右图片
    I2 = imread('E:\image\right_0.jpg');
    %%%注意校正的第三个参数,他的名字由你得到的标定文件得到,看上图%%%%
    [J1, J2] = rectifyStereoImages(I1,I2,calibrationSession.CameraParameters);
    I1=rgb2gray(J1)
    I=rgb2gray(J2)
    %------------------------------------------
    BW1=edge(I1,'sobel')
    BW=edge(I2,'sobel')
    %----------
    Step_r = 0.5;  
    %角度步长0.1,单位为弧度  
    Step_angle = 0.1;  
    %最小圆半径2  
    minr =5;  
    %最大圆半径30  
    maxr = 8;  
    %以thresh*hough_space的最大值为阈值,thresh取0-1之间的数  
    thresh = 1;  
    %-----------这个只负责提供其中一张图片的圆心坐标,这个函数是上一段代码 
    [Hough_space,Hough_circle_result,Para] = Hough_circle(BW1,Step_r,Step_angle,minr,maxr,thresh);
    %开始检测另一个圆
    [Hough_space,Hough_circle_result,Para1] = Hough_circle(BW,Step_r,Step_angle,minr,maxr,thresh);  
    %两幅图像素差
    sub=(Para(2)-Para1(2))  %*100/67%如果这里有67%缩放比例
    %焦距
    jiaoju=3.6
    %相机距离
    jixian=12.2
    depth=(jiaoju*jixian)/abs(sub)
    %距离,转成字符串才能放上去
    depth=num2str(depth)
    axis equal  
    figure(1);  
    imshow(BW,[]),title('边缘(图一)');  
    axis equal  
    figure(2);  
    imshow(Hough_circle_result,[]),title('检测结果(图一)');  
    axis equal  
    figure(3),imshow(I,[]),title('检测出图中的圆(图一)')  
    hold on;  
    %-------------------------------------------------------------- 
    %以红色线标记出的检测圆心与圆  
    plot(circleParaXYR(:,2), circleParaXYR(:,1), 'r+');
    %打上距离值
    text(circleParaXYR(:,2)+circleParaXYR(3), circleParaXYR(:,1)-circleParaXYR(3),depth,'color','red')
    for k = 1 : size(circleParaXYR, 1)
        t=0:0.01*pi:2*pi;  
        x=cos(t).*circleParaXYR(k,3)+circleParaXYR(k,2);  
        y=sin(t).*circleParaXYR(k,3)+circleParaXYR(k,1);  
        plot(x,y,'r-');
    End

    得到的效果图:
    482303e94324dfa789952cbfc3670c1378b.jpg
    随便改改代码甚至还可以皮一下:
    8167bb33c9c55e61f905b178e9578b038d2.jpg

    5.生成视差图

    视差图还好说,深度图却相当诡异,所以我们把深度图注释掉了。

    clear all
    clc
     
    I1 = imread('E:\image\left_0.jpg');%读取左右图片
    I2 = imread('E:\image\right_0.jpg');
    %I1=imcrop(I1,[0,118,320,320])%去除黑边
    %I2=imcrop(I2,[0,118,320,320])
    figure
    imshowpair(I1, I2, 'montage');
    title('Original Images');
    %---------------------------------------------------------------
    load('E:\image\calibrationSession.mat');%加载你保存的相机标定的mat
    %校正图片
    [J1, J2] = rectifyStereoImages(I1,I2,calibrationSession.CameraParameters);
    % figure
    % imshow(J1)
    figure
    imshowpair(J1, J2, 'montage');
    title('Undistorted Images');
    %-----------------------------------------
    figure; imshow(cat(3, J1(:,:,1), J2(:,:,2:3)), 'InitialMagnification', 100)
    %----------------------------------------------------------------------------
    %disparityRange = [-6 10];如此果想生成彩色视差图,将此注释解除
    disparityMap1 = disparity(rgb2gray(J1),rgb2gray(J2),'DisparityRange',[0,16],'BlockSize',5,'ContrastThreshold',0.3,'UniquenessThreshold',5);
    figure 
    imshow(disparityMap1)%%%,disparityRange);如此果想生成彩色视差图,将此注释解除
    % title('Disparity Map');%生成彩色视差图,将此注释解除
    % colormap(gca,jet) %生成彩色视差图,将此注释解除
    % colorbar%生成彩色视差图,将此注释解除
    %---深度图注释掉
    %pointCloud3D = reconstructScene(disparityMap1, %calibrationSession.CameraParameters);%深度图
    %figure;
    %imshow(pointCloud3D);

    效果图:
    56ee59a7c3f857d5292cc7612e505745ca5.jpg

    6.拍照用的Python代码,参考python双目测距

    import cv2
    import time
    AUTO = True  # 自动拍照,或手动按s键拍照
    INTERVAL = 2 # 自动拍照间隔
    cv2.namedWindow("shuangmu")
    cv2.moveWindow("shuangmu", 400, 0)
    shuangmu_camera = cv2.VideoCapture(1)#打开双目摄像头
    counter = 0
    utc = time.time()
    ###pattern = (12, 8) # 棋盘格尺寸
    folder = "e:/keshe/" # 拍照文件目录
    def shot(pos, frame):
        global counter
        path = folder + pos + "_" + str(counter) + ".jpg"
    
        cv2.imwrite(path, frame)#保存图像
        print("snapshot saved into: " + path)
    
    while True:
        #ret是布尔值,如果读取帧是正确的则返回True,frame就是每一帧的图像
        ret,double_frame = shuangmu_camera.read()
        heigh=len(double_frame)
        width=len(double_frame[0])
        width2=int(width/2)
        left1=double_frame[:heigh,0:width2]
        right1=double_frame[:heigh,width2:width]
    
        cv2.imshow("shuangmu", double_frame)
    
        now = time.time()
        if AUTO and now - utc >= INTERVAL:
            shot("left", left1)
            shot("right", right1)
            counter += 1
            utc = now
        key = cv2.waitKey(1)#等待键盘输入,1表示延时1ms切换到下一帧图像,对于视频而言
        if key == ord("q"):
            break
        elif key == ord("s"):
            shot("right", right_frame)
            counter += 1
    
    cv2.destroyWindow("shuangmu")#释放窗口

    转载于:https://www.cnblogs.com/starstrrys/p/11119017.html

    展开全文
  • 提起来双目定位,相信许多人像现在的我...搞双目两年了,以前就是生成一张深度图,或者进行一下双目测距,网上的代码复制粘贴修改一下就能用了,但是现在要搞高精度的双目视觉定位,就必须深挖下去,搞清楚成像光...

           提起来双目定位,相信许多人像现在的我一样,紧紧会用现成的公式,理解一些定义,明白那些参数的含义,但是深入的来说,估计连张正友教授的标定算法都没有推明白。因为其中涉及一些矩阵运算的技巧,没有数学基础,或者基础不牢,都无法深度理解。搞双目两年了,以前就是生成一张深度图,或者进行一下双目测距,网上的代码复制粘贴修改一下就能用了,但是现在要搞高精度的双目视觉定位,就必须深挖下去,搞清楚成像光路的方方面面。这里,我提供一些网上总结比较好的博客给新来的朋友铺垫一下:https://www.cnblogs.com/zyly/p/9366080.html ;这篇博客不仅系统的讲解了成像坐标过程,而且在博文最后列举了一系列参考博客,感谢他把!“大奥特曼打小怪兽”;

               今天,先说说镜头畸变吧,因为没有一个镜头没有不畸变的,不过是畸变的大小不同,例如你用4.3mm的摄像头(小型USB相机),基本上是平光镜头,其他的规格的,你就不能不考虑镜头畸变了。如果你搞搞深度图,测测距离,基本也没事那些都是低精度的,误差大点无所谓,了不起用个张正友标定法,或者Matlib双目标定一下,精度就不错了。但是如果你要搞精密测量,纠结mm及的精度,那些方法就总是不能满足你了。比如现在就不能满足我了!怎么办,深挖技术细节,找到根!

               张氏标定法的伟大,在于将标定过程简化到打印一张A4纸的棋盘格就能获得比较高的精度,在摄影测量相机标定场总不能还贴A4纸吧!但是,但是,我们还可以用张正友标定法!不过是更加认真的考虑各个因素的用这个方法处理标定问题。这就是方法创新的意义!

    说了这么多多余的话,就是为了抛出两个相机标定的函数:OPENCV函数:

    【A】CV_EXPORTS_AS(calibrateCameraExtended) double calibrateCamera( InputArrayOfArrays objectPoints,
                                         InputArrayOfArrays imagePoints, Size imageSize,
                                         InputOutputArray cameraMatrix, InputOutputArray distCoeffs,
                                         OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs,
                                         OutputArray stdDeviationsIntrinsics,
                                         OutputArray stdDeviationsExtrinsics,
                                         OutputArray perViewErrors,
                                         int flags = 0, TermCriteria criteria = TermCriteria(
                                            TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON) );

    这个【A】函数,是一个支持分析标定的函数,输出的参数中给出了评估结果。
    【B】CV_EXPORTS_W double calibrateCamera( InputArrayOfArrays objectPoints,
                                         InputArrayOfArrays imagePoints, Size imageSize,
                                         InputOutputArray cameraMatrix, InputOutputArray distCoeffs,
                                         OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs,
                                         int flags = 0, TermCriteria criteria = TermCriteria(
                                            TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON) );

    这个【B】函数,与【A】仅有功能区别。

    以下是一些关于这两个函数怎么用的介绍,直接从OPENCV函数翻译过来的,翻译有误差,这里说一下自己的理解:

    1.InputArrayOfArrays objectPoints

    这个objectPoints 就是所用的棋盘格角点的世界坐标,当然这里由你用的标定板给出。当然你如果自建标定规则要,注意他的数据类型是std :: vector <std :: vector <cv :: Vec3f >>,这意味着你照相多少次就生成多少次,其中的z坐标都为0;2.InputArrayOfArrays imagePoints

    这个imagePoints顾名思义就是在图像中提取棋盘格的角点的像点坐标,注意这是个数据类型是std :: vector <std :: vector <cv :: Vec2f >>,这个给你照相那些坐标都对照,一一对应

    3. InputOutputArray cameraMatrix

    这个好说就是相机内参数矩阵,可以初始化也可以不,与你后面选择的计算模式有关系。

    4.InputOutputArray distCoeffs

    这个就是今天的重点,畸变参数。可以是4,5,8,12或14个元素。一般大家都用5参数,一般精度这个就够了。至于高精度时候是不是参数越多越好,有人说多了容易不稳定,这一点我可以肯定的告诉你,对于描述一个模型参数越多肯定会越好,你想想现在的深度学习,那个网络模型参数不是成千上万!但是,但是,你参数多你需要拍的图像就越多,而且你的标定场要建的的好!如果还拿个A4纸当标定板,那就每必要设那么多参数了。想想为啥?你的数据质量都不构,怎么平差解方程!所以,这个地方就是一个分水领,不过对于一般计算机视觉需求,5个参数也就差不多了。

    5. OutputArrayOfArrays rvecs,6.OutputArrayOfArrays tvecs

    这两个参数是标定过程中以标定板为参考,相机的旋转、平移参数,想想Matlib标定过程中最后给你一个镜头的大致方向显示。

     7.OutputArray stdDeviationsIntrinsics  8.OutputArray stdDeviationsExtrinsics  9.OutputArray perViewErrors

    这些个参数是对这次标定结果的评价,值越小代表你标定的越好。

    10. int flags = 0,

    flags这个参数一般都设成0了,技巧也就在这里。按说一般要精密标定,一般都要标定好几次。控制一些置信度较高的参数不变,然后解算其他的。如果畸变参数选用过的不是5参数模型,则这个设置参考函数解释。

    11.TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON)

    这个设置是一个计算迭代的设置,一般不改变。如果高精度标定,也要好好研究一下,第一个参数是类型就是计算迭代的终止条件,第二个是迭代次数,第三个是设置的阈值。默认的意思是迭代终止条件看后面的两个参数,最大迭代次数30,最小阈值是DBL_EPSILON。

    标定函数技术细节如此,如有见解欢迎讨论,个人目前研究方向精密视觉测量!

    参考如下:

    / ** @brief从校准图案的多个视图中查找相机的内部和外部参数。

    @param objectPoints在新界面中,它是校准模式点矢量的矢量
    校准模式坐标空间(例如std :: vector <std :: vector <cv :: Vec3f >>)。外面的
    vector包含与模式视图的数量一样多的元素。如果校准模式相同
    在每个视图中显示并且它是完全可见的,所有向量将是相同的。虽然如此
    可以使用部分遮挡的图案,甚至不同视图中的不同图案。然后,
    向量将是不同的。这些点是3D,但由于它们处于图案坐标系中,
    那么,如果钻机是平面的,那么将模型放到XY坐标平面上是有意义的
    每个输入对象点的Z坐标为0。
    在旧界面中,来自不同视图的对象点的所有向量被连接
    一起。
    @param imagePoints在新界面中,它是校准投影向量的向量
    模式点(例如std :: vector <std :: vector <cv :: Vec2f >>)。 imagePoints.size()和
    objectPoints.size()和imagePoints [i] .size()必须等于每个i的objectPoints [i] .size()。
    在旧界面中,来自不同视图的对象点的所有向量被连接
    一起。
    @param imageSize仅用于初始化内在相机矩阵的图像大小。
    @param cameraMatrix输出3x3浮点相机矩阵
    \ f $ A = \ vecthreethree {f_x} {0} {c_x} {0} {f_y} {c_y} {0} {0} {1} \ f $。如果CV \ _CALIB \ _USE \ _INTRINSIC \ _GUESS
    和/或CV_CALIB_FIX_ASPECT_RATIO被指定,fx,fy,cx,cy中的部分或全部必须是
    在调用函数之前初始化。
    @param distCoeffs失真系数的输出向量
    \ f $(k_1,k_2,p_1,p_2 [,k_3 [,k_4,k_5,k_6 [,s_1,s_2,s_3,s_4 [,\ tau_x,\ tau_y]]]])\ f $ of
    4,5,8,12或14个元素。
    @param rvecs为每个模式视图估计的旋转矢量的输出矢量(参见Rodrigues)
    (例如std :: vector <cv :: Mat >>)。也就是说,每个第k个旋转矢量与相应的一起
    第k个平移向量(参见下一个输出参数描述)带来校准模式
    从模型坐标空间(指定了对象点)到世界坐标
    空间,即第k个模式视图中校准图案的实际位置(k = 0 .. * M * -1)。
    @param tvecs为每个模式视图估计的平移向量的输出向量。
    @param stdDeviationsIntrinsics为内在参数估算的标准差的输出向量。
     偏差值的顺序:
    \ f $(f_x,f_y,c_x,c_y,k_1,k_2,p_1,p_2,k_3,k_4,k_5,k_6,s_1,s_2,s_3,
     s_4,\ tau_x,\ tau_y)\ f $如果没有估计其中一个参数,它的偏差等于零。
    @param stdDeviationsExtrinsics对外部参数估计的标准差的输出向量。
     偏差值的顺序:\ f $(R_1,T_1,\ dotsc,R_M,T_M)\ f $其中M是模式视图的数量,
     \ f $ R_i,T_i \ f $连接1x3向量。
     @param perViewErrors为每个模式视图估计的RMS重新投影误差的输出向量。
    @param flags可能为零的不同标志或以下值的组合:
     -  ** CV_CALIB_USE_INTRINSIC_GUESS ** cameraMatrix包含有效的初始值
    fx,fy,cx,cy进一步优化。否则,(cx,cy)最初设置为图像
    中心(使用imageSize),并以最小二乘方式计算焦距。
    注意,如果已知内部参数,则不需要仅使用此函数
    估计外在参数。请改用solvePnP。
     -  ** CV_CALIB_FIX_PRINCIPAL_POINT **全局期间主要点未更改
    优化。它停留在中心或指定的不同位置
    CV_CALIB_USE_INTRINSIC_GUESS也已设置。
     -  ** CV_CALIB_FIX_ASPECT_RATIO **函数仅将fy视为自由参数。该
    比率fx / fy保持与输入cameraMatrix相同。什么时候
    未设置CV_CALIB_USE_INTRINSIC_GUESS,fx和fy的实际输入值为
    忽略,只计算它们的比率并进一步使用。
     -  ** CV_CALIB_ZERO_TANGENT_DIST **设置切向失真系数\ f $(p_1,p_2)\ f $
    为零并保持为零。
     -  ** CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6 **相应的径向失真
    优化期间系数不变。如果CV_CALIB_USE_INTRINSIC_GUESS是
    设置,使用提供的distCoeffs矩阵的系数。否则,它被设置为0。
     -  ** CV_CALIB_RATIONAL_MODEL **启用系数k4,k5和k6。提供
    向后兼容性,应该明确指定这个额外的标志来制作
    校准函数使用有理模型并返回8个系数。如果标志不是
    设置,该函数仅计算并返回5个失真系数。
     -  ** CALIB_THIN_PRISM_MODEL **启用系数s1,s2,s3和s4。

    为了提供向后兼容性,应该明确指定这个额外的标志来制作
    校准功能使用薄棱镜模型并返回12个系数。如果标志不是
    设置,该函数仅计算并返回5个失真系数。
     -  ** CALIB_FIX_S1_S2_S3_S4 **薄棱镜失真系数在此期间不会改变
    优化。如果设置了CV_CALIB_USE_INTRINSIC_GUESS,则系数来自
    提供了distCoeffs矩阵。否则,它被设置为0。
     -  ** CALIB_TILTED_MODEL **系数tauX和tauY已启用。提供
    向后兼容性,应该明确指定这个额外的标志来制作
    校准功能使用倾斜传感器模型并返回14个系数。如果标志不是
    设置,该函数仅计算并返回5个失真系数。
     -  ** CALIB_FIX_TAUX_TAUY **倾斜传感器模型的系数在此期间不会改变
    优化。如果设置了CV_CALIB_USE_INTRINSIC_GUESS,则系数来自
    提供了distCoeffs矩阵。否则,它被设置为0。
    @param criteria迭代优化算法的终止标准。

    该函数估计两个制作立体声对的相机之间的转换。如果你有一个立体声
    摄像机,两个摄像机的相对位置和方向是固定的,如果你计算
    相对于第一相机和第二相机(R1,T1)和(R2,T2)的物体姿势,
    分别(这可以用solvePnP完成),那些姿势肯定是彼此相关的。
    这意味着,给定(\ f $ R_1 \ f $,\ f $ T_1 \ f $),应该可以计算(\ f $ R_2 \ f $,\ f $ T_2 \ f $)。只有你
    需要知道第二台摄像机相对于第一台摄像机的位置和方向。这是
    所述功能的作用。它计算(\ f $ R \ f $,\ f $ T \ f $),以便:

    \ F [R_2 = R * R_1
    T_2 = R * T_1 + T,\ f]

    可选地,它计算基本矩阵E:

    \ f [E = \ vecthreethree {0} { -  T_2} {T_1} {T_2} {0} { -  T_0} { -  T_1} {T_0} {0} * R \ f]

    其中\ f $ T_i \ f $是翻译向量的组成部分\ f $ T \ f $:\ f $ T = [T_0,T_1,T_2] ^ T \ f $。而且功能
    也可以计算基本矩阵F:

    \ f [F = cameraMatrix2 ^ { -  T} E cameraMatrix1 ^ { -  1} \ f]

    除了立体声相关信息,该功能还可以执行每个的完整校准
    两个相机。但是,由于参数空间的高维度和输入中的噪声
    数据,该功能可以偏离正确的解决方案。如果内在参数可以
    每个摄像机单独估算高精度(例如,使用
    calibrateCamera),建议您这样做,然后将CV_CALIB_FIX_INTRINSIC标志传递给
    函数以及计算的内部参数。否则,如果所有参数都是
    一次估计,限制一些参数是有意义的,例如,通过
    CV_CALIB_SAME_FOCAL_LENGTH和CV_CALIB_ZERO_TANGENT_DIST标志,通常是
    合理的假设。

    与calibrateCamera类似,该功能最大限度地减少了所有的重新投影误差
    指向两个摄像头的所有可用视图。该函数返回的最终值
    重新投影错误。
     * /

     

    展开全文
  • 双目立体视觉是一门有着广阔应用前景的学科,根据双目立体视觉CCAS提供的思路及组成原理,随着光学、电子...双目视觉三维定位原理双目立体视觉三维测量是基于视差原理。其中基线距B=两摄像机的投影中心连线的距离;...
  • 针对当前基于单目视觉的室内移动机器人全局定位算法复杂度大等问题,提出一种室内移动机器人双目视觉全局定位方法。...通过实验和分析验证了所提方法的可行性和有效性,为室内移动机器人全局视觉定位提供一种新的思路。
  • 本文根据水下机器人视觉系统“水下应用”...机器人视觉系统的整体配置及控制方法,对水下双目视觉定位系统的硬件结构、水下标定方法、水下图像处理及定位算法进行研究,并通过水下定位试验研究对该系统的精度进行分析。
  • 具有精确、稳定的定位结果以及合理的价格是未来的...利用实验车在一处复杂环境区域进行实时数据采集,通过计算出的双目视觉定位误差与GNSS定位误差对比分析,验证了该方法在路标可见范围内对GNSS定位结果有明显改善。
  • 文基于立体视觉测量原理提出了一种基于双目视觉的车轮定位参数测量原理。论文的主要工作如下:首先研究了车轮定位参数视觉测量的原理,分析了车轮定位参数对汽车性能的影响,研究了双目立体视觉测量的方法和视觉系统...
  • 给出一种双目视觉系统的目标识别与定位方法,采用SURF特征实现目标识别的方法,利用双目视觉的原理求取识别出的目标物体的三维坐标信息,从而实现目标物体的识别与定位,与传统的基于SIFT(Scale Invariant Feature ...
  • 为提高矿井机车定位系统的稳定性,提出利用双目视觉技术实现机车定位的方法。由巷道顶部设置的标志牌外层红色特征确定2幅图像的感兴趣区域,提取该区域内各层正方形边界的拐角获得特征点,通过相应计算实现机车的定位。...
  • 设计一个基于尺寸不变特征变换SIFT特征提取算子的双目相对定位定向系统,可解决极端环境下一般导航系统无法准确定位定向的问题。实现过程采用2个相对位置固定的相机,利用SIFT 特征点尺度及旋转不变的性质精确匹配...
  • 基于角点特征的双目视觉杂草定位系统研究 角点特征
  • 双目视觉系统已经被广泛应用在很多领域,但其定位精度仍难以满足工业要求。为了进一步提高它的精度,可以限制一些参数,使参数在这些范围内可以达到最佳精度。现在需要做的便是找到这些参数,并分析每一个参数和可能...
  • 平行双目视觉系统的定位误差补偿,樊海风,王见,测量精度在平行双目视觉系统的应用中非常重要,为了提高测量系统的精度,提出了基于改进的BP神经网络的误差补偿策略。采用不同位�
  • 为帮助上肢活动不便的老人、残疾人完成自主进食等行为,开发了一套基于双目视觉的助老助残机器人定位系统。通过蓝色激光引导实现对双目相机视野范围内任意物体的定位。采用多自由度助老助残机器人和Bumblebee2立体...
  • 基于双目立体视觉的目标定位
  • 机器人双目视觉系统的标定与定位算法,论文下载
  • 为提高番茄采摘机器人视觉系统的定位精度,该文提出了一种基于组合匹配方法及深度校正模型的双目立体视觉测距方法。该方法在形心匹配的基础上,将形心匹配得到的视差值作为区域匹配时设定视差范围的参考值。这样可以...
  • 最后结合双目视觉的视差信息和标定模型对目标进行定位,引入视差置信区间判据可有效减少噪声影响,提高运动目标定位精度.实验表明本文所提的基于序贯检测机制的目标跟踪方法在摄像机运动一目标运动模式下,在目标有尺度...
  • 在研究红外图像序列的弱点动目标粒子滤波跟踪算法和双目立体视觉摄像机标定算法的基础上,基于双目视觉设计了双目图像序列弱点动目标的跟踪、空间定位系统。仿真实验表明:对粒子基于估计参数后的密度函数分配权重的...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 248
精华内容 99
关键字:

双目视觉定位