您的位置:首页 > 编程语言 > C语言/C++

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

2016-10-21 16:57 447 查看
双目图像可用于生成具有深度的三维图像,其是通过模仿动物双眼的工作机制而来。关于其相关的算法,现如今研究的人很多,但仍离动物双眼的视觉效果千里之遥,只能用在非常有限的范围之内。

近来由于项目所需,要用到双目图像生成深度图,因此做了些研究,然并未深入理解其原理,因而也不在此处做更多的讨论。

本篇文章记录下用网上给出的标准双目图像,且利用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好上许多,然而其运行效率却是慢的多,基本无法做到实时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: