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

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

#include    
#include 
#include       
#include   
#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//转为伪彩色图像的具体算法  
    {
        for (int x = 0; xunsigned char>(y, x);
            img_pseudocolor.at(y, x)[0] = abs(255 - tmp); //blue  
            img_pseudocolor.at(y, x)[1] = abs(127 - tmp); //green  
            img_pseudocolor.at(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算法效果如下:
C/C++ 图像处理(13)------双目图像の深度图生成_第1张图片
GC算法效果如下:
C/C++ 图像处理(13)------双目图像の深度图生成_第2张图片
对比两个算法可明显看出,GC的效果要比BM好上许多,然而其运行效率却是慢的多,基本无法做到实时。

你可能感兴趣的:(图像处理,C++,机器视觉)