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
- C/C++ 图像处理(13)------双目图像の深度图生成
- C/C++ 图像处理(10)------相近图像の匹配
- C/C++ 图像处理(12)------图像の透视变换
- C/C++ 图像处理(14)------图像の轮廓填充
- C处理图像(笔记)
- C#.NET图像处理
- C#图像处理
- C#图像处理
- C#图像处理
- C#图像处理
- 图像处理职位面试题(图像处理+c++)
- opencv(c++)图像处理(imgproc模块)
- BMP图像生成 纯C
- C语言图像处理方法
- c语言图像处理方法
- C语言图像处理方法
- C语言图像处理方法
- C语言处理BMP图像
- SpringMVC学习之springMVC项目的相关配置文件配置
- 深入理解java中的synchronized关键字
- WebSocket初探
- 错误总结
- 对自己的期望
- C/C++ 图像处理(13)------双目图像の深度图生成
- 生成二维码
- mysql复习小结一
- JavaScript闭包-闭包的作用域
- 使用DjangoUeditor将Ueditor移植到Django(BAE环境下)
- 获取项目根的路径的方法
- rails 练习7 -- 建立新文章后导回到文章列表
- shell if/date/echo换行/数组遍历
- mybatis处理集合、循环、数组和in查询等语句的使用