⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dense_correspondence.cpp

📁 基于OpenCV的计算机视觉技术实现.rar
💻 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 + -