C/C++ 图像处理(13)------双目图像の深度图生成
2016-10-21 16:57
447 查看
双目图像可用于生成具有深度的三维图像,其是通过模仿动物双眼的工作机制而来。关于其相关的算法,现如今研究的人很多,但仍离动物双眼的视觉效果千里之遥,只能用在非常有限的范围之内。
近来由于项目所需,要用到双目图像生成深度图,因此做了些研究,然并未深入理解其原理,因而也不在此处做更多的讨论。
本篇文章记录下用网上给出的标准双目图像,且利用OpenCV提供的相关函数计算出双目图像的深度图的实现过程。
需要强调的是,如果用现在OpenCV最新的3.1.0版本,会出现找不到GC算法相关对象的问题,可能是OpenCV对该算法的封装做了些许更改所至,本人并没有去看它弄到哪里去了,若有朋友下工夫去找请在方便时告知一二。由于上述所讲,要用本人下面所帖代码,则也只能在2.4.x的OpenCV版本中成功编译。
BM算法效果如下:
GC算法效果如下:
对比两个算法可明显看出,GC的效果要比BM好上许多,然而其运行效率却是慢的多,基本无法做到实时。
近来由于项目所需,要用到双目图像生成深度图,因此做了些研究,然并未深入理解其原理,因而也不在此处做更多的讨论。
本篇文章记录下用网上给出的标准双目图像,且利用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好上许多,然而其运行效率却是慢的多,基本无法做到实时。
相关文章推荐
- c++图像处理
- 一般处理程序生成图像
- OpenCV处理kinect深度图,获取手掌骨架图像
- 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
- C++图像处理 -- 平面几何变换
- PHP图像处理--MagicWand生成缩略图(可加水印)
- 图像处理--多个平台下双目视觉的实现
- 利用ASP.NET一般处理程序动态生成Web图像
- 编写高效的C#图像处理程序(4) Rgb=>Lab,C# vs. C++(VC)
- C++图像处理 -- 图像颜色混合(下)
- [转]C++异常处理 13
- C#中的图像处理(附带生成马赛克范例)
- C++实现基础图像处理
- 网站中的缩略图是如何生成的?(C#处理图像)
- Symbian c++调用opencv库进行图像处理
- C++图像处理 -- 平面几何变换类
- 图像各种深度的处理及gvf snake中的CvSepFilter
- C++图像处理类
- C++图像处理 -- 图像颜色混合(中)
- [Mo]OpenNI+OpenCV处理kinect深度图,获取手掌骨架图像