📄 dense_correspondence.cpp
字号:
//由于cvut版本进行了更新,致使该工程不能在最新cvut版本下编译,请使用工程包含的cvut库进行编译
#include "cv.h"
#include "highgui.h"
#include "cvut/cvut.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
using namespace cvut;
#pragma comment(lib,"cxcore")
#pragma comment(lib,"cv")
#pragma comment(lib,"highgui")
//#define REAL_TIME_MATCHING_SHOW
int main(int argc,char** argv)
{
Image<uchar> temp("image/Luxor02StereoSm2.jpg");
Image<uchar> left(temp.size().width/2,temp.size().height,8,3);
Image<uchar> right(temp.size().width/2,temp.size().height,8,3);
//分割图像
int i,j,t,k;
for (i=0;i<temp.height;++i) {
j=0;
for (;j<temp.width/2;j++) {
for (t=0;t<temp.channels;++t) {
left(i,j,t) = temp(i,j,t);
}
}
j++;
for (k=j+1,j=0;k<temp.width;++k,++j) {
for (t=0;t<temp.channels;++t) {
right(i,j,t) = temp(i,k,t);
}
}
}
left.show("left");
right.show("right",400,0);
cvWaitKey();
left.close();
right.close();
/************************************************************************
特征匹配
*************************************************************************/
cout<<"特征匹配……";
int depth_count = 0;
vector<vector<int> > depth(left.width*left.height,vector<int>(3));
vector<int> depth_buf(3);
//匹配窗口大小////////////////////////////////////////////////////////////////////////
int win_size = 9;
Matrix<double> left_wins(left.width-win_size/2-win_size/2,win_size*win_size*3,1);
Matrix<double> right_wins(left.width-win_size/2-win_size/2,win_size*win_size*3,1);
//设定最大可能视差///////////////////////////////////////////////////////////
int depth_max = 10;
int depth_min = left.height;
bool is_match = false;
int l,m,n;
for (i=win_size/2;i<left.height-win_size/2;i++) {
cout<<i<<" ";
/* 建立第i行所有的源向量和目的向量 */
for (int k=win_size/2;k<left.width-win_size/2;k++) {
int p=0,q=0;
for (l=i-win_size/2;l<=i+win_size/2;l++) {
for (m=k-win_size/2;m<=k+win_size/2;m++) {
for (n=0;n<3;n++) {
left_wins(k-win_size/2,p++,0) = left(l,m,n);
}
}
for (m=k-win_size/2;m<=k+win_size/2;m++) {
for (n=0;n<3;n++) {
right_wins(k-win_size/2,q++,0) = right(l,m,n);
}
}
}
}
//遍历极线进行匹配
for (j=win_size/2;j<left.width-win_size/2;j++) {
depth_buf[0] = i;
depth_buf[1] = j;
/* 初始最大误差 */
double cos_val = 0.9;
int index=0;
is_match = false;
for (int k=j;k<min(left.width-win_size/2,j+depth_max);k++) {
/* 计算向量误差 */
double cos_temp = 0,val1 = 0,val2 = 0,val3 = 0;
for (int u=0;u<left_wins.cols;++u) {
val1 += left_wins(j-win_size/2,u,0)*right_wins(k-win_size/2,u,0);
val2 += left_wins(j-win_size/2,u,0)*left_wins(k-win_size/2,u,0);
val3 += right_wins(k-win_size/2,u,0)*right_wins(k-win_size/2,u,0);
}
cos_temp = val1/sqrt(val2)/sqrt(val3);
/* 判断是否匹配 */
if (cos_temp > cos_val){
depth_buf[2] = k-depth_buf[1];
cos_val = cos_temp;
index = k;
is_match = true;
}
}
if (is_match) {
depth_min = depth_buf[2]<depth_min?depth_buf[2]:depth_min;
depth[depth_count] = depth_buf;
depth_count++;
is_match = false;
/* 实时匹配显示 */
#ifdef REAL_TIME_MATCHING_SHOW
cvCircle(left.cvimage,cvPoint(j,i),1,CV_RGB(255,255,255));
cvCircle(right.cvimage,cvPoint(index,i),1,CV_RGB(255,255,255));
left.show("left",0,0);
right.show("right",400,0);
cvWaitKey();
left.close();
right.close();
#endif
}
}
}
cout<<"完成"<<endl;
/************************************************************************
显示深度图像
*************************************************************************/
cout<<"最小视差:"<<depth_min<<endl
<<"最大视差:"<<depth_max<<endl;
Image<uchar> depth_image(left.size(),8,1);
for (i=0;i<depth.size();i++) {
depth_image(depth[i][0],depth[i][1]) = (uchar)(255*(double)(depth[i][2]-depth_min)/(double)(depth_max-depth_min));
}
depth_image.show("depth");
cvWaitKey();
depth_image.close();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -