#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/legacy.hpp>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <ctype.h>
#include "cxcore.h"
#include "highgui.h"
#include "cv.h"
#include "cvaux.h"
#include "cxmisc.h"
#include "math.h"
using namespace std;
using namespace cv;
int main()
{
initModule_nonfree();//initialize module for sift and surf
Ptr<FeatureDetector> detector = FeatureDetector::create( "SIFT" );//creat SIFT feature detector
Ptr<DescriptorExtractor> descriptor_extractor = DescriptorExtractor::create( "SIFT" );//creat feature vector generator
Ptr<DescriptorMatcher> descriptor_matcher = DescriptorMatcher::create( "BruteForce" );//creat feature matcher
if( detector.empty() || descriptor_extractor.empty() )
cout<<"fail to create detector!";
//load image
Mat disp, disp8;
Mat img1 = imread("/Users/henry/Desktop/2.png");
Mat img2 = imread("/Users/henry/Desktop/3.png");
IplImage* img3 =cvLoadImage("/Users/henry/Desktop/2.png",0);
IplImage* img4 =cvLoadImage("/Users/henry/Desktop/3.png",0);
imshow("image1 before", img1);
imshow("image2 before",img2);
//keypoint detection
SiftFeatureDetector siftdtc;
//double t = getTickCount();//current time
vector<KeyPoint> keypoints1,keypoints2;
siftdtc.detect(img1,keypoints1);//detect the keypoints in img1
siftdtc.detect(img2,keypoints2);
cout<<"img1keypointsnumber:"<<keypoints1.size()<<endl;
cout<<"img2keypointsnumber:"<<keypoints2.size()<<endl;
//calculate the feature descriptor matrix
Mat descriptors1,descriptors2;
descriptor_extractor->compute( img1, keypoints1, descriptors1 );
descriptor_extractor->compute( img2, keypoints2, descriptors2 );
//t = ((double)getTickCount() - t)/getTickFrequency();
//cout<<"SURFrunning time:"<<t<<"sec"<<endl;
cout<<"img1 feature descriptor matrix size:"<<descriptors1.size()
<<",feature vector number:"<<descriptors1.rows<<",dimension:"<<descriptors1.cols<<endl;
cout<<"img2 feature descriptor matrix size:"<<descriptors2.size()
<<",feature vector number:"<<descriptors2.rows<<",dimension:"<<descriptors2.cols<<endl;
//draw keypoints
Mat img_keypoints1,img_keypoints2;
drawKeypoints(img1,keypoints1,img_keypoints1,CV_RGB(0,255,0),2);
drawKeypoints(img2,keypoints2,img_keypoints2,CV_RGB(0,255,0),2);
imshow("left",img_keypoints1);
imshow("right",img_keypoints2);
//feature matching
vector<DMatch> matches;//matching result
descriptor_matcher->match( descriptors1, descriptors2, matches );//match the feature matrix
cout<<"Match number:"<<matches.size()<<endl;//total matching number
//calculate the longest and shorest distance
double max_dist = 0;
double min_dist = 100;
//double min2_dist=100;
for(int i=0; i<matches.size(); i++)
{
double dist = matches[i].distance;
if(dist < min_dist)
min_dist = dist;
if(dist > max_dist)
max_dist = dist;
}
cout<<"longest distance:"<<max_dist<<endl;
cout<<"shortest distance:"<<min_dist<<endl;
/*for( int i=0; i<matches.size(); i++)
{
double dist2= matches[i].distance;
if(min_dist< dist2 < min2_dist)
min2_dist = dist2;
}
cout<<"second shortest dist:"<<min2_dist<<endl;
//double ratio = min_dist/min2_dist;*/
//filtering to get good matches
vector<DMatch> goodMatches;
for(int i=0; i<matches.size(); i++)
{
//if(ratio<0.6)
if(matches[i].distance < 0.38 * max_dist)
{
goodMatches.push_back(matches[i]);
}
}
cout<<"goodMatch number:"<<goodMatches.size()<<endl;
//draw matching map
Mat img_matches,img2_matches;
drawMatches(img1,keypoints1,img2,keypoints2,goodMatches,img_matches,CV_RGB(0,255,0)
/*Scalar::all(-1)*//*CV_RGB(255,0,0)*/,CV_RGB(0,255,0),Mat(),2);
drawMatches(img1,keypoints1,img2,keypoints2,matches,img2_matches,CV_RGB(255,0,0)
/*Scalar::all(-1)*//*CV_RGB(255,0,0)*/,CV_RGB(255,0,0),Mat(),2);
imshow("MatchSift",img_matches);
imshow("MatchSifttotal",img2_matches);
//////////////////////////////////////SAD//////////////////////////////////////
CvStereoBMState *BMState = cvCreateStereoBMState();
CvMat* disparity = cvCreateMat(img3->height, img3->width, CV_32F);
CvMat* norm_disparity=cvCreateMat(img3->height,img3->width,CV_8U);
int SADWindowSize=15;
BMState->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 21;
BMState->minDisparity = 0;
BMState->numberOfDisparities = 32;
BMState->textureThreshold = 10;
BMState->uniquenessRatio = 15;
BMState->speckleWindowSize = 100;
BMState->speckleRange = 32;
BMState->disp12MaxDiff = 1;
cvFindStereoCorrespondenceBM( img3, img4,disparity ,BMState);
cvNormalize( disparity,norm_disparity , 0, 256, CV_MINMAX );
cvNamedWindow("sbm",0);
cvShowImage("sbm", norm_disparity);
//////////////////////////rmse sbm///////////////////////////////////////////
IplImage* gt = cvLoadImage("/Users/henry/Desktop/t3.pgm",0);
int m = norm_disparity->width;
int n = norm_disparity->height;
double rmse=0;
double mse=0;
double tmp1=0;
double tmp2=0;
for (int j=0; j<m; j++ )
{
for (int i=0; i<n; i++)
{
tmp1=cvGet2D(norm_disparity,i,j).val[0];
tmp2=cvGet2D(gt,i,j).val[0];
mse=mse+(tmp1-tmp2)*(tmp1-tmp2);
}
}
rmse=sqrt(mse/(m*n));
cout<<"rmsesbm:"<<rmse<<endl;
/////////////////////////////////bad pixel///////////////////////////////
int p = norm_disparity->width;
int q = norm_disparity->height;
double bp=0;
double tmp5=0;
double tmp6=0;
for (int j=0; j<p; j++)
{
for(int i=0;i<q;i++)
{
tmp5=cvGet2D(norm_disparity,i,j).val[0];
tmp6=cvGet2D(gt,i,j).val[0];
if (fabs (tmp5-tmp6)>1)
bp=(bp+fabs(tmp5-tmp6));
}
}
bp=bp/(p*q);
cout<<"bpsbm:"<<bp<<endl;
/////////////////////////////////////GC////////////////////////////////////
CvSize size = cvGetSize( img3 );
//the disparity map is an array h*w, with 16bit signed elements.
CvStereoGCState* state = cvCreateStereoGCState( 16, 2 );
CvMat* disparity_left = cvCreateMat( size.height, size.width, CV_16S );
CvMat* disparity_right = cvCreateMat( size.height, size.width, CV_16S );
cvFindStereoCorrespondenceGC( img3,img4,disparity_left,disparity_right,state,0);
cvReleaseStereoGCState( &state );
//post-progressing the result
CvMat* disparity_left_visual = cvCreateMat( size.height, size.width, CV_8U );
cvConvertScale( disparity_left, disparity_left_visual, -16 );
cvNamedWindow( "gc", 1);
cvShowImage("gc", disparity_left_visual );
//////////////////////////////////rmse gc//////////////////////////////////
int a = disparity_left_visual->width;
int b = disparity_left_visual->height;
double rmsegc=0;
double msegc=0;
double tmp3=0;
double tmp4=0;
for (int j=0; j<a; j++ )
{
for (int i=0; i<b; i++)
{
tmp3=cvGet2D(disparity_left_visual,i,j).val[0];
tmp4=cvGet2D(gt,i,j).val[0];
msegc=msegc+(tmp3-tmp4)*(tmp3-tmp4);
}
}
rmsegc=sqrt(msegc/(a*b));
cout<<"rmsegc:"<<rmsegc<<endl;
///////////////////////////////////bad pixel gc////////////////////////////////
int x = disparity_left_visual->width;
int y = disparity_left_visual->height;
double bpgc=0;
double tm
mac上用opencv计算视差图
需积分: 16 123 浏览量
2015-04-29
12:08:22
上传
评论
收藏 363KB ZIP 举报
henrylovefish
- 粉丝: 0
- 资源: 4
最新资源
- OpenCv 使用fffffffff
- 正点原子开拓者FPGA多人表决器代码项目
- EOP-Last5Years.txt
- windows 32位、64位系统常见缺少的库
- 毕业设计基于springboot+vue实现的求职招聘类型网站源码+数据库(高分项目).zip
- 535springboot + vue 体质测试数据分析及可视化设计.zip(可运行源码+数据库文件+文档)
- python毕业设计-基于Django+OpenCV的二维码生成与识别系统源码.zip
- 基于springboot+vue实现的求职招聘类型网站源代码+数据库(优质毕设项目).zip
- iOS APP提审checklist
- 第十四届中北大学ACM程序设计竞赛.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈