生活随笔
收集整理的這篇文章主要介紹了
SAD立体匹配算法在opencv中的实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
FROM:http://blog.csdn.net/tulun/article/details/6456188
SAD算法具體原理見相關圖像處理書籍。
該程序是opencv中文論壇的牛人貢獻的,感謝他的工作。
?
(程序所需圖片可以在網(wǎng)上找如http://vision.middlebury.edu/stereo/data/scenes2003/)
[c-sharp] view plaincopyprint?
???#include?<iostream>??#include?<stdio.h>??#include?<stdlib.h>??#include?<cv.h>??#include?<cxcore.h>??#include?<highgui.h>??#include?<math.h>??#include?<ctime>????using?namespace?std;????template<class?T>?class?Image??{??private:??????IplImage*?imgp;????public:??????Image(IplImage*?img=0){imgp=img;}??????~Image(){imgp=0;}??????void?operator=(IplImage*?img){imgp=img;}??????inline?T*?operator[](const?int?rowIndx)??????{??????????return((T*)(imgp->imageData+rowIndx*imgp->widthStep));??????}??};????typedef?struct??{??????unsigned?char?b,g,r;??}RgbPixel;????typedef?struct??{??????float?b,g,r;??}RgbPixelFloat;????typedef?Image<RgbPixel>?RgbImage;??typedef?Image<RgbPixelFloat>?RgbImageFloat;??typedef?Image<unsigned?char>?BwImage;??typedef?Image<float>?BwImageFloat;??????void?displayImageNewWindow(char*?title,CvArr*?img)??{??????cvNamedWindow(title,?CV_WINDOW_AUTOSIZE?);??????cvShowImage(title,img);??}????int?getMaxMin(double?value[],int?valueSize,?int?maxmin)??{??????int?pos=0;??????int?i=0;??????double?max1=-1;??????double?min1=999999;???????????????if?(maxmin==1)??????{????????????????????for?(i=0;i<valueSize;i++)??????????{????????????????????????????if?(value[i]>max1)??????????????{??????????????????pos=i;??????????????????max1=value[i];??????????????}??????????}??????}???????????????if?(maxmin==0)??????{????????????????????for?(i=0;i<valueSize;i++)??????????{????????????????????????????if?(value[i]<min1)??????????????{??????????????????pos=i;??????????????????min1=value[i];??????????????}??????????}???????????????}??????????????????return?pos;??}????IplImage*?generateDisparityImage(IplImage*?greyLeftImg32,IplImage*?greyRightImg32,int?windowSize,int?DSR)??{??????int?offset=floor((double)windowSize/2);??????int?height=greyLeftImg32->height;??????int?width=greyLeftImg32->width;??????double*?localSAD=new?double[DSR];????????int?x=0,?y=0,d=0,m=0;??????int?N=windowSize;????????????????????IplImage*?winImg=cvCreateImage(cvSize(N,N),32,1);???????????IplImage*?disparity=cvCreateImage(cvSize(width,height),8,1);??????BwImage?imgA(disparity);???????????for?(y=0;y<height;y++)??????{????????for?(x=0;x<width;x++)????????{???????????imgA[y][x]=0;????????}??????}???????????????CvScalar?sum;????????????for?(y=0;y<height-N;y++)??????{?????????????????????for?(x=0;x<width-N;x++)??????????{????????????????????????????cvSetImageROI(greyLeftImg32,?cvRect(x,y,N,N));??????????????d=0;?????????????????????????????????????for?(m=0;m<DSR;m++)??????????????{??????????????????localSAD[m]=0;??????????????}????????????????????????????????????do{??????????????????if?(x-d>=0)??????????????????{??????????????????????cvSetImageROI(greyRightImg32,?cvRect(x-d,y,N,N));??????????????????}??????????????????else??????????????????{??????????????????break;??????????????????}????????????????????cvAbsDiff(greyLeftImg32,greyRightImg32,winImg);??????????????????sum=cvSum(winImg);??????????????????localSAD[d]=sum.val[0];????????????????????cvResetImageROI(greyRightImg32);??????????????????d++;??????????????}while(d<=DSR);???????????????????????????????????imgA[y+offset][x+offset]=getMaxMin(localSAD,DSR,0)*16;???????????????cvResetImageROI(greyLeftImg32);??????????}??????????if?(y%10==0)??????????????cout<<"row="<<y<<"?of?"<<height<<endl;???????}????????cvReleaseImage(&winImg);?????????????????return?disparity;??}????int?main?(int?argc,?char?*?const?argv[])???{??????cout?<<?"Sum?of?Absolute?Difference(SAD)?Strereo?Vision"<<endl;??????????????????????char*?filename1="L.jpg";??????IplImage*?greyLeftImg=?cvLoadImage(filename1,0);??????char*?filename2="R.jpg";??????IplImage*?greyRightImg=?cvLoadImage(filename2,0);???????????????if?(greyLeftImg==NULL){cout?<<?"No?valid?image?input."<<endl;?return?1;}??????if?(greyRightImg==NULL){cout?<<?"No?valid?image?input."<<endl;?return?1;}????????int?width=greyLeftImg->width;??????int?height=greyLeftImg->height;???????????????IplImage*?greyLeftImg32=cvCreateImage(cvSize(width,height),32,1);??????IplImage*?greyRightImg32=cvCreateImage(cvSize(width,height),32,1);??????cvConvertScale(greyLeftImg,?greyLeftImg32,?1/255.);??????cvConvertScale(greyRightImg,?greyRightImg32,?1/255.);?????????????????????time_t?tstart,?tend;??????tstart?=?time(0);??????int?windowSize=13,DSR=20;??????IplImage*?disparity32=generateDisparityImage(greyLeftImg32,greyRightImg32,windowSize,DSR);??????tend?=?time(0);??????cout?<<?"It?took?"<<?difftime(tend,?tstart)?<<"?second(s)."<<?endl;????????displayImageNewWindow("Dispairty?Image",disparity32);??????displayImageNewWindow("Left?Image",greyLeftImg32);??????displayImageNewWindow("Right?Image",greyRightImg32);?????????????????????????????cvWaitKey(0);??????cvReleaseImage(&greyLeftImg32);??????cvReleaseImage(&greyRightImg32);??????cvReleaseImage(&greyLeftImg);??????cvReleaseImage(&greyRightImg);??????cvReleaseImage(&disparity32);??????cvDestroyWindow("Left?Image");??????cvDestroyWindow("Right?Image");??????cvDestroyWindow("Dispairty?Image");??????return?0;??}?
總結
以上是生活随笔為你收集整理的SAD立体匹配算法在opencv中的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。