资源简介

基于相关系数的影像匹配,最终结果显示将两张图片合并显示,用线将匹配点连接在一起。并输出匹配点的行列号。

资源截图

代码片段和文件信息

#include “stdafx.h“
#include “Match.h“
#include “math.h“  
#include “Moravec.h“  


CMatch::CMatch()
{
windowsize = 11;  //设置匹配窗口的大小
Threshold = 0.8;  //设置阈值
pPoint2i = NULL; 
num = 0;
}


CMatch::~CMatch()
{
}


void CMatch::showresult(const Mat LeftImgColor const Mat RightImgColor Mat &ResultImg)
{
int rResult= LeftImgColor.rows > RightImgColor.rows ? LeftImgColor.rows : RightImgColor.rows;

ResultImg.create(rResult LeftImgColor.cols + RightImgColor.cols LeftImgColor.type());
for (int i = 0; i {
for (int j = 0; j {
ResultImg.at(i j) = LeftImgColor.at(i j);
}
}
for (int i = 0; i {
for (int j = 0; j {
ResultImg.at(i j + LeftImgColor.cols) = RightImgColor.at(i j);
}
}
}
double CMatch::NCCValue(int lr int lc int rr int rc)
{
double gLeftAverage = 0;//左影像窗口灰度平均值  
double gRightAverage = 0;//右影像窗口灰度平均值  
int halfsize = windowsize / 2;
for (int i = -halfsize; i {
for (int j = -halfsize; j {
gLeftAverage += LeftImgEpi.at(lr + i lc + j);
gRightAverage += RightImgEpi.at(rr + i rc + j);
}
}
gLeftAverage /= windowsize*windowsize;
gRightAverage /= windowsize*windowsize;
double a = 0;
double b = 0;
double c = 0;
for (int i = -halfsize; i {
for (int j = -halfsize; j {
double left_av = LeftImgEpi.at(lr + i lc + j) - gLeftAverage;
double right_av = RightImgEpi.at(rr + i rc + j) - gRightAverage;
a += left_av*right_av;
b += left_av*left_av;
c += right_av*right_av;
}
}
return a / sqrt(b*c);//返回相关系数的大小  
}
void CMatch::FeatureMatchMain(Mat LeftImg Mat RightImg Mat LeftImgColor Mat RightImgColor)
{
LeftImgEpi = LeftImg;
RightImgEpi = RightImg;
Point offset = Point(0170);
int delta = 15;
Mat Result;
showresult(LeftImgColor RightImgColor Result);//将两张彩色影像和合并1个  
//imshow(“拼接结果“ Result);
//cvWaitKey();
Mat Interest;//兴趣矩阵  
CMoravec CM;
int FeatureNum;//特征点个数  
CM.Moravec(LeftImgEpi LeftImgColor);//Moravec特征提取  
Mat mFeaturePoint = CM.resMorMat.clone();
FeatureNum = CM.FeatureNum;
Interest = CM.Interest.clone();
pPoint2i = new struct MatchPoint2i[FeatureNum];//给同名点结构体数组分配内存空间  
int halfsize = windowsize / 2;
int Lr = LeftImgEpi.rows;
int Lc = LeftImgEpi.cols;
int Rr = RightImgEpi.rows;
int Rc = RightImgEpi.cols;
//搜索匹配点  
for (int i = halfsize; i {
for (int j = 20; j {
if (Interest.at(i j) == 0)
//特征点作为模板中心  
{
double maxscore = 0;
for (int r = i + offset.x - delta; r < i + offset.x + delta; r++){
for (int c = j + offset.y - delta; c< j + offset.y + delta; c++)
{
double score = NCCValue(i j r c

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件    5165982  2017-12-30 00:06  基于相关系数的数字影像匹配\result.bmp

     文件       4251  2017-12-30 01:02  基于相关系数的数字影像匹配\相关系数实现类\Match.cpp

     文件        821  2017-12-29 23:39  基于相关系数的数字影像匹配\相关系数实现类\Match.h

     目录          0  2018-12-02 15:00  基于相关系数的数字影像匹配\相关系数实现类

     目录          0  2018-12-02 15:02  基于相关系数的数字影像匹配

----------- ---------  ---------- -----  ----

              5171054                    5


评论

共有 条评论