OpenCv中实现了三种立体匹配算法:
生活随笔
收集整理的這篇文章主要介紹了
OpenCv中实现了三种立体匹配算法:
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCv中實現了三種立體匹配算法:
BM算法
SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information
GC算法 算法文獻:Realistic CG Stereo Image Dataset with Ground Truth Disparity Maps
參考:http://blog.csdn.net/wqvbjhc/article/details/6260844
BM算法:速度很快,效果一般
復制代碼
void BM()
{
IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? CvStereoBMState* BMState=cvCreateStereoBMState();
? ? assert(BMState);
? ? BMState->preFilterSize=9;
? ? BMState->preFilterCap=31;
? ? BMState->SADWindowSize=15;
? ? BMState->minDisparity=0;
? ? BMState->numberOfDisparities=64;
? ? BMState->textureThreshold=10;
? ? BMState->uniquenessRatio=15;
? ? BMState->speckleWindowSize=100;
? ? BMState->speckleRange=32;
? ? BMState->disp12MaxDiff=1;
? ? CvMat* disp=cvCreateMat(img1->height,img1->width,CV_16S);
? ? CvMat* vdisp=cvCreateMat(img1->height,img1->width,CV_8U);
? ? int64 t=getTickCount();
? ? cvFindStereoCorrespondenceBM(img1,img2,disp,BMState);
? ? t=getTickCount()-t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? cvSave("disp.xml",disp);
? ? cvNormalize(disp,vdisp,0,255,CV_MINMAX);
? ? cvNamedWindow("BM_disparity",0);
? ? cvShowImage("BM_disparity",vdisp);
? ? cvWaitKey(0);
? ? //cvSaveImage("cones\\BM_disparity.png",vdisp);
? ? cvReleaseMat(&disp);
? ? cvReleaseMat(&vdisp);
? ? cvDestroyWindow("BM_disparity");
}
復制代碼
? ?
left.png right.png ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?disparity.jpg
SGBM算法,作為一種全局匹配算法,立體匹配的效果明顯好于局部匹配算法,但是同時復雜度上也要遠遠大于局部匹配算法。算法主要是參考Stereo Processing by Semiglobal Matching and Mutual Information。
opencv中實現的SGBM算法計算匹配代價沒有按照原始論文的互信息作為代價,而是按照塊匹配的代價。
參考:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=23854
復制代碼
#include <highgui.h>
#include <cv.h>
#include <cxcore.h>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
? ? IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? cv::StereoSGBM sgbm;
? ? int SADWindowSize = 9;
? ? sgbm.preFilterCap = 63;
? ? sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3;
? ? int cn = img1->nChannels;
? ? int numberOfDisparities=64;
? ? sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
? ? sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
? ? sgbm.minDisparity = 0;
? ? sgbm.numberOfDisparities = numberOfDisparities;
? ? sgbm.uniquenessRatio = 10;
? ? sgbm.speckleWindowSize = 100;
? ? sgbm.speckleRange = 32;
? ? sgbm.disp12MaxDiff = 1;
? ? Mat disp, disp8;
? ? int64 t = getTickCount();
? ? sgbm((Mat)img1, (Mat)img2, disp);
? ? t = getTickCount() - t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.));
? ? namedWindow("left", 1);
? ? cvShowImage("left", img1);
? ? namedWindow("right", 1);
? ? cvShowImage("right", img2);
? ? namedWindow("disparity", 1);
? ? imshow("disparity", disp8);
? ? waitKey();
? ? imwrite("sgbm_disparity.png", disp8); ??
? ? cvDestroyAllWindows();
? ? return 0;
}
復制代碼
??
left.png right.png ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?disparity.jpg
GC算法 效果最好,速度最慢
復制代碼
void GC()
{
? ? IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? CvStereoGCState* GCState=cvCreateStereoGCState(64,3);
? ? assert(GCState);
? ? cout<<"start matching using GC"<<endl;
? ? CvMat* gcdispleft=cvCreateMat(img1->height,img1->width,CV_16S);
? ? CvMat* gcdispright=cvCreateMat(img2->height,img2->width,CV_16S);
? ? CvMat* gcvdisp=cvCreateMat(img1->height,img1->width,CV_8U);
? ? int64 t=getTickCount();
? ? cvFindStereoCorrespondenceGC(img1,img2,gcdispleft,gcdispright,GCState);
? ? t=getTickCount()-t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? //cvNormalize(gcdispleft,gcvdisp,0,255,CV_MINMAX);
? ? //cvSaveImage("GC_left_disparity.png",gcvdisp);
? ? cvNormalize(gcdispright,gcvdisp,0,255,CV_MINMAX);
? ? cvSaveImage("GC_right_disparity.png",gcvdisp);
? ? cvNamedWindow("GC_disparity",0);
? ? cvShowImage("GC_disparity",gcvdisp);
? ? cvWaitKey(0);
? ? cvReleaseMat(&gcdispleft);
? ? cvReleaseMat(&gcdispright);
? ? cvReleaseMat(&gcvdisp);
}
復制代碼
?
? ? ? ? ? ? ?
left.png right.png ? ? ? ? ? ? ? ?disparity.jpg ? ? ??
如何設置BM、SGBM和GC算法的狀態參數?
參看:http://blog.csdn.net/chenyusiyuan/article/details/5967291
BM算法
SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information
GC算法 算法文獻:Realistic CG Stereo Image Dataset with Ground Truth Disparity Maps
參考:http://blog.csdn.net/wqvbjhc/article/details/6260844
BM算法:速度很快,效果一般
復制代碼
void BM()
{
IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? CvStereoBMState* BMState=cvCreateStereoBMState();
? ? assert(BMState);
? ? BMState->preFilterSize=9;
? ? BMState->preFilterCap=31;
? ? BMState->SADWindowSize=15;
? ? BMState->minDisparity=0;
? ? BMState->numberOfDisparities=64;
? ? BMState->textureThreshold=10;
? ? BMState->uniquenessRatio=15;
? ? BMState->speckleWindowSize=100;
? ? BMState->speckleRange=32;
? ? BMState->disp12MaxDiff=1;
? ? CvMat* disp=cvCreateMat(img1->height,img1->width,CV_16S);
? ? CvMat* vdisp=cvCreateMat(img1->height,img1->width,CV_8U);
? ? int64 t=getTickCount();
? ? cvFindStereoCorrespondenceBM(img1,img2,disp,BMState);
? ? t=getTickCount()-t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? cvSave("disp.xml",disp);
? ? cvNormalize(disp,vdisp,0,255,CV_MINMAX);
? ? cvNamedWindow("BM_disparity",0);
? ? cvShowImage("BM_disparity",vdisp);
? ? cvWaitKey(0);
? ? //cvSaveImage("cones\\BM_disparity.png",vdisp);
? ? cvReleaseMat(&disp);
? ? cvReleaseMat(&vdisp);
? ? cvDestroyWindow("BM_disparity");
}
復制代碼
? ?
left.png right.png ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?disparity.jpg
SGBM算法,作為一種全局匹配算法,立體匹配的效果明顯好于局部匹配算法,但是同時復雜度上也要遠遠大于局部匹配算法。算法主要是參考Stereo Processing by Semiglobal Matching and Mutual Information。
opencv中實現的SGBM算法計算匹配代價沒有按照原始論文的互信息作為代價,而是按照塊匹配的代價。
參考:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=23854
復制代碼
#include <highgui.h>
#include <cv.h>
#include <cxcore.h>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
? ? IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? cv::StereoSGBM sgbm;
? ? int SADWindowSize = 9;
? ? sgbm.preFilterCap = 63;
? ? sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3;
? ? int cn = img1->nChannels;
? ? int numberOfDisparities=64;
? ? sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
? ? sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
? ? sgbm.minDisparity = 0;
? ? sgbm.numberOfDisparities = numberOfDisparities;
? ? sgbm.uniquenessRatio = 10;
? ? sgbm.speckleWindowSize = 100;
? ? sgbm.speckleRange = 32;
? ? sgbm.disp12MaxDiff = 1;
? ? Mat disp, disp8;
? ? int64 t = getTickCount();
? ? sgbm((Mat)img1, (Mat)img2, disp);
? ? t = getTickCount() - t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.));
? ? namedWindow("left", 1);
? ? cvShowImage("left", img1);
? ? namedWindow("right", 1);
? ? cvShowImage("right", img2);
? ? namedWindow("disparity", 1);
? ? imshow("disparity", disp8);
? ? waitKey();
? ? imwrite("sgbm_disparity.png", disp8); ??
? ? cvDestroyAllWindows();
? ? return 0;
}
復制代碼
??
left.png right.png ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?disparity.jpg
GC算法 效果最好,速度最慢
復制代碼
void GC()
{
? ? IplImage * img1 = cvLoadImage("left.png",0);
? ? IplImage * img2 = cvLoadImage("right.png",0);
? ? CvStereoGCState* GCState=cvCreateStereoGCState(64,3);
? ? assert(GCState);
? ? cout<<"start matching using GC"<<endl;
? ? CvMat* gcdispleft=cvCreateMat(img1->height,img1->width,CV_16S);
? ? CvMat* gcdispright=cvCreateMat(img2->height,img2->width,CV_16S);
? ? CvMat* gcvdisp=cvCreateMat(img1->height,img1->width,CV_8U);
? ? int64 t=getTickCount();
? ? cvFindStereoCorrespondenceGC(img1,img2,gcdispleft,gcdispright,GCState);
? ? t=getTickCount()-t;
? ? cout<<"Time elapsed:"<<t*1000/getTickFrequency()<<endl;
? ? //cvNormalize(gcdispleft,gcvdisp,0,255,CV_MINMAX);
? ? //cvSaveImage("GC_left_disparity.png",gcvdisp);
? ? cvNormalize(gcdispright,gcvdisp,0,255,CV_MINMAX);
? ? cvSaveImage("GC_right_disparity.png",gcvdisp);
? ? cvNamedWindow("GC_disparity",0);
? ? cvShowImage("GC_disparity",gcvdisp);
? ? cvWaitKey(0);
? ? cvReleaseMat(&gcdispleft);
? ? cvReleaseMat(&gcdispright);
? ? cvReleaseMat(&gcvdisp);
}
復制代碼
?
? ? ? ? ? ? ?
left.png right.png ? ? ? ? ? ? ? ?disparity.jpg ? ? ??
如何設置BM、SGBM和GC算法的狀態參數?
參看:http://blog.csdn.net/chenyusiyuan/article/details/5967291
總結
以上是生活随笔為你收集整理的OpenCv中实现了三种立体匹配算法:的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 立体匹配算法
- 下一篇: 最全VR产业链全景图(必收藏)