转载声明:该文不是原作,发表这篇文章只为记录。

————————————————
版权声明:本文为CSDN博主「RanchoLin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/RanchoLin/article/details/114702996

问题1:点云分层、断层

如果出现以上类似效果,PCL点云像是很多2d平面图像层叠出来的问题,首先给出结论:转换点云时使用的视差图格式不对
    以OpenCV-sgbm为例,先调sgbm中的参数、至视差图既平滑又少空洞。
    在阅读网上许多代码后发现,用于计算距离的视差图(CV_32F)和用于肉眼看的视差图(CV_8U)使用的格式不同,并且用于计算的视差图无需进行裁剪和归一化,这些只是为了显示的可读性和美观。所以,在对sgbm进行compute之后得到视差图disparity_sgbm,除以16得到用于计算的视差图disparity(除以16是因为每个像素值由一个16bit表示,其中低位的4位存储的是视差值得小数部分,所以真实视差值应该是该值除以16)。

 cv::Mat disparity_sgbm, disparity, disparityCV_8U;sgbm->compute(rectifyImageL, rectifyImageR, disparity_sgbm);disparity_sgbm.convertTo(disparity, CV_32F, 1.0 / 16.0f);     //用来测距

将compute后的视差图,转为8位,得到可视的视差图disparityCV_8U,可以作为sgbm调参的直观依据,没有后续的作用了。

 disparity_sgbm.convertTo(disparityCV_8U, CV_8U, 255 / (NumDisparities * 16.));   //用来调参直观参考imshow("disparityCV_8U",disparityCV_8U);

转换了正确的视差图格式之后,在计算点云时还要注意计算深度值的取点语句,数据类型也要对应好。

 ……for (int i = 0; i < disparity.rows; i++){for (int j = 0; j < disparity.cols; j++) {PointXYZRGB p;double d = disparity.ptr<float>(i)[j];  //注意数据类型……

ok,关于点云分层、深度不连续的问题就解决啦,附上以上代码涉及到的两个知识点:图像格式(矩阵类型)和convertTo函数,配合阅读有助于深入认识。

图像格式(矩阵类型)

type()=0 CV_8U 八位无符号整型 (uchar) 0–255
1 CV_8S 八位有符号整型 (schar) -128–127
2 CV_16U 十六位无符号整型 (ushort) 0–65535
3 CV_16S 十六位有符号整型 (short) -32768–32767
4 CV_32S 三十二位有符号整型 (int) 0–65535
5 CV_32F 三十二位浮点数 (float) 0.0–1.0
6 CV_64F 六十四位浮点数 (double) 0.0–1.0

convertTo函数
xxx.convertTo(dst, type, scale, shift)

dst:目的矩阵;
type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值(常用-1)则输出矩阵和输入矩阵类型相同。转换位深度本质上就是对原深度下的数据做线性变换,使原位深度下的最小值和最大值分别对应转换后位深度下的最小值和最大值。
scale:范围比例因子;eg. 原来的图是255的灰度图,转成float型数据并归一化到0~1,那么就是scale=1.0/255
shift:将输入数组元素按比例缩放后添加的值;

目前OpenCV主要只支持单通道和3通道的图像,并要求其深度为8bit和16bit无符号(即CV_16U),所以其他是不支持的,比如说float型等。
    如果Mat类型数据的深度不满足上面的要求,则需要使用convertTo()函数来进行转换。convertTo()函数负责转换数据类型不同的Mat,即可以将类似float型的Mat转换到imwrite()函数能够接受的类型。

问题2:点云放射、发散、锥形,总之不能看


如果出现以上类似效果,PCL点云是发散、放射、圆锥形的问题,先上结论:点云可能是对的,但发散出来大多都是无效点,除掉即可
    这个问题太过于细节,以致于排查时无从下手,反而去检查了许多点云坐标的计算和PCL的设置语句,也花了不少时间。其实仔细观察这个问题和上一类还不一样,这里的点云锥顶部份比较稠密,而且分层也不是那么规律。再考虑到相机硬件本身的局限性,基线的长度决定了测距的有效范围,超过范围的点误差就会很大,这些点也是没有意义的。
    所以,解决的方法也很简单,在计算点云的双for循环中添加以下语句,把视差值小于80或者深度大于60cm的点剔除掉即可。(这里的数字不一定适配你的硬件,自行修改)

 if (d<=80)continue; //d是double d = disparity.ptr<float>(i)[j]

在解决PCL生成点云分层过程中,也得知了其他解决方法。其一是标定参数出现问题,但我的标定参数是从MATLAB中取出的,所以应该没问题。其二是改用cv::stereoRectify(cameraMatrixL, distCoeffL, cameraMatrixR, distCoeffR,rectifyImageL.size(), R, t, Rl, Rr, Pl, Pr, Q )生成的Q重投影矩阵计算点云中的点,避免求点繁杂的计算,感觉也不是很关键。附上Q重投影矩阵的含义:

Cx:左相机光心在像素坐标系的x
Cy:左相机光心在像素坐标系的y
Cx’:右相机光心在像素坐标系的x
Tx:立体校正后光心距离
d:视差
f:焦距

总结:

视差图计算格式:(CV_32F),真实视差值应该是该值除以16
可视化格式:(CV_8U)
标定参数出现问题,从而导致重投影矩阵Q出现了问题。
附:
立体校正函数 cv::stereoRectify(cameraMatrixL, distCoeffL, cameraMatrixR, distCoeffR,rectifyImageL.size(), R, t, Rl, Rr, Pl, Pr, Q )
stereoRectify() 的作用是为每个摄像头计算立体校正的映射矩阵。所以其运行结果并不是直接将图片进行立体矫正,而是得出进行立体矫正所需要的映射矩阵。
cameraMatrix1-第一个摄像机的摄像机矩阵
distCoeffs1-第一个摄像机的畸变向量
cameraMatrix2-第二个摄像机的摄像机矩阵
distCoeffs1-第二个摄像机的畸变向量
imageSize-图像大小
R- stereoCalibrate() 求得的R矩阵
T- stereoCalibrate() 求得的T矩阵
R1-输出矩阵,第一个摄像机的校正变换矩阵(旋转变换)
R2-输出矩阵,第二个摄像机的校正变换矩阵(旋转矩阵)
P1-输出矩阵,第一个摄像机在新坐标系下的投影矩阵
P2-输出矩阵,第二个摄像机在想坐标系下的投影矩阵
Q-4*4的深度差异映射矩阵
版权声明:本文为CSDN博主「一只会走路的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36537774/article/details/85005552

双目视觉三维重建点云分层,断层、放射,散射,锥形相关推荐

  1. 基于Matlab的双目视觉三维重建技术

    首先需要用到双目视觉平行系统原理 之后了解到三维重建原理 由两张图象的二维图像哥哥像素点的坐标,推导出咱们三维试图重德三维坐标系统中对应的xyz的坐标数值,并显示在Matlab三维图中. 那么像素点怎 ...

  2. 【点云论文速读】点云分层聚类算法

    点云PCL免费知识星球,点云论文速读. 标题:PAIRWISE LINKAGE FOR POINT CLOUD SEGMENTATION 作者:Lu, Xiaohu and Yao, Jian and ...

  3. 元旦特惠!无人机/ROS2/三维重建点云/SLAM/多传感器/相机标定/深度估计等重磅干货教程...

    随着AI技术的大规模落地,国内外资本对AI视觉兴趣只增不减,自动驾驶.工业视觉.AR/VR.测量测绘.移动机器人等领域涌现了大量独角兽公司,相关产品更是受到重点关注. AI领域的热度和资本涌入持续增长 ...

  4. python双目视觉三维重建代码_双目立体视觉的三维重建方法与流程

    本发明为双目立体视觉的三维重建方法,属于图像处理与机器视觉领域,涉及halcon软件,具体涉及空间场景的三维重建. 背景技术: 三维重建技术作为计算机视觉领域的一个重要分支,在人工智能.虚拟现实.非接 ...

  5. 实景三维重建大雁云与三青鸟达成战略合作提供自助式实景三维建模全流程服务

    2022年7月22日,大雁云(深圳市瑞云科技有限公司)与三青鸟(深圳市三青鸟科技有限公司)成功签署战略合作协议. 这次强强联合,双方将通过资源对接.技术互补等合作方式充分发挥各自优势,为地信测绘行业实 ...

  6. 双目视觉三维重建框架

    一.图像坐标:我想和世界坐标谈谈(A) 玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题.希望这样的方式让大家以一个轻松的心态阅读玉米的<计算机视觉学习笔记>双目视觉数学架构系列 ...

  7. 双目视觉三维重建之求两异面直线公垂线中点坐标的解法

    前言 双目立体视觉系统三维重建原理如图所示,对于每个相机而言,如果光心和像点已知,就可以确定光心和像点组成的唯一射线.在针孔成像模型下,物点必然在此射线上.由两台相机进行交汇就有两条这样的射线,且所有 ...

  8. 第六十六篇:单目三维重建点云

    作者:liaojiacai    邮箱: ljc_v2x_adas@foxmail.com 单目三维重建原理与双目类似 区别在于:单目需要每次计算得到重建图像之间旋转和平移之间的关系(RT),三维的生 ...

  9. 基于SFM的三维重建点云合并及位移测量

    参考文档: [1]https://blog.csdn.net/baoshuowl/article/details/80373591?biz_id=102&utm_term=vmware%20U ...

最新文章

  1. 牛逼哄哄的 BitMap,到底牛逼在哪?
  2. AppStore IPv6-only审核被拒原因分析及解决方案-b
  3. freemaker模板引擎使用详解
  4. php ip处理函数,PHP取ip地址函数
  5. java mysql show status_Java 能不能执行mysql 中的show master status 命令
  6. python写程序注意事项(很重要)
  7. idea2019打卡没多久就闪退_IDEA 2020.1打开时闪退的问题及解决方法(完美解决方法)...
  8. 第3章 FOR命令中的变量
  9. AngularJS 动态模板
  10. 【专栏】8086汇编语言系列教程
  11. 三角网导线平差实例_三角网间接平差示例
  12. ubuntu18.04安装roboware-studio
  13. 如何正确做笔记?符号笔记法、康奈尔笔记法总结!
  14. Fall 2020 Berkeley cs61a hw03答案
  15. 【C语言】统计素数并求和
  16. JavaBase 求 个位,十位,百位,千位
  17. Download.Accelerator.Plus.v10.0.4.3_Patch-REPT
  18. 渔业公司宣传片制作技巧
  19. 机器学习讲座总结-读图时代的识图技术
  20. 笔记本Ubuntu系统关闭独显+省电降温设置

热门文章

  1. js sort排序 filter过滤
  2. java class 静态模块_Java API 最佳设计实践:在模块化和非模块化 Java 环境中使用...
  3. 百度发布深度学习可视化平台 Visual DL
  4. DIY便携式显示器板卡推介与定制
  5. C++中的String的常用函数用法总结
  6. AI看脸就知道性取向,不服气的我做了一个实验,结果……
  7. Android开发MVP模式--项目实战
  8. 315曝光机器人打骚扰电话 科大讯飞:未参与璧合科技运营,反对各种滥用技术...
  9. mysql根据父节点查询所有的子节点以及根据子节点往上查询所有父节点
  10. 明日之后android和ios,明日之后安卓和ios可以联机吗 两个互通吗