admin
管理员
管理员
  • UID1
  • 粉丝14
  • 关注0
  • 发帖数119
  • 社区居民
  • 原创写手
阅读:1646回复:5

双目视觉三维重建

楼主#
更多 发布于:2018-10-09 19:13
各位好,最近在学习双目立体视觉的相关知识,有没有大神能讲解一下利用双目相机的原始图、生成的视差图和相机内参生成点云的方法和 demo code,还有我在利用BM算法生成的深度图用照片查看器无法打开,提示无效的位图文件或不支持文件的格式,代码如下,不知道什么原因?
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/legacy/legacy.hpp>
#include "time.h"
using namespace std;
using namespace cv;
int main()
{
 IplImage* img_r, *img_l;//定义两个图像指针 img_l = cvLoadImage("left_4.png",0);
 img_r = cvLoadImage("right_4.png",0);
 CvSize size = cvGetSize(img_l);
 CvMat* disparity_left = cvCreateMat(size.height,size.width,CV_16S);
 CvMat* disparity_right = cvCreateMat(size.height,size.width,CV_16S);
 CvStereoBMState *BMState = cvCreateStereoBMState();
 assert(BMState != 0);
 BMState->preFilterSize=41;
 BMState->preFilterCap=31;
 BMState->SADWindowSize=15;
 BMState->minDisparity=0;//最小视差,默认值为 0, 可以是负值,int 型 BMState->numberOfDisparities=32;
 BMState->textureThreshold=10;
 BMState->uniquenessRatio=15;//该参数不能为负值,一般5-15左右的值比较合适15 BMState->speckleWindowSize =100;
 BMState->speckleRange = 32;
 cvFindStereoCorrespondenceBM(img_l,img_r,disparity_left,BMState);
 cvReleaseStereoBMState(&BMState);
 CvMat* disparity_left_visual = cvCreateMat(size.height,size.width,CV_8UC1);
 cvNormalize(disparity_left,disparity_left_visual,0,256,CV_MINMAX);
 cvSave("disparity.png",disparity_left_visual);
 cvShowImage("disparity",disparity_left_visual);
 cvWaitKey(0);
 cvDestroyWindow("disparity");
 return 0;
}

最新喜欢:

happybaolianghappyb...
admin
管理员
管理员
  • UID1
  • 粉丝14
  • 关注0
  • 发帖数119
  • 社区居民
  • 原创写手
沙发#
发布于:2018-10-09 19:33
我先来抛出点资料作为引子(剩下的内容参考14讲书上的内容吧,有版权,我不能贴出太多)
admin
管理员
管理员
  • UID1
  • 粉丝14
  • 关注0
  • 发帖数119
  • 社区居民
  • 原创写手
板凳#
发布于:2018-10-09 19:34
关于双目稠密立体匹配的方法可以参考我写的关于NCC的博客:http://www.cnblogs.com/yepeichu/p/7354083.html 方法大体上是利用像素灰度值的差异来构建匹配关系,这首先要求双目要标定好并校正,才能使得极线处于同一水平线上。 利用NCC进行匹配后计算得到视差图,大体上就是右坐标减去左坐标,y轴不变。 利用视差图的视差d以及相机内参数中的焦距f和基线b,得到对应像素的深度z=fb/d。 由相机内参矩阵K与像素坐标计算得到相机坐标系中的X,Y,结合上述计算的Z即可得到三维空间点。 关于上述代码,BM算法我没用过。但是讲到图片无法显示的问题,首先得确保你的图片在保存之前是否是有效的,可以在保存之前进行显示验证。 另外建议查看下图像是否是浮点型,如果是浮点型也可能会发生阶段,比如都小于1的double型就会变成全黑的。 最后就是要看你的保存方式是否有问题了。 希望对你有所帮助,小C留。
admin
管理员
管理员
  • UID1
  • 粉丝14
  • 关注0
  • 发帖数119
  • 社区居民
  • 原创写手
地板#
发布于:2018-10-09 19:34
emmm....一般不都是
cv::Mat img = cv::imread(...);
cv::imwrite(...);
这样写吗
admin
管理员
管理员
  • UID1
  • 粉丝14
  • 关注0
  • 发帖数119
  • 社区居民
  • 原创写手
4楼#
发布于:2018-10-09 19:34
保存图片时注意格式,OpenCV里的BM,SGBM计算的视差图应该都是CV_32F,直接保存是显示不出来的。 如果要给人看的话,可以考虑把深度图乘系数,转成CV_16UC1保存。
admin
管理员
管理员
  • UID1
  • 粉丝14
  • 关注0
  • 发帖数119
  • 社区居民
  • 原创写手
5楼#
发布于:2018-10-09 19:34
谢谢!
游客