精华内容
下载资源
问答
  • 针对用非平行双目视觉系统进行水下拍摄测量时,由于折射所导致的测量误差较大、精度不高的问题,建立了基于折射光路的水下双目视觉系统测量模型,并以Agrawal方法为基础,在已知两摄像机相对位置关系的前提下,对该测量...
  • 本文介绍了基于DM642的机器人双目视觉系统设计方法。
  • 针对双目视觉系统测量精度的问题,本文提出并建立了双目视觉系统误差分析模型,分析了摄像机标定精度、镜头参数及系统结构参数对系统测量精度的影响,并结合实验证明了理论的正确性。
  • 平行双目视觉系统的定位误差补偿,樊海风,王见,测量精度在平行双目视觉系统的应用中非常重要,为了提高测量系统的精度,提出了基于改进的BP神经网络的误差补偿策略。采用不同位�
  • 双目视觉系统的搭建(一) 1.相机的标定 在搭建双目视觉系统之前首要的工作是进行相机的标定,相机的标定主要是有

    双目视觉系统的搭建(一)

    1.相机的标定

    1.1棋盘格的拍摄

    在搭建双目视觉系统之前首要的工作是进行相机的标定。目前常用的标定方法是棋盘格标定。棋盘格的大小设置为7*5.从不同角度拍摄多张棋盘格照片,本文拍摄了14张。
    #注:由于COVID-19,目前采用手机来代替工业相机拍摄棋盘格。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.2 标定过程

    for image_path in tqdm(calibration_paths):
    
    	#Load image
    	image = cv2.imread(image_path)
    	print(image_path)
    	gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    	print("Image loaded, Analizying...")
    	#find chessboard corners
    	ret,corners = cv2.findChessboardCorners(gray_image, chessboard_size, None)
    
    	if ret == True:
    		print("Chessboard detected!")
    		print(image_path)
    		#define criteria for subpixel accuracy
    		criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    		#refine corner location (to subpixel accuracy) based on criteria.
    		cv2.cornerSubPix(gray_image, corners, (5,5), (-1,-1), criteria)
    		obj_points.append(objp)
    		img_points.append(corners)
    
    #Calibrate camera
    ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points,gray_image.shape[::-1], None, None
    

    这里的核心就是下述代码,这里调用了Opencv中寻找棋盘格角的函数以及标定函数

    ret,corners = cv2.findChessboardCorners(gray_image, chessboard_size, None)
    
    ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points,gray_image.shape[::-1], None, None)
    

    opencv2中的calibratecamera其实是按照如下原理:
    原理

    式中

    (X, Y, Z) are the coordinates of a 3D point in the world coordinate space
    (u, v) are the coordinates of the projection point in pixels
    A is a camera matrix, or a matrix of intrinsic parameters
    (cx, cy) is a principal point that is usually at the image center
    fx, fy are the focal lengths expressed in pixel units.
    

    运行过程·:

    运行结果

    运行结果:

    返回结果中k为相机的内存矩阵,为:在这里插入图片描述

    相机参数 ,fx,fy是归一化后的焦距,u0和v0则表示的是光学中心,即摄像机光轴与图像平面的交点,通常位于图像中心处,故其值常取分辨率的一半
    fx、fy、u0、v0只与摄像机内部参数有关,故称矩阵k为内参数矩阵

    运行结果
    在这里插入图片描述

    展开全文
  • BumbleBee2 双目视觉系统简介.pdf 欢迎大家下载
  • 双目立体视觉系统一般由双摄像机从不同角度同时获得被测物的两幅数字图像,或由单摄像机在不同时刻从不同角度获得被测物的两幅数字图像,并基于视差原理恢复出物体的三维几何信息,重建物体三维轮廓及位置。双目立体...

    双目立体视觉是机器视觉的一种重要形式,它是基于视差原理并由多幅图像获取物体三维几何信息的方法。双目立体视觉系统一般由双摄像机从不同角度同时获得被测物的两幅数字图像,或由单摄像机在不同时刻从不同角度获得被测物的两幅数字图像,并基于视差原理恢复出物体的三维几何信息,重建物体三维轮廓及位置。

    e7c5cc4960b7c9442600fb99dcf340a4.png

    双目立体视觉原理

    双目立体视觉三维测量是基于视差原理,下图所示为简单的平视双目立体成像原理图,两摄像机的投影中心的连线的距离,即基线距为b。摄像机坐标系的原点在摄像机镜头的光心处,坐标系如图所示。

    99fecf1f8cdd17588708c3fb18483ae3.png

    事实上左右成像平面绘制在镜头的光心前f处,这个虚拟的图像平面坐标系O1uv的u轴和v轴与和摄像机坐标系的x轴和y轴方向一致。左右图像坐标系的原点在摄像机光轴与平面的交点O1和O2。空间中某点P在左图像和右图像中相应的坐标分别为P1(u1,v1)和P2(u2,v2)。

    ae65ba952d49e63dae17b3cf3f2de676.png

    假定两摄像机的图像在同一个平面上,则点P图像坐标的Y坐标相同,即v1=v2。由三角几何关系得到:

    6fcf0d5082ad71363a8f4e236b5cb5a9.png

    由此可计算出空间中某点P在左摄像机坐标系中的坐标为:

    b390fa8dfe64f1e40ac89eda59057024.png

    因此,只要能够找到空间中某点在左右两个摄像机像面上的相应点,并且通过摄像机标定获得摄像机的内外参数,就可以确定这个点的三维坐标。

    54f34dd37ea3c562a34f8c2ba94d74a0.png

    双目立体视觉的系统结构以及精度分析

    立体视觉系统的一般结构采用交叉摆放的两个摄像机从不同角度观测同一被测物体。也可以由一个摄像机实现,如一个摄像机通过给定方式的运动,在不同位置观测同一个静止的物体,或者通过光学成像方式将两幅图像投影到一个摄像机,都可以满足精度要求。

    15e0a1e3f2d005b6a83c096a7f1e91f1.png

    各种双目视觉系统结构各有优缺点,这些结构适用于不同的应用场合。对要求大测量范围和较高测量精度的场合,采用基于双摄像机的双目立体视觉系统比较合适;对测量范围要求比较小,对视觉系统体积和质量要求严格,需要高速度实时测量对象,基于光学成像的单摄像机双目立体视觉系统便成为最佳选择。

    0502e545235c79121ed7515e74769fbe.png

    为了得到更高的精度,应该使摄像机的焦距以及基线长度增大,同时应该使被测物体尽可能的靠近立体视觉系统。另外这个精度和视差的精度有直接的关系,无论在任何情况下,要确保立体图像对之间的交迭区域足够大并且两个摄像机应该大约对齐,也就是说每个摄像机绕光轴旋转的角度不能太大。

    aab13e5c3c371929919c5db235a2efe1.png

    在进行双目视觉系统标定以及应用该系统进行测量时,要确保摄像机的内参和两个摄像机相对位置关系不能够发生变化,如果任何一项发生变化,则需要重新对双目立体视觉系统进行标定。否则,将影响测量结果的精度。

    1f7f9f0758279cc504f917d6763103bf.png

    双目立体视觉系统标定

    摄像机内参数的标定和单目视觉系统标定一致,双目立体视觉系统的标定主要是指摄像机的内部参数标定后确定视觉系统的结构参数R和T(即两个摄像机之间的位置关系,R和T分别为旋转矩阵和平移向量)。

    b82af5ad17ad7450915bba815b8f985a.png

    具体的标定过程:

    1、将标定板放置在适当的位置,使它能够在两个摄像机中均可以完全成像。通过标定确定两个摄像机的内部参数以及他们的外部参数(R1、T1与R2、T2),则R1、T1表示左摄像机与世界坐标系的相对位置,R2、T2表示右摄像机与世界坐标系的相对位置。

    c1235a4e4d70e79d9fb212fcb065cd2d.png

    2、假定空间中任意一点在世界坐标系、左摄像机坐标系和右摄像机坐标系下的非齐次坐标分别为xw、x1、x2,则:

    9ce235acfc590b3cfaa7faabe9c2b632.png

    双目立体视觉的对应点匹配

    由双目立体视觉系统原理可以看出双目立体视觉是建立在对应点的视差基础之上,因此左右图像中各点的匹配关系成为双目立体视觉技术的一个极其重要的问题。然而,对于实际的立体图像对,求解对应问题极富挑战性,可以说是双目立体视觉中最困难的一步。

    cc4927e6df1ca7a73d11bb03702b9049.png

    为了能够增加匹配结果的准确性以及匹配算法的速度,在匹配过程中通常会加入下列几种约束:

    1、极线约束。在此约束下,匹配点已经位于两副图像中相应的极线上。

    2、唯一性约束。两副图像中的对应的匹配点应该有且仅有一个。

    3、视差连续性约束。除了遮挡区域和视差不连续区域外,视差的变化都是平滑的。

    4、顺序一致性约束。位于一副图像极线上的系列点,在另一幅图像中极线上有相同的顺序。

    ad7bcb899ac822b7e642a68b1807bc61.png
    展开全文
  • 双目视觉(一)双目视觉系统

    千次阅读 2019-09-20 10:46:24
    在单目视觉中,是无法确定一个物体的真实大小,它可能很大很远,可能很近很小,例如上图中,P点和Q点为真实世界的3维点,但是它们在相机平面上都投影到了同一个点,这也就无法确定一个物体的真实尺寸,也就是所谓的...

    系列文章:

    1. 双目视觉(一)双目视觉系统
    2. 双目视觉(二)双目匹配的困难和评判标准
    3. 双目视觉(三)立体匹配算法
    4. 双目视觉(四)匹配代价
    5. 双目视觉(五)立体匹配算法之动态规划全局匹配
    6. 双目视觉(六)U-V视差
    7. 【项目实战】利用U-V视差进行地面检测
    8. 【项目实践】U-V视差路面检测之动态规划

    1.说说单目相机

     

    在单目视觉中,是无法确定一个物体的真实大小,它可能很大很远,可能很近很小,例如上图中,P点和Q点为真实世界的3维点,但是它们在相机平面上都投影到了同一个点,这也就无法确定一个物体的真实尺寸,也就是所谓的失去了尺度信息。

    说到这里,有些读者会问啦:为什么非得用双目相机才能得到深度?我闭上一只眼只用一只眼来观察,也能知道哪个物体离我近哪个离我远啊!是不是说明单目相机也可以获得深度?

    在此解答一下:首先,确实人通过一只眼也可以获得一定的深度信息,不过这背后其实有一些容易忽略的因素在起作用:一是因为人本身对所处的世界是非常了解的(先验知识),因而对日常物品的大小是有一个基本预判的(从小到大多年的视觉训练),根据近大远小的常识确实可以推断出图像中什么离我们远什么离我们近;二是人在单眼观察物体的时候其实人眼是晃动的,相当于一个移动的单目相机,这类似于运动恢复结构(Structure from Motion, SfM)的原理,移动的单目相机通过比较多帧差异确实可以得到深度信息。

    但是实际上,相机毕竟不是人眼,它只会傻傻的按照人的操作拍照,不会学习和思考。下图从物理原理上展示了为什么单目相机不能测量深度值而双目可以的原因。我们看到红色线条上三个不同远近的黑色的点在下方相机上投影在同一个位置,因此单目相机无法分辨成的像到底是远的那个点还是近的那个点,但是它们在上方相机的投影却位于三个不同位置,因此通过两个相机的观察可以确定到底是哪一个点。

    2.如何确定尺度呢?

    由于通过单张图像无法获得像素的尺度信息,那么怎么办呢?办法是有的,我们可以通过获得不同视角的图像,然后通过三角测量(Triangulation)(或三角化) 的方法来估计地图点的深度。

    表示成我们熟悉的针孔相机模型:

     在上图中,我们知道相机的内部参数(K1,K2),已知匹配的点对(x1,x2),相机的位姿(R,T),求X。那么其实质就是:

    具体的推导: 

    1.通过针孔模型,我们知道单幅图像的投影方程,如果不了解相机模型,可以看这篇博客(针孔相机模型):

    2.多幅图像的投影方程组合在一起:

     3.将上面两式整理可以得到:

     3.最后采用最小二乘法求解X,Y,Z。

    代码实现:

    //************************************
    // Description: 根据左右相机中像素坐标求解空间坐标
    // Method:    uv2xyz
    // Parameter: Point2f uvLeft
    // Parameter: Point2f uvRight
    // Returns:   cv::Point3f
    //************************************
    cv::Point3d uv2xyz(cv::Point2d uvLeft,cv::Point2d uvRight,cv::Mat mLeftP,cv::Mat mRightP)
    {
        //     [u1]      [xw]                      [u2]      [xw]
        //zc1 *|v1| = Pl*[yw]                  zc2*|v2| = P2*[yw]
        //     [ 1]      [zw]                      [ 1]      [zw]
        //               [1 ]                                [1 ]
    
        //最小二乘法A矩阵
        cv::Mat A = cv::Mat(4,3,CV_64F);
        A.at<double>(0,0) = uvLeft.x * mLeftP.at<double>(2,0) - mLeftP.at<double>(0,0);
        A.at<double>(0,1) = uvLeft.x * mLeftP.at<double>(2,1) - mLeftP.at<double>(0,1);
        A.at<double>(0,2) = uvLeft.x * mLeftP.at<double>(2,2) - mLeftP.at<double>(0,2);
    
        A.at<double>(1,0) = uvLeft.y * mLeftP.at<double>(2,0) - mLeftP.at<double>(1,0);
        A.at<double>(1,1) = uvLeft.y * mLeftP.at<double>(2,1) - mLeftP.at<double>(1,1);
        A.at<double>(1,2) = uvLeft.y * mLeftP.at<double>(2,2) - mLeftP.at<double>(1,2);
    
        A.at<double>(2,0) = uvRight.x * mRightP.at<double>(2,0) - mRightP.at<double>(0,0);
        A.at<double>(2,1) = uvRight.x * mRightP.at<double>(2,1) - mRightP.at<double>(0,1);
        A.at<double>(2,2) = uvRight.x * mRightP.at<double>(2,2) - mRightP.at<double>(0,2);
    
        A.at<double>(3,0) = uvRight.y * mRightP.at<double>(2,0) - mRightP.at<double>(1,0);
        A.at<double>(3,1) = uvRight.y * mRightP.at<double>(2,1) - mRightP.at<double>(1,1);
        A.at<double>(3,2) = uvRight.y * mRightP.at<double>(2,2) - mRightP.at<double>(1,2);
    
        //最小二乘法B矩阵
        cv::Mat B = cv::Mat(4,1,CV_64F);
        B.at<double>(0,0) = mLeftP.at<double>(0,3) - uvLeft.x * mLeftP.at<double>(2,3);
        B.at<double>(1,0) = mLeftP.at<double>(1,3) - uvLeft.y * mLeftP.at<double>(2,3);
        B.at<double>(2,0) = mRightP.at<double>(0,3) - uvRight.x * mRightP.at<double>(2,3);
        B.at<double>(3,0) = mRightP.at<double>(1,3) - uvRight.y * mRightP.at<double>(2,3);
    
        cv::Mat XYZ = cv::Mat(3,1,CV_64F);
        //采用SVD最小二乘法求解XYZ
        cv::solve(A,B,XYZ,cv::DECOMP_SVD);
    
        //std::cout<<"空间坐标为 = "<<std::endl<<XYZ<<std::endl;
    
        //世界坐标系中坐标
        cv::Point3d world;
        world.x = XYZ.at<double>(0,0);
        world.y = XYZ.at<double>(1,0);
        world.z = XYZ.at<double>(2,0);
    
        return world;
    }

    3.双目相机

    上面讲了如何获得深度信息,一个相机可以通过获得不同视角的图像然后通过三角测量计算深度,那么我们也可以添加另外一个相机在不同的位置拍摄同一个点,这样就和同一个相机在不同视角获得多幅图像等价了。

     注:在左相机相机平面上的,投影到右相机平面为一条直线,这也就是极线约束,本质上是点和线的映射关系。

    如果能将左相机平面中的点,在右相机平面中找到其对应的点,我们就可以获得深度值,进一步计算出物体的3维点信息。

     我们知道了:两个相机可以同过三角测量获得三维信息,那么就直接这样计算了吗?其实也可以,不过为了简便,我们通常需要将两个相机平面矫正到同一水平上。因为在矫正后的双目相机,我们搜索对应的匹配点的搜索空间也从2维变成了1维

    首先来看看,未校正前的左右相机的两个平面,(左平面和右平面不在同一水平面上)

     再来看看,极线矫正之后的双目相机:两个相机平面位于同一水平面上。

    接下来我们来计算深度。

    对于矫正后的针孔相机模型(如下图),我们可以使用简单的相似三角形的原理,来计算其深度值。

     首先,对于第一个相机坐标。

    接下来,对于第二个相机坐标系。 

    •  这两个三角形如下:

    • X可以表达为:

    •  两个等式合并

    •  深度Z:

     

    • 首先,对于针孔相机模型,根据相似三角形原理可以得到如下:

    •  将上面的公式变换一下:

    •  当然,现在X'和Y‘的坐标系是在图像的正中间,而我们处理的图像的坐标系,相对于在图像正中间的坐标系,原点平移了 [cx,cy]T,也放缩了一定的倍数。

    •  那么左相机的三维点X,Y就可以计算:

    4.双目匹配

     现在已知双目相机的左图和右图,而且已知左图的点(红色)pl = (xl; yl),那么怎么在右图找到匹配点pr = (xr; yr)
    呢?

    step1:由于矫正后的双目相机的左图和右图的点,符合极线约束,即yr = yl,那么我们可以通过极线来缩减搜索区域。

     

     step2:在极线上我们如何去匹配,发现这个点是否是我们要找的点呢?

    我们可以通过扫描极线,比较右图中的块和左图中的块,找到和左图最相似的那个就OK了。

     step3:如何判断哪个块最相似呢?

    可以通过计算极线上的每个点匹配代价。

    step4:得到匹配点后,通过匹配点的坐标得到视差d,然后根据视差值d,焦距f,j基线b,进一步计算深度值d

    双目视觉系统:

     

    参考:

    https://www.cnblogs.com/zyly/p/9373991.html 

    展开全文
  • 研究论文-USB摄像头平行双目视觉系统在面积测量中的应用
  • BumbleBee2 双目视觉系统技术说明 pdf格式的,欢迎大家下载
  • 双目视觉系统 图像校正

    千次阅读 2015-11-24 14:39:41
    双目视觉系统图像校正代码 “` //s_intrinsic_matrixL 左相机内参矩阵 //s_distortion_coeffsL 左相机系数 //s_intrinsic_matrixR 右相机内参矩阵 //s_distortion_coeffsR 右相机系数 //s_steroR 右相机相对左...
    双目视觉系统图像校正代码

    //s_intrinsic_matrixL 左相机内参矩阵
    //s_distortion_coeffsL 左相机系数
    //s_intrinsic_matrixR 右相机内参矩阵
    //s_distortion_coeffsR 右相机系数
    //s_steroR 右相机相对左相机的旋转矩阵
    //s_steroT 右相机相对左相机的平移矩阵
    //s_imgSize 需要校正的图像的大小
    //s_imgL 需要校正的左图像
    //s_imgR 需要校正的右图像
    //s_reImgL 校正后的左图像
    //s_reImgR 校正后的右图像

    void CPreprocess::_RectifyImg()
    {
    cv::Mat R, T, R1, P1, R2, P2;
    R1 = cv::Mat::zeros(3,3,CV_8UC1);
    R2 = cv::Mat::zeros(3,3,CV_8UC1);
    P1 = cv::Mat::zeros(3,4,CV_8UC1);
    P2 = cv::Mat::zeros(3,4,CV_8UC1);
    cv::Rect roi1, roi2;
    //相机矫正
    try
    {
    cv::stereoRectify( s_intrinsic_matrixL, s_distortion_coeffsL,
    s_intrinsic_matrixR, s_distortion_coeffsR, s_imgSize,
    s_steroR, s_steroT, R1, R2, P1, P2, s_Q, cv::CALIB_ZERO_DISPARITY,
    -1, s_imgSize, &roi1, &roi2);
    }
    catch(…)
    {
    std::cout << “相机矫正错误:”<< std::endl;
    }

    //畸变校正
    cv::Mat map11, map12, map21, map22;
    initUndistortRectifyMap(s_intrinsic_matrixL, s_distortion_coeffsL, 
                        R1, P1, s_imgSize, CV_16SC2, map11, map12);
    initUndistortRectifyMap(s_intrinsic_matrixR, s_distortion_coeffsR,
                        R2, P2, s_imgSize, CV_16SC2, map21, map22);
    //图像几何变换
    remap(s_imgL, s_reImgL, map11, map12, cv::INTER_LINEAR);
    remap(s_imgR, s_reImgR, map21, map22, cv::INTER_LINEAR);
    //保存Q矩阵
    cv::FileStorage fs("s_Q.xml",CV_STORAGE_WRITE);  
    fs << "s_Q"<< s_Q;
    fs.release();
    

    }
    “`

    左图
    这里写图片描述
    右图
    这里写图片描述
    校正后的左图
    这里写图片描述
    校正后的右图
    这里写图片描述

    展开全文
  • P神经网络的双目视觉系统摄像机标定 P神经网络的双目视觉系统摄像机标定
  • 一种移动机器人双目视觉系统的三维重建算法及应用,万见清,霍伟,提出了一种用于移动机器人的双目立体视觉系统三维重建算法。首先对摄像机的等效焦距进行标定,并计算目标在单目图像中的偏转角。
  • 双目视觉系统已经被广泛应用在很多领域,但其定位精度仍难以满足工业要求。为了进一步提高它的精度,可以限制一些参数,使参数在这些范围内可以达到最佳精度。现在需要做的便是找到这些参数,并分析每一个参数和可能...
  • 机器人双目视觉系统的标定与定位算法,论文下载
  • 双目立体视觉系统引入到激光修复再制造机器人中,可以实现机器人对修复物体缺陷的自动识别,给出最佳修复路径和工艺参数。标定问题是视觉系统基本且关键的工作。将两个摄像机安装在机器人末端,随机器人一起移动,对二...
  • 双目视觉系统标定与匹配的研究与实现.pdf MATLAB,VC++ 图像获取、摄像机标 定、特征提取、立体匹配
  • 作为计算机视觉的一个重要分支,双目立体视觉可以用来获得三维场景的距离信息。 本篇文章是一篇实用性文章,用以了解双目摄像头的常见方案,所设计到的模块和具体的实现方法,主要涉及到了摄像头标定,图形采集以及...
  • 利用树莓派的USB功能,实现双目摄像头的数据采集。
  • 本文的主要研究内容是利用两幅以上的摄像机图像恢复出被拍摄物体的三维...基于OpenCV设计了视觉测距系统,采用基于二维平面模板法对摄像机进行标定,然后采用SAD算法实现了立体匹配功能,进而实现了目标物体的测距。
  • 双目立体视觉:https://blog.csdn.net/a6333230/article/details/88245102 张正友标定原理:https://www.jianshu.com/p/9d2fe4c2e3b7 1双目相机的畸变校正以及平行校正(极线校正)的入门问题总结 原文:...
  • 采用双目测量系统的架构,对两相机的公共区域使用双目的方法进行复现,同时分别将两个相机与投影仪组成两个单目测量系统,通过标定的统一可以将两者的世界坐标系统一到一个共同的基准上,利用单目的测量结果对双目测量的...
  • 针对水下非平行双目成像系统图像匹配时无法进行平行校正,并且不再满足空气中的极线约束条件这一问题,推导出一种适用于水下的极线约束模型。根据摄像机和防水罩间相对位置关系的不同,把水下双目成像方式分为平行...
  • 目标识别技术作为图像处理领域研究的一个重要分支,是利用计算机的自动分析和提取原始图像中的前景信息,也就是模糊识别、数据处理等理论,模仿人的视觉系统感知外部世界各种形状的一项技术。
  • 获取视差图和相机深度 视差图 有了上篇文章获得的相机标定参数后,就可以来进行视差图的获取了。 首先利用手机拍摄,分别在左右两个方向各平行拍摄一张图片,如下图所示: 其次,本文利用opencv2库中的SteroBM算法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 663
精华内容 265
关键字:

双目视觉系统