精华内容
下载资源
问答
  • 而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,可以用以测量、三维重建、以及虚拟视点的合成等。 之前有两篇博客简要讲过OpenCV3.4中的两种立体匹配算法效果比较。以及利用视差图合成...

    双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,可以用以测量、三维重建、以及虚拟视点的合成等。

      之前有两篇博客简要讲过OpenCV3.4中的两种立体匹配算法效果比较。以及利用视差图合成新视点。里面用到的匹配图像对是OpenCV自带校正好的图像对。而目前大多数立体匹配算法使用的都是标准测试平台提供的标准图像对,比如著名的有如下两个:  MiddleBury

      KITTI

      但是对于想自己尝试拍摄双目图片进行立体匹配获取深度图,进行三维重建等操作的童鞋来讲,要做的工作是比使用校正好的标准测试图像对要多的。因此博主觉得有必要从用双目相机拍摄图像开始,捋一捋这整个流程。

      主要分四个部分讲解:

    • 摄像机标定(包括内参和外参)
    • 双目图像的校正(包括畸变校正和立体校正)
    • 立体匹配算法获取视差图,以及深度图
    • 利用视差图,或者深度图进行虚拟视点的合成

      注:如果没有双目相机,可以使用单个相机平行移动拍摄,外参可以通过摄像机自标定算出。我用自己的手机拍摄,拍摄移动时尽量保证平行移动。

    一、摄像机标定

      1.内参标定

      摄像机内参反映的是摄像机坐标系到图像坐标系之间的投影关系。摄像机内参的标定使用张正友标定法,简单易操作,具体原理请拜读张正友的大作《A Flexible New Technique for Camera Calibration》。当然网上也会有很多资料可供查阅,MATLAB 有专门的摄像机标定工具包,OpenCV封装好的摄像机标定API等。使用OpenCV进行摄像机标定的可以参考我的第一篇博客:http://www.cnblogs.com/riddick/p/6696858.html。里面提供有张正友标定法OpenCV实现的源代码git地址,仅供参考。

      摄像机的内参包括,fx, fy, cx, cy,以及畸变系数[k1,k2,p1,p2,k3],详细就不赘述。我用手机对着电脑拍摄各个角度的棋盘格图像,棋盘格图像如图所示:

    98bdbccb3993e761b0354bf691832374.png

      使用OpenCV3.4+VS2015对手机进行内参标定。标定结果如下,手机镜头不是鱼眼镜头,因此使用普通相机模型标定即可:

    91cac5a82298b0f692dea66cea46bd37.png

      图像分辨率为:3968 x 2976。上面标定结果顺序依次为fx, fy, cx, cy, k1, k2, p1, p2, k3, 保存到文件中供后续使用。

      2.外参标定

      摄像机外参反映的是摄像机坐标系和世界坐标系之间的旋转R和平移T关系。如果两个相机的内参均已知,并且知道各自与世界坐标系之间的R1、T1和R2,T2,就可以算出这两个相机之间的Rotation和Translation,也就找到了从一个相机坐标系到另一个相机坐标系之间的位置转换关系。摄像机外参标定也可以使用标定板,只是保证左、右两个相机同时拍摄同一个标定板的图像。外参一旦标定好,两个相机的结构就要保持固定,否则外参就会发生变化,需要重新进行外参标定。

      那么手机怎么保证拍摄同一个标定板图像并能够保持相对位置不变,这个是很难做到的,因为后续用来拍摄实际测试图像时,手机的位置肯定会发生变化。因此我使用外参自标定的方法,在拍摄实际场景的两张图像时,进行摄像机的外参自标定,从而获取当时两个摄像机位置之间的Rotation和Translation。

      比如:我拍摄这样两幅图像,以后用来进行立体匹配和虚拟视点合成的实验。

    9f4ce23786c22257918ab6715b091f7d.png

    ① 利用摄像机内参进行畸变校正,手机的畸变程度都很小,校正后的两幅图如下:

    c3bbcd6bfec1726cf00fea02be869a21.png

     ② 将上面两幅畸变校正后的图作为输入,使用OpenCV中的光流法提取匹配特征点对,pts1和pts2,在图像中画出如下:

    605e46087f4d477ae063a348dc29522c.png

    ③ 利用特征点对pts1和pts2,以及内参矩阵camK,解算出本质矩阵E:

        cv::Mat E = cv::findEssentialMat(tmpPts1, tmpPts2,
    camK, CV_RANSAC);

      ④ 利用本质矩阵E解算出两个摄像机之间的Rotation和Translation,也就是两个摄像机之间的外参。以下是OpenCV中API函数实现的,具体请参见API文档:

        cv::Mat R1, R2;    cv::decomposeEssentialMat(E, R1, R2, t);    R = R1.clone();    t = -t.clone();

    二、双目图像的校正

     1. 畸变校正

      畸变校正前面已经介绍过,利用畸变系数进行畸变校正即可,下面说一下立体校正。

      2. 立体校正

      ① 得到两个摄像机之间的 Rotation和Translation之后,要用下面的API对两幅图像进行立体对极线校正,这就需要算出两个相机做对极线校正需要的R和T,用R1,T1, R2, T2表示,以及透视投影矩阵P1,P2:

    cv::stereoRectify(camK, D, camK, D, imgL.size(), R, -R*t,
      R1, R2, P1, P2, Q);

      ② 得到上述参数后,就可以使用下面的API进行对极线校正操作了,并将校正结果保存到本地:

    cv::initUndistortRectifyMap(P1(cv::Rect(0, 0, 3, 3)), D, R1, P1(cv::Rect(0, 0, 3, 3)), imgL.size(), CV_32FC1, mapx, mapy);    cv::remap(imgL, recImgL, mapx, mapy, CV_INTER_LINEAR);    cv::imwrite("data/recConyL.png", recImgL);    cv::initUndistortRectifyMap(P2(cv::Rect(0, 0, 3, 3)), D, R2, P2(cv::Rect(0, 0, 3, 3)), imgL.size(), CV_32FC1, mapx, mapy);    cv::remap(imgR, recImgR, mapx, mapy, CV_INTER_LINEAR);    cv::imwrite("data/recConyR.png", recImgR);

    对极线校正结果如下所示,查看对极线校正结果是否准确,可以通过观察若干对应点是否在同一行上粗略估计得出:

    82d06aeb5c8c0fb689bfd2fc942cefcc.png

    三、立体匹配

      1. SGBM算法获取视差图

      立体校正后的左右两幅图像得到后,匹配点是在同一行上的,可以使用OpenCV中的BM算法或者SGBM算法计算视差图。由于SGBM算法的表现要远远优于BM算法,因此采用SGBM算法获取视差图。SGBM中的参数设置如下:

    int numberOfDisparities = ((imgSize.width / 8) + 15) & -16;    cv::Ptr<:stereosgbm> sgbm = cv::StereoSGBM::create(0, 16, 3);    sgbm->setPreFilterCap(32);    int SADWindowSize = 9;    int sgbmWinSize = SADWindowSize > 0 ? SADWindowSize: 3;    sgbm->setBlockSize(sgbmWinSize);    int cn = imgL.channels();    sgbm->setP1(8 * cn*sgbmWinSize*sgbmWinSize);    sgbm->setP2(32 * cn*sgbmWinSize*sgbmWinSize);    sgbm->setMinDisparity(0);    sgbm->setNumDisparities(numberOfDisparities);    sgbm->setUniquenessRatio(10);    sgbm->setSpeckleWindowSize(100);    sgbm->setSpeckleRange(32);    sgbm->setDisp12MaxDiff(1);    int alg = STEREO_SGBM;    if (alg == STEREO_HH)        sgbm->setMode(cv::StereoSGBM::MODE_HH);    else if (alg == STEREO_SGBM)        sgbm->setMode(cv::StereoSGBM::MODE_SGBM);    else if (alg == STEREO_3WAY)        sgbm->setMode(cv::StereoSGBM::MODE_SGBM_3WAY);    sgbm->compute(imgL, imgR, disp);

      默认计算出的是左视差图,如果需要计算右视差图,则将上面加粗的三条语句替换为下面前三条语句。由于视差值计算出来为负值,disp类型为16SC1,因此需要取绝对值,然后保存:

     sgbm->setMinDisparity(-numberOfDisparities);    sgbm->setNumDisparities(numberOfDisparities);    sgbm->compute(imgR, imgL, disp);    disp = abs(disp);

      SGBM算法得到的左、右视差图如下,左视差图的数据类型为CV_16UC1,右视差图的数据类型为CV_16SC1 (SGBM中视差图中不可靠的视差值设置为最小视差(mindisp-1)*16。因此在此例中,左视差图中不可靠视差值设置为-16,截断值为0;右视差图中不可靠视差值设置为(-numberOfDisparities-1)*16,取绝对值后为(numberOfDisparities+1)*16,所以两幅图会有较大差别):

    左视差图(不可靠视差值为0) 右视差图(不可靠视差值为 (numberOfDisparities+1)*16 )

    61269074ddc1e2d24bb0ec8e691bec5f.png

     如果将右视差图不可靠视差值也设置为0,则如下:

    4cd994c9d56315c0d3608f9f58fe1034.png

     至此,左视差图和右视差图遥相呼应。

      2. 视差图空洞填充

      视差图中视差值不可靠的视差大多数是由于遮挡引起,或者光照不均匀引起。既然牛逼如SGBM也觉得不可靠,那与其留着做个空洞,倒不如用附近可靠的视差值填充一下。

      空洞填充也有很多方法,在这里我检测出空洞区域,然后用附近可靠视差值的均值进行填充。填充后的视差图如下:

    填充后左视差图 填充后右视差图

    ce147de3bddce1bdd906422836d70f92.png

      3. 视差图转换为深度图

      视差的单位是像素(pixel),深度的单位往往是毫米(mm)表示。而根据平行双目视觉的几何关系(此处不再画图推导,很简单),可以得到下面的视差与深度的转换公式:

     depth = ( f * baseline) / disp

      上式中,depth表示深度图;f表示归一化的焦距,也就是内参中的fx;baseline是两个相机光心之间的距离,称作基线距离;disp是视差值。等式后面的均已知,深度值即可算出。

      在上面我们用SGBM算法获取了视差图,接下来转换为深度图,函数代码如下:

    /*函数作用:视差图转深度图输入:  dispMap ----视差图,8位单通道,CV_8UC1  K       ----内参矩阵,float类型输出:  depthMap ----深度图,16位无符号单通道,CV_16UC1*/void disp2Depth(cv::Mat dispMap, cv::Mat &depthMap, cv::Mat K){    int type = dispMap.type();    float fx = K.at(0, 0);    float fy = K.at(1, 1);    float cx = K.at(0, 2);    float cy = K.at(1, 2);    float baseline = 65; //基线距离65mm    if (type == CV_8U)    {        const float PI = 3.14159265358;        int height = dispMap.rows;        int width = dispMap.cols;        uchar* dispData = (uchar*)dispMap.data;        ushort* depthData = (ushort*)depthMap.data;        for (int i = 0; i < height; i++)        {            for (int j = 0; j < width; j++)            {                int id = i*width + j;                if (!dispData[id])  continue;  //防止0除                depthData[id] = ushort( (float)fx *baseline / ((float)dispData[id]) );            }        }    }    else    {        cout << "please confirm dispImg's type!" << endl;        cv::waitKey(0);    }}

      注:png的图像格式可以保存16位无符号精度,即保存范围为0-65535,如果是mm为单位,则最大能表示约65米的深度,足够了。

      上面代码中我设置深度图的精度为CV_16UC1,也就是ushort类型,将baseline设置为65mm,转换后保存为png格式即可。如果保存为jpg或者bmp等图像格式,会将数据截断为0-255。所以保存深度图,png格式是理想的选择。(如果不是为了获取精确的深度图,可以将baseline设置为1,这样获取的是相对深度图,深度值也是相对的深度值)

      转换后的深度图如下:

    左深度图 右深度图

    56f2b5209c214e732c166f62680f744a.png

    空洞填充后的深度图,如下:

    左深度图(空洞填充后) 右深度图(空洞填充后)

    8baf8536b06179362d1d523d7d866283.png

     视差图到深度图完成。

      注:视差图和深度图中均有计算不正确的点,此文意在介绍整个流程,不特别注重算法的优化,如有大神望不吝赐教。


    附:视差图和深度图的空洞填充

      步骤如下:

      ① 以视差图dispImg为例。计算图像的积分图integral,并保存对应积分图中每个积分值处所有累加的像素点个数n(空洞处的像素点不计入n中,因为空洞处像素值为0,对积分值没有任何作用,反而会平滑图像)。

      ② 采用多层次均值滤波。首先以一个较大的初始窗口去做均值滤波(积分图实现均值滤波就不多做介绍了,可以参考我之前的一篇博客),将大区域的空洞赋值。然后下次滤波时,将窗口尺寸缩小为原来的一半,利用原来的积分图再次滤波,给较小的空洞赋值(覆盖原来的值);依次类推,直至窗口大小变为3x3,此时停止滤波,得到最终结果。

      ③ 多层次滤波考虑的是对于初始较大的空洞区域,需要参考更多的邻域值,如果采用较小的滤波窗口,不能够完全填充,而如果全部采用较大的窗口,则图像会被严重平滑。因此根据空洞的大小,不断调整滤波窗口。先用大窗口给所有空洞赋值,然后利用逐渐变成小窗口滤波覆盖原来的值,这样既能保证空洞能被填充上,也能保证图像不会被过度平滑。

    空洞填充的函数代码如下,仅供参考

    1 void insertDepth32f(cv::Mat& depth) 2 { 3     const int width = depth.cols; 4     const int height = depth.rows; 5     float* data = (float*)depth.data; 6     cv::Mat integralMap = cv::Mat::zeros(height,width, CV_64F); 7     cv::Mat ptsMap = cv::Mat::zeros(height, width,CV_32S); 8     double* integral = (double*)integralMap.data; 9     int* ptsIntegral = (int*)ptsMap.data;10     memset(integral, 0, sizeof(double) * width * height);11     memset(ptsIntegral, 0, sizeof(int) * width * height);12     for (int i = 0; i < height; ++i)13     {14         int id1 = i * width;15         for (int j = 0; j < width; ++j)16         {17             int id2 = id1 + j;18             if (data[id2] > 1e-3)19             {20                 integral[id2] = data[id2];21                 ptsIntegral[id2] = 1;22             }23         }24     }25     // 积分区间26     for (int i = 0; i < height; ++i)27     {28         int id1 = i * width;29         for (int j = 1; j < width; ++j)30         {31             int id2 = id1 + j;32             integral[id2] += integral[id2 - 1];33             ptsIntegral[id2] += ptsIntegral[id2 - 1];34         }35     }36     for (int i = 1; i < height; ++i)37     {38         int id1 = i * width;39         for (int j = 0; j < width; ++j)40         {41             int id2 = id1 + j;42             integral[id2] += integral[id2 - width];43             ptsIntegral[id2] += ptsIntegral[id2 - width];44         }45     }46     int wnd;47     double dWnd = 2;48     while (dWnd > 1)49     {50         wnd = int(dWnd);51         dWnd /= 2;52         for (int i = 0; i < height; ++i)53         {54             int id1 = i * width;55             for (int j = 0; j < width; ++j)56             {57                 int id2 = id1 + j;58                 int left = j - wnd - 1;59                 int right = j + wnd;60                 int top = i - wnd - 1;61                 int bot = i + wnd;62                 left = max(0, left);63                 right = min(right, width - 1);64                 top = max(0, top);65                 bot = min(bot, height - 1);66                 int dx = right - left;67                 int dy = (bot - top) * width;68                 int idLeftTop = top * width + left;69                 int idRightTop = idLeftTop + dx;70                 int idLeftBot = idLeftTop + dy;71                 int idRightBot = idLeftBot + dx;72                 int ptsCnt = ptsIntegral[idRightBot]+ ptsIntegral[idLeftTop] - (ptsIntegral[idLeftBot] + ptsIntegral[idRightTop]);73                 double sumGray = integral[idRightBot] + integral[idLeftTop] - (integral[idLeftBot] + integral[idRightTop]);74                 if (ptsCnt <= 0)75                 {76                     continue;77                 }78                 data[id2] = float(sumGray / ptsCnt);79             }80         }81         int s = wnd / 2 * 2 + 1;82         if (s > 201)83         {84             s = 201;85         }86         cv::GaussianBlur(depth, depth, cv::Size(s, s), s, s);87     }88 }

    来源:博客园 作者:一度逍遥

    链接:https://www.cnblogs.com/riddick/p/8486223.html

    End

    声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

    展开全文
  • 双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,...

          立体匹配技术就是通过匹配两幅或者多幅图像来获得视差(disparity)图      

          通过立体匹配可以获得深度,进行深度估计

     

          立体匹配算法通常由四个部分组成,包括:匹配代价计算,代价聚合,视差计算和视差优化

     

          双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,可以用以测量、三维重建、以及虚拟视点的合成等。

     

          为了模拟人眼对立体场景的捕捉和对不同景物远近的识别能力,立体匹配算法要求采用两个摄像头代替人眼,通过获取两幅非常接近的图片以获取景深(视差:Disparity),从而计算出不同景物与摄像头的距离,得到景深图。

     

    视差图

          双目立体视觉融合两只眼睛获得的图像并观察它们之间的差别,使我们可以获得明显的深度感,建立特征间的对应关系,将同一空间物理点在不同图像中的映像点对应起来,这个差别,我们称作视差(Disparity)图像。

     

     

    双目图片进行立体匹配获取深度图,进行三维重建的步骤

        ①摄像机标定(包括内参和外参)

        ②双目图像的校正(包括畸变校正和立体校正)

        ③立体匹配算法获取视差图,以及深度图

        ④利用视差图,或者深度图进行虚拟视点的合成

     

     

    展开全文
  • 一、双目摄像头深度测量分析双目摄像头拍摄同一场景下左右两幅图像,运用立体匹配算法获取视差图,进而获取深度图。双目摄像头 SDK 中采用 SGBM 算法,由校正后的图像获取视差图视差图表示,空间物体在左视图中的...

    07b02d6dc0b95170f313a3795a4a5059.png

    一、双目摄像头深度测量分析

    双目摄像头拍摄同一场景下左右两幅图像,运用立体匹配算法获取视差图,进而获取深度图。

    双目摄像头 SDK 中采用 SGBM 算法,由校正后的图像获取视差图。视差图表示,空间物体在左视图中的成像点与在右视图中成像点在水平方向上的像素差,即下图中的 Xl - Xr。

    7c2526099e925edd364a3a1522340dc9.png
    图 1 双目视差一维原理图

    深度与视差转换关系:

    depth = (fx * baseline) / disparity

    小觅双目摄像头 SDK 中采用 reprojectImageTo3D 函数获取深度图。

    由此分析可知,当物体距离达到一定范围,前后移动的距离不足以在左右视图中产生一个像素以上的视差。在这样的区域内,双目摄像头无法分辨深度的变化,即深度值不随实际空间距离变化而变化。即连续的世界物理量经传感器量化后的客观表现。

    而这样的距离是多远且每一段不变化的范围有多长,由具体双目摄像头的参数决定。

    这里,小觅双目摄像头的参数为:

    焦距长度: 2.1 mm;

    像素尺寸: 6.0 x 6.0 μm;

    基线长度:120.0 mm。

    二、小觅双目摄像头标准版深度测量表现

    对小觅双目摄像头标准版进行了深度测量(基于 GPU 模式),并与理论值作比较:

    82a687b010486565141d22a4d6481904.png
    图 2 小觅双目摄像头标准版深度曲线

    可以看到实际测量曲线稍低于理论测量曲线。下图为实际测量时的一些样本值。

    9e8c705286ceba9ed54b4859350a1d40.png
    图 3 小觅双目摄像头标准版深度测量样本

    与理论值比较,对深度测量的误差统计:

    7dc0cccd8de8e1e30bb8c181e0130232.png
    图 4 小觅双目摄像头标准版深度误差

    今天就到这里啦,你们还有什么想看的文章主题可以留言在评论里哦!

    另外,全宇宙超级可爱的我们在招人,上拉勾查看职位详情~

    MYNTAI小觅智能招聘职位-拉勾网-专业的互联网招聘平台www.lagou.com
    1388b5f75deec3c30ff974391006d9ee.png
    展开全文
  • 先抛出双目视觉中最核心的公式 Z:深度信息,b:基线(即两个光心的距离),f:焦距,d:视差。假设条件:左右相机平行共面。推导公式的链接三角测量原理与双目视觉景深恢复_沈春旭的博客-CSDN博客​blog.csdn.net...

    1438f0bc3554dddfdf8b02c0f55a904e.png

    先抛出双目视觉中最核心的公式

    Z:深度信息,b:基线(即两个光心的距离),f:焦距,d:视差。

    假设条件:左右相机平行共面。

    推导公式的链接

    三角测量原理与双目视觉景深恢复_沈春旭的博客-CSDN博客blog.csdn.net
    44eb867cc835d1bfeb13663e587fda67.png

    这里提出一个问题,Z的单位是mm,b的单位是mm,f的单位是mm, d单位没有,这样单位上就不匹配,该怎么解释?,该怎么解释?其实这里面涉及到一个象元尺寸,即dx ,单位是um

    举个栗子,b = 130mm, f = 8mm, dx = 4.8um = 0.0048mm, d = 200,

    Z = 130*8/(0.0048*200) = 1083.33mm

    所以核心就是计算视差,科普性的介绍推荐下面这个

    https://mp.weixin.qq.com/s/J9ijn9UTob_6LwUHBtuoNgmp.weixin.qq.com

    其实opencv已经实现了整个系统,双目视觉测量系统主要包括

    一、图像采集

    二、双目标定(张正友标定法,算法成熟)

    三、立体校正(Bouguet算法, 算法成熟, matlab/opencv均是该算法)

    四、立体匹配(重点、创新点)

    五、三维重建(算法成熟)

    步骤输入输出
    双目标定左右相机同时拍摄的不同角度的棋盘格左右相机的内参,畸变系数以及右相机相对于左相机的旋转平移矩阵
    立体校正双目标定的输出左右相机拍摄的图像校正后的左右相机拍摄的图像函数stereoRectify输出矩阵Q
    立体匹配校正后的左右相机拍摄的图像按行匹配后得到的视差d
    三维重建函数stereoRectify输出矩阵Q按行匹配后得到的视差d3维点云

    这里先抛出坐标系的关系,参考链接

    【立体视觉】世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的关系_把岁月化成歌 留在博客-CSDN博客blog.csdn.net
    b866d35115d497f7f37786bacbe08d4c.png

    世界坐标系和相机坐标系,图像坐标系的关系_咸鱼半条-CSDN博客

    【立体视觉】世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的关系_把岁月化成歌 留在博客-CSDN博客blog.csdn.net
    b866d35115d497f7f37786bacbe08d4c.png
    https://blog.csdn.net/wgx571859177/article/details/79564522blog.csdn.net

    最常用的就是像素坐标系和相机坐标系的转换,下面以横轴方向为例(纵轴同理)简单推导下

    (公式a)

    (公式b)

    公式a表示像素坐标系与图像坐标系的转换关系,公式b表示图像坐标系与相机坐标系的转换关系,公式b代入公式a, 相机坐标系转到像素坐标系

    (公式c)

    公式a代入公式b, 像素坐标系转到相机坐标系

    (公式d)

    加深印象,可以推导下图像缩放之后相机内参变化

    椒盐蘑菇:图像缩放后相机内参如何变化的zhuanlan.zhihu.com
    138515472673f16b6f353ad5f0c1bf83.png

    接下来,推导下利用视差和Q计算点云,也就是系统第五步—三维重建

    562284a762958773f378f905f1098fd6.png
    opencv函数reprojectImageTo3D技术文档

    5a80d9445b6b549a25744bb2f7b565e9.png
    世界坐标的齐次方程

    1c65131b345dadbd90e968044c27b737.png

    齐次坐标(X,Y,Z,W)转换到非齐次坐标

    ,就可以获得点云坐标

    有了点云坐标,怎么重投影到2D图像呢?畸变系数如何带入?

    其实很简单,将点云坐标直接带入(公式c),就可以得到像素坐标。(没有考虑畸变)

    考虑畸变的话,,下图

    569d39e64776743246f7405ccc89d643.png
    世界坐标系转到像素坐标系

    参考链接

    相机标定之畸变矫正与反畸变计算 - 达达MFZ - 博客园www.cnblogs.com
    f56588b2ff34ab99dc490cf56895629c.png

    其他参考链接

    单目标定:从理论到OpenCV实践 - 查志强2018 - 博客园www.cnblogs.com
    c0c3903a55e34505aef62f3f8461796f.png
    相机标定--张正友棋盘格标定法_JennyBi的博客-CSDN博客_棋盘格标定blog.csdn.net
    cd8a0d66d0f054bed0c4f79fde9e4494.png
    展开全文
  • 采用颜色相似性的自适应窗口在参考视图与其他视图之间进行立体匹配,得到参考视图与其他视图之间的视差信息,利用视差与视图对之间的抽样距离满足正比函数关系的性质,对多个视差值进行函数拟合,减少了由于记录噪声...
  • 得到物体距相机平面的距离也就是“Z”,大概有三种方式,第一种就是先生成深度,之后点击深度上的某一点,获取该点的像素值(此时图片应该是IPL_depth_16s的格式,三通道)cn[0]就表示深度。由于各种原因,我用...
  • 双目测量原理详解

    2020-08-28 17:13:30
    所谓视差,就是指左右图像上的相同特征点在x坐标上的差值,即中的d,再看一张 红色矩形框内的是Pr点在左边成像平面上的相同位置点,则视差d就很明显了,就等于左边绿色线段与黄色线段之和,这段距离长度是Xl...
  • 而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,可以用以测量、三维重建、以及虚拟视点的合成等。 之前有两篇博客简要讲过OpenCV3.4中的两种立体匹配算法效果比较。以及利用视差图合成...
  • 双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,...
  •  双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,...
  • 击上方“新机器视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。...
  •  双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,...
  • 结合 高翔老师的著作《视觉...(左右的横坐标之差成为视差) RGB-D 相机模型;(红外结构光/飞行时间法测量像素距离) 二. 图像 计算机中图像的表示; 三. 实践:图像的存取与访问 安装 OpenCV;(源代码安...
  • 2.5 三维图像采集设备 三维重构基于两种基本原理:...  使用两台不同视角的摄像机采集同一场景时,距离摄像机某个距离的某个点会在会在两台摄像机图像上不同的位置成像。 基线:   三角形的已知边,即摄像机两个投.
  • 击上方“新机器视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。...
  • 2.5 三维图像采集设备三维重构基于两种基本原理:三角测量法和飞行时间测量法。...2.5.1 立体视觉传感器视差:使用两台不同视角的摄像机采集同一场景时,距离摄像机某个距离的某个点会在会在两台摄...
  • 通过对两幅图像视差的计算,直接对前方景物(图像所拍摄到的范围)进行距离测量。双目摄像头的原理与人眼相似。人眼能够感知物体的远近,是由于两只眼睛对同一个物体呈现的图像存在差异,也称“视差”。物体距离越远...
  • 双目立体视觉测距.zip

    2019-05-29 06:05:37
    C#,双目测距,检测空间中指定的一个点的距离. 通过对两幅图像视差的计算,直接对前方景物(图像所拍摄到的范围)进行距离测量.
  • 双目测距原理

    2021-01-19 21:19:33
    通过对两幅图像视差的计算,直接对前方景物(图像所拍摄到的范围)进行距离测量,而无需判断前方出现的是什么类型的障碍物。所以对于任何类型的障碍物,都能根据距离信息的变化,进行必要的预警或制动。双目摄像头的...
  • 双目立体匹配流程详解

    万次阅读 多人点赞 2018-08-16 13:14:25
     双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图。而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,...
  • 大致解决方案:使用单目相机,通过移动相机之后进行三角化测量像素的距离。使用双目相机,利用左右目的视差计算像素的距离(多目原理相同)。使用RGB-D相机直接获得像素距离。前两种方式称为立体视觉(Stereo Vision...
  • 文章目录人与机器的视觉被动双目主动双目小觅智能双目产品介绍 人与机器的视觉 人的视觉: ...被动双目测量的深度可以很大,甚至是星星和我们的距离(不同位置看星星,然后计算时差),关键在于基线距离,1
  • 一.初识SLAM 1.单目相机局限性:平移之后才能计算深度以及无法确定真实尺度... 局限性:深度量程和精度受基线和分辨率限制,视差计算量大非常耗资源(主要问题),需GPU和FPGA加速才能实时输出 图像距离信息。 深度...
  • 单目、双目及深度相机比较

    万次阅读 2019-01-10 21:11:11
    通过相机的运动形成视差,可以测量物体相对深度。但是单目SLAM估计的轨迹和地图将与真实的轨迹和地图相差一个因子,也就是尺度(scale),单凭图像无法确定这个真实尺度,所以称尺度不确定性。 2.stereo 优点: ...
  • 理论足够了,现在讨论算法问题描述输入输出算法去畸变、校正视差图计算Block-Matching算法特征检测特征描述和特征匹配3D点云三角测量内部检测计算R和t结果验证一个重要的“程序”备注 什么是里程计 你见过汽车仪表盘...
  • ch4:李群和李代数 群满足这些性质:封结幺逆 4.1小结 4.2小结 4.3小结 Sophus库的使用 安装和编译了Sophus库 然后CMakeLists.txt里...通过飞行时间法(Time-of-flight, ToF)原理测量像素距离的 OpenCV的使用 安装
  • 在传统双目立体视觉传感器的基础上,对基于平面镜成像的单摄像机立体视觉传感器进行了研究。在电荷耦合器件(CCD)摄像机前放置一...实验结果表明,该测量方案方便有效,结构简单,调节方便,尤其适合近距离高精度测量
  • 双目视觉书籍

    2017-10-31 19:42:10
    双目立体视觉融合两只眼睛获得的图像并观察它们之间的差别,使我们可以获得明显的深度感,建立特征间的对应关系,将同一空间物理点在不同图像中的映像点对应起来,这个差别,我们称作视差(Disparity)图像。...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

视差图测量距离