C++如何实现双目立体匹配Census算法(C++,开发技术)

时间:2024-05-04 07:52:47 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

这篇“C++如何实现双目立体匹配Census算法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++如何实现双目立体匹配Census算法”文章吧。

Census原理:

在视图中选取任一点,以该点为中心划出一个例如3 × 3 的矩形,矩形中除中心点之外的每一点都与中心点进行比较,灰度值小于中心点记为1,灰度大于中心点的则记为0,以所得长度为 8 的只有 0 和 1 的序列作为该中心点的 census 序列,即中心像素的灰度值被census 序列替换。经过census变换后的图像使用汉明距离计算相似度,所谓图像匹配就是在匹配图像中找出与参考像素点相似度最高的点,而汉明距正是匹配图像像素与参考像素相似度的度量。具体而言,对于欲求取视差的左右视图,要比较两个视图中两点的相似度,可将此两点的census值逐位进行异或运算,然后计算结果为1 的个数,记为此两点之间的汉明值,汉明值是两点间相似度的一种体现,汉明值愈小,两点相似度愈大实现算法时先异或再统计1的个数即可,汉明距越小即相似度越高。

C++如何实现双目立体匹配Census算法

下面的代码是自己根据原理写的,实现的结果并没有很好,以后继续优化代码。

具体代码如下:

//*************************Census*********************#include<iostream>#include<opencv2/opencv.hpp>#include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>usingnamespacestd;usingnamespacecv;//-------------------定义汉明距离----------------------------intdisparity;intGetHammingWeight(ucharvalue);//求1的个数//-------------------定义Census处理图像函数---------------------inthWind=1;//定义窗口大小为(2*hWind+1)MatProcessImg(Mat&Img);//将矩形内的像素与中心像素相比较,将结果存于中心像素中MatImg_census,Left_census,Right_census;//--------------------得到Disparity图像------------------------MatgetDisparity(Mat&left,Mat&right);//--------------------处理Disparity图像-----------------------MatProcessDisparity(Mat&disImg);intImgHeight,ImgWidth;//intnum=0;//异或得到的海明距离MatLeftImg,RightImg;MatDisparityImg(ImgHeight,ImgWidth,CV_8UC1,Scalar::all(0));MatDisparityImg_Processed(ImgHeight,ImgWidth,CV_8UC1,Scalar::all(0));MatDisparityImg_Processed_2(ImgHeight,ImgWidth,CV_8UC1);//定义读取图片的路径stringfile_dir="C:\\ProgramFiles\\FLIRIntegratedImagingSolutions\\TriclopsStereoVisionSDK\\stereomatching\\Grab_Stereo\\pictures\\";//定义存储图片的路径stringsave_dir="C:\\ProgramFiles\\FLIRIntegratedImagingSolutions\\TriclopsStereoVisionSDK\\stereomatching\\Grab_Stereo\\Census\\";intmain(){LeftImg=imread(file_dir+"renwu_left.png",0);RightImg=imread(file_dir+"renwu_right.png",0);namedWindow("renwu_left",1);namedWindow("renwu_right",1);imshow("renwu_left",LeftImg);waitKey(5);imshow("renwu_right",RightImg);waitKey(5);ImgHeight=LeftImg.rows;ImgWidth=LeftImg.cols;Left_census=ProcessImg(LeftImg);//处理左图,得到左图的CENSUS图像Left_censusnamedWindow("Left_census",1);imshow("Left_census",Left_census);waitKey(5);//imwrite(save_dir+"renwu_left.jpg",Left_census);Right_census=ProcessImg(RightImg);namedWindow("Right_census",1);imshow("Right_census",Right_census);waitKey(5);//imwrite(save_dir+"renwu_right.jpg",Right_census);DisparityImg=getDisparity(Left_census,Right_census);namedWindow("Disparity",1);imshow("Disparity",DisparityImg);//imwrite(save_dir+"disparity.jpg",DisparityImg);waitKey(5);DisparityImg_Processed=ProcessDisparity(DisparityImg);namedWindow("DisparityImg_Processed",1);imshow("DisparityImg_Processed",DisparityImg_Processed);//imwrite(save_dir+"disparity_processed.jpg",DisparityImg_Processed);waitKey(0);return0;}//-----------------------对图像进行census编码---------------MatProcessImg(Mat&Img){int64start,end;start=getTickCount();MatImg_census=Mat(Img.rows,Img.cols,CV_8UC1,Scalar::all(0));ucharcenter=0;for(inti=0;i<ImgHeight-hWind;i++){for(intj=0;j<ImgWidth-hWind;j++){center=Img.at<uchar>(i+hWind,j+hWind);ucharcensus=0;ucharneighbor=0;for(intp=i;p<=i+2*hWind;p++)//行{for(intq=j;q<=j+2*hWind;q++)//列{if(p>=0&&p<ImgHeight&&q>=0&&q<ImgWidth){if(!(p==i+hWind&&q==j+hWind)){//---------将二进制数存在变量中-----neighbor=Img.at<uchar>(p,q);if(neighbor>center){census=census*2;//向左移一位,相当于在二进制后面增添0}else{census=census*2+1;//向左移一位并加一,相当于在二进制后面增添1}//cout<<"census="<<static_cast<int>(census)<<endl;}}}}Img_census.at<uchar>(i+hWind,j+hWind)=census;}}/*end=getTickCount();cout<<"timeis="<<end-start<<"ms"<<endl;*/returnImg_census;}//------------得到汉明距离---------------intGetHammingWeight(ucharvalue){intnum=0;if(value==0)return0;while(value){++num;value=(value-1)&value;}returnnum;}//--------------------得到视差图像--------------MatgetDisparity(Mat&left,Mat&right){intDSR=16;//视差搜索范围Matdisparity(ImgHeight,ImgWidth,CV_8UC1);cout<<"ImgHeight="<<ImgHeight<<""<<"ImgWidth="<<ImgWidth<<endl;for(inti=0;i<ImgHeight;i++){for(intj=0;j<ImgWidth;j++){ucharL;ucharR;uchardiff;L=left.at<uchar>(i,j);MatDif(1,DSR,CV_8UC1);//MatDif(1,DSR,CV_32F);for(intk=0;k<DSR;k++){//cout<<"k="<<k<<endl;inty=j-k;if(y<0){Dif.at<uchar>(k)=0;}if(y>=0){R=right.at<uchar>(i,y);//bitwise_xor(L,R,);diff=L^R;diff=GetHammingWeight(diff);Dif.at<uchar>(k)=diff;//Dif.at<float>(k)=diff;}}//---------------寻找最佳匹配点--------------PointminLoc;minMaxLoc(Dif,NULL,NULL,&minLoc,NULL);intloc=minLoc.x;//cout<<"loc.....="<<loc<<endl;disparity.at<uchar>(i,j)=loc*16;}}returndisparity;}//-------------对得到的视差图进行处理-------------------MatProcessDisparity(Mat&disImg){MatProcessDisImg(ImgHeight,ImgWidth,CV_8UC1);//存储处理后视差图for(inti=0;i<ImgHeight;i++){for(intj=0;j<ImgWidth;j++){ucharpixel=disImg.at<uchar>(i,j);if(pixel<100)pixel=0;ProcessDisImg.at<uchar>(i,j)=pixel;}}returnProcessDisImg;}

C++如何实现双目立体匹配Census算法

经过处理后的左图census图像

C++如何实现双目立体匹配Census算法

经过处理后的右图census图像

C++如何实现双目立体匹配Census算法

disparity图像

C++如何实现双目立体匹配Census算法

处理后的disparity图像

以上就是关于“C++如何实现双目立体匹配Census算法”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

本文:C++如何实现双目立体匹配Census算法的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Java Spring中Bean的作用域及生命周期是什么下一篇:

16 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18