C/C++ 图像处理(13)------双目图像の深度图生成

来源:互联网 发布:微信淘宝优惠券怎么做 编辑:程序博客网 时间:2024/06/05 10:56

双目图像可用于生成具有深度的三维图像,其是通过模仿动物双眼的工作机制而来。关于其相关的算法,现如今研究的人很多,但仍离动物双眼的视觉效果千里之遥,只能用在非常有限的范围之内。
近来由于项目所需,要用到双目图像生成深度图,因此做了些研究,然并未深入理解其原理,因而也不在此处做更多的讨论。
本篇文章记录下用网上给出的标准双目图像,且利用OpenCV提供的相关函数计算出双目图像的深度图的实现过程。
需要强调的是,如果用现在OpenCV最新的3.1.0版本,会出现找不到GC算法相关对象的问题,可能是OpenCV对该算法的封装做了些许更改所至,本人并没有去看它弄到哪里去了,若有朋友下工夫去找请在方便时告知一二。由于上述所讲,要用本人下面所帖代码,则也只能在2.4.x的OpenCV版本中成功编译。

#include <opencv2/opencv.hpp>   #include <opencv2/contrib/contrib.hpp>#include <opencv2/calib3d/calib3d.hpp>      #include <opencv2/legacy/legacy.hpp>  #include "time.h"using namespace cv;void main(){    IplImage* img_r, *img_l;                //定义两个图像指针    img_r = cvLoadImage("./1imR.bmp", 0);   //图像指针初始化    img_l = cvLoadImage("./1imL.bmp", 0);   //图像指针初始化    cvShowImage("左边图像", img_l);//源图像显示    cvShowImage("右边图像", img_r);//源图像显示    CvMat* norm_disparity = cvCreateMat(img_l->height, img_l->width, CV_8U);    long time = clock();    //BM算法      //CvMat* disparity = cvCreateMat(img_l->height, img_l->width, CV_32FC1);    //CvStereoBMState* BMState = cvCreateStereoBMState();       //BMState->SADWindowSize = 17;//搜索窗口大小,细腻程度跟这个数值有关    //BMState->minDisparity = 0;//代表匹配搜苏从哪里开始    //BMState->numberOfDisparities = 16;//表示最大搜索视差数,原来为16    //BMState->uniquenessRatio = 25;    //cvFindStereoCorrespondenceBM(img_l, img_r, disparity, BMState);       //校正图像    //cvNormalize(disparity, norm_disparity, 45, 160, CV_MINMAX, NULL); //图像归一化    //cvReleaseMat(&disparity);    //GC算法    CvMat* disparity_left = cvCreateMat(img_l->height, img_l->width, CV_16S);    CvMat* disparity_right = cvCreateMat(img_l->height, img_l->width, CV_16S);    CvStereoGCState* state = cvCreateStereoGCState(16, 2);    cvFindStereoCorrespondenceGC(img_l,img_r,disparity_left,disparity_right,state,0);    cvReleaseStereoGCState(&state);    cvConvertScale(disparity_left, norm_disparity, -16);    cvReleaseMat(&disparity_left);    cvReleaseMat(&disparity_right);    //给深度图像上伪彩色    Mat tempMat = Mat(norm_disparity, true);    Mat img_pseudocolor(tempMat.rows, tempMat.cols, CV_8UC3);//构造RGB图像,参数CV_8UC3教程文档里面有讲解      int tmp = 0;    for (int y = 0; y<tempMat.rows; y++)//转为伪彩色图像的具体算法      {        for (int x = 0; x<tempMat.cols; x++)        {            tmp = tempMat.at<unsigned char>(y, x);            img_pseudocolor.at<Vec3b>(y, x)[0] = abs(255 - tmp); //blue              img_pseudocolor.at<Vec3b>(y, x)[1] = abs(127 - tmp); //green              img_pseudocolor.at<Vec3b>(y, x)[2] = abs(0 - tmp); //red          }    }    printf("图像分辨率:%d*%d\n", img_l->width,img_l->height);    printf("双目深度图计算消耗时间:%dms\n", clock() - time);    imshow("结果", img_pseudocolor);//图像显示    cvWaitKey(0);    //释放所有图像指针占内存与矩阵所占内存,关闭窗口    cvDestroyAllWindows();    cvReleaseImage(&img_l);    cvReleaseImage(&img_r);    cvReleaseMat(&norm_disparity);}

BM算法效果如下:
这里写图片描述
GC算法效果如下:
这里写图片描述
对比两个算法可明显看出,GC的效果要比BM好上许多,然而其运行效率却是慢的多,基本无法做到实时。

1 0
原创粉丝点击