hausdorff距离代码多大表示匹配良好

1368人阅读
图像处理(2)
该代码已托管到GitHub,最新代码请从GitHub。
1. 修复了match()函数内一个导致内存泄漏的bug.
添加CFeatures类,用于获取特征点,实现了CANNY、HARRIS、SIFT、SURF特征点的获取,添加了实时匹配例程。
1.使用HARRIS、SIFT、SURF提取特征点时,Debug版本耗时非常长,release版本正常
2.使用HARRIS、SIFT、SURF提取特征点时,CFeatures类不能正确析构,初步判断是dll和EXE堆释放错误,
而且出错点很可能是 m_vecPoints向量问题
如有知道原因,还望不吝赐教。
工程文件下载地址:
/************************************************************************************************************************************/
以下是我实现的Hausdorff &distance距离匹配 C++ 类,构造函数如下:
CHausdorff(IplImage *srcImg, IplImage *modelImge,
int xInterval = 1, int yInterval = 1,
double frontRange = 0.8, double backRange = 0.7);
当frontRange = 1,backRange = 1,并使用sort()函数时,该类退化成原始Hausforff distance定义的匹配方法当frontRange ,backRange 取值为0~1之间,并使用sort函数时,该类为改进型hausdorff distance:部分hausdorff distance.当frontRange ,backRange 取值任意,并使用meanDistance()函数时,该类为改进型hausdorff distance:平均hausdorff distance.
以下C++代码在VS2010 + OpenCV2.4.8下调试通过,
附上代码:
CHausdorff类定义如下:
CHausdorff.h 文件:
/******************************************
* Copyright (C) 2015 HolaMirai()
* All rights reserved.
* 文件名:hausdorff.h
* 摘要:寻找Hausdorff Distance度量的最匹配位置和最匹配位置的距离
* 当前版本:&V1.0&,&完成日期:日&,&HolaMirai&,&创建该文件&
* 历史记录:...
******************************************/
* 类定义说明
/********************************************
* CHausforff类
* CHausdorff类接受带匹配图、模板图的二值化图像或包含特征点二值化图像,参数都带有默认值
* 使用match函数可以直接获取匹配结果
* hausdorff distance 采用部分距离法,对遮挡、噪声效果良好,也可以采用平均距离法
* 匹配过程分为粗匹配和精匹配个过程
* 各函数已经解耦,可以单独调用某个函数以观察hausdorff distance 方法的各部分
********************************************/
#ifndef CHAUSDORFF_H
#define CHAUSDORFF_H
// 最大距离
#define MAX_DISTANCE INT_MAX
#include &cv.h&
class CHausdorff
CHausdorff( IplImage *modelImge, IplImage *srcImg = NULL,
int xInterval = 1, int yInterval = 1,
double frontRange = 0.8, double backRange = 0.7);
~CHausdorff();
void setSourceImage(IplImage *srcImg);
//void setModelImage(IplImage *modelImg);
void setScanInterval_X(int xInterval);
void setScanInterval_Y(int yInterval);
void setFrontRange(double Range);
void setBackRange(double Range);
double computeDirDistance(CvPoint Apoints[], CvPoint Bpoints[], int numA, int numB, double Range)
double distance(CvPoint Apoints[], CvPoint Bpoints[], int numA, int numB)
void match();
void drawMatch(const char *name, IplImage *img = NULL);
int searchPoints(IplImage *img, CvPoint pPoints[])
void sort(double a[],int n)
double meanDistance(double a[], int n)
void createTable();
void freeTable();
//记录匹配结果
CvPoint m_matchP
double m_frontR
double m_backR
//距离变换表指针
double **m_disT
IplImage *m_srcI
IplImage *m_modelI
CHausdorff.cpp文件:
/******************************************
* Copyright (C) 2015 HolaMirai()
* All rights reserved.
* 文件名:hausdorff.cpp
* 摘要:寻找Hausdorff Distance度量的最匹配位置和最匹配位置的距离
* 当前版本:V2.1, 日,HolaMirai, 添加 createTable()、freeTable()函数,添加平均hausdorff距离方法,添加注释
* 历史记录:V2.0, 日,HolaMirai, 调试完成该文件&添加meanDistance()函数
:V1.0, 日, HolaMirai, 创建该文件
******************************************/
* TBD: 1.改用Voronoi图进行Hausdorff距离计算
#include &CHausdorff.h&
#include &highgui.h&
* 函数名称:CHausdorff
* 函数功能:类构造函数
* 函数入口:
* 输入参数: 待匹配图、模板二值化图像,粗匹配横、纵坐标扫描间隔 xInterval,yInterval
前向距离因子 frontRange,后向距离因子 backRange
* 输出参数:无
* 返 回 值:
* 其它说明:
CHausdorff::CHausdorff(IplImage *modelImg, IplImage *srcImg, int xInterval, int yInterval, double frontRange, double backRange)
m_modelImg = cvCloneImage(modelImg);
m_srcImg = cvCloneImage(srcImg);
m_frontRange = frontR
m_backRange = backR
m_xInterval = xI
m_yInterval = yI
createTable();
CHausdorff::~CHausdorff()
freeTable();
m_srcImg = NULL;
cvReleaseImage(&m_modelImg);
* 函数名称:setSourceImage
* 函数功能:设置待匹配图像
* 函数入口:
* 输入参数: 待匹配图像指针
* 输出参数:
* 返 回 值:void
* 其它说明:
void CHausdorff::setSourceImage(IplImage *srcImg)
assert(srcImg-&nChannels == 1);
m_srcImg = srcI
* 函数名称:setModelImage
* 函数功能:设置待模板图像
* 函数入口:
* 输入参数: 模板图像指针
* 输出参数:
* 返 回 值:void
* 其它说明: 若是用查表法计算距离,请不要改变模板图,即不要调用该函数
void CHausdorff::setModelImage(IplImage *modelImg)
assert(modelImg-&nChannels == 1);
m_modelImg = modelI
* 函数名称:setScanInterval_X
* 函数功能:设置粗匹配X坐标扫描间隔
* 函数入口:
* 输入参数: 粗匹配横坐标扫描间隔 xInterval
* 输出参数:无
* 返 回 值:void
* 其它说明:
void CHausdorff::setScanInterval_X(int xInterval)
m_xInterval = xI
* 函数名称:setScanInterval_Y
* 函数功能:设置粗匹配Y坐标扫描间隔
* 函数入口:
* 输入参数: 粗匹配横坐标扫描间隔 yInterval
* 输出参数:无
* 返 回 值:void
* 其它说明:
void CHausdorff::setScanInterval_Y(int yInterval)
m_yInterval = yI
* 函数名称:setFrontRange
* 函数功能:设置前向匹配距离因子
* 函数入口:
* 输入参数: 前向匹配距离因子 Range
* 输出参数:无
* 返 回 值:void
* 其它说明:
void CHausdorff::setFrontRange(double Range)
m_frontRange = R
* 函数名称:setFrontRange
* 函数功能:设置后向匹配距离因子
* 函数入口:
* 输入参数: 前向匹配距离因子 Range
* 输出参数:无
* 返 回 值:void
* 其它说明:
void CHausdorff::setBackRange(double Range)
m_backRange = R
* 函数名称:searchPoints
* 函数功能:获得特征点坐标和特征点的个数
* 函数入口:
* 输入参数: 灰度图 img, 接受特征点的数组指针
* 输出参数:无
* 返 回 值: 特征点个数
* 其它说明: 支持图片 ROI
int CHausdorff::searchPoints(IplImage *img, CvPoint pPoints[]) const
if ( !img-&roi)
rect.x = 0;
rect.y = 0;
rect.width = img-&
rect.height = img-&
rect.x = img-&roi-&xO
rect.y = img-&roi-&yO
rect.width = img-&roi-&
rect.height = img-&roi-&
//统计特征点
int num = 0;
for (int i = rect.y; i & rect.y + rect. i++)
ptr = (uchar *) (img-&imageData + i * img-&widthStep);
for (int j = rect.x; j & rect.x + rect. j++)
if (ptr[j] != 0)
if (num == 0)
for (int i = rect.y; i & rect.y + rect. i++)
ptr = (uchar *) (img-&imageData + i * img-&widthStep);
for (int j = rect.x; j & rect.x + rect. j++)
if (ptr[j] != 0)
pPoints[num].x = j - rect.x;
pPoints[num].y = i - rect.y;
//结果返回
}/*searchPoints()*/
* 函数名称:match
* 函数功能:利用 Hausdorff distance 值来匹配图片
* 函数入口:
* 输入参数:无
* 输出参数:最佳匹配位置 和最佳匹配距离
* 返 回 值: void
* 其它说明:
void CHausdorff::match()
int ws, hs, wm, hm, numModel, numS
double *matchDis = new double[100];
//假定最大会有100个最佳位置,这里并未实现,留着以后改进
CvPoint *matchPoints = new CvPoint[100];
double temp = MAX_DISTANCE;
double dis = MAX_DISTANCE;
int n = 0;
//只有一个最佳位置,本文的假设前提
ws = m_srcImg-&
hs = m_srcImg-&
wm = m_modelImg-&
hm = m_modelImg-&
// 存储模板特征点和原图像特征点
CvPoint *pMPoints = new CvPoint[wm * hm];
CvPoint *pSPoints = new CvPoint[wm * hm];
//获得模板特征点
numModel = searchPoints(m_modelImg,pMPoints);
if (numModel == 0)
printf_s(&find no points in model&);
//搜索最佳匹配
rect.width =
rect.height =
//#pragma omp parallel for firstprivate(m_srcImg)
//并行运算
for (int i = 0; i & i += m_xInterval)
//#pragma omp parallel for
for (int j = 0; j & j += m_yInterval)
cvSetImageROI(m_srcImg,rect);
numSrc = searchPoints(m_srcImg,pSPoints);
if (numSrc == 0)
// 特征点数据量相差太大则忽略该位置,可以依具体情况调整参数
if (double(numSrc)/numModel & 0.8 || (double)numSrc/numModel & 1.25)
temp = distance(pMPoints, pSPoints, numModel, numSrc);
if (temp & dis)
matchDis[n] =
matchPoints[n].x =
matchPoints[n].y =
for (int i = matchPoints[n].x - m_xI i & matchPoints[n].x + m_xI i++)
for (int j = matchPoints[n].y - m_yI j & matchPoints[n].y + m_yI j++)
cvSetImageROI(m_srcImg,rect);
numSrc = searchPoints(m_srcImg,pSPoints);
if (numSrc == 0)
temp = distance(pMPoints, pSPoints, numModel, numSrc);
if (temp & dis)
matchDis[n] =
matchPoints[n].x =
matchPoints[n].y =
m_matchPoint = matchPoints[0];
m_matchDistance = matchDis[0];
cvResetImageROI(m_srcImg);
delete []pMP
delete []pSP
delete []matchD
delete []matchP
}/* match() */
* 函数名称:distance
* 函数功能:获取某位置的Hausdorff distance值
* 函数入口:
* 输入参数:两组特征点数组指针,特征点个数 numA, numB
* 输出参数:
* 返 回 值: 该位置的Hausdorff distance值
* 其它说明: 支持图片ROI
double CHausdorff::distance(CvPoint Apoints[], CvPoint Bpoints[], int numA, int numB) const
double hAB;
double hBA;
hAB = computeDirDistance(Apoints, Bpoints, numA, numB, m_frontRange);
hBA = computeDirDistance(Bpoints, Apoints, numB, numA, m_backRange);
// H(A, B) = max(h(A, B), h(B,A))
return std::max(hAB, hBA);
}/*distance()*/
* 函数名称:computeDirDistance
* 函数功能:计算单向 Hausdorff distance 值
* 函数入口:
* 输入参数:两组特征点数组指针 Apoints, Bpoints, 特征点个数numA, int numB, 单向距离因子 Range
* 输出参数:
* 返 回 值: 单向 Hausdorff distance 值
* 其它说明:
double CHausdorff::computeDirDistance(CvPoint Apoints[], CvPoint Bpoints[], int numA, int numB, double Range) const
double *disA = new double[numA];
double aB = MAX_DISTANCE;
for (int i = 0; i & numA; i++)
for (int j = 0; j & numB; j++)
temp = (Apoints[i].x - Bpoints[j].x) * (Apoints[i].x - Bpoints[j].x)
+ (Apoints[i].y - Bpoints[j].y) * (Apoints[i].y - Bpoints[j].y);
//或者使用查表法
//temp = m_disTable[abs(Apoints[i].x - Bpoints[j].x)][abs(Apoints[i].y - Bpoints[j].y)];
// while b in B, get min|| a - b ||
aB = std::min(temp,aB);
disA[i] = aB;
// 注意下面这条语句
aB = MAX_DISTANCE;
sort(disA, numA);
// hausdorff 距离改进版:部分hausdorff距离
dis = disA[(int)(numA * Range) - 1];
// 也可以尝试平均距离:meanDistance(),使用meanDistance()则不需要对距离数组排序
// dis = meanDistance(disA, numA);
delete []disA;
}/*computeDirDistance()*/
* 函数名称:drawMatch()
* 函数功能:在待匹配图中画出匹配结果区域
* 函数入口:
* 输入参数: img指针默认指向m_srcImg,可以将待匹配图像的jpeg格式图像指针传入,以使结果更加直观
* 输出参数:
* 返 回 值: void
* 其它说明:
void CHausdorff::drawMatch(const char *name, IplImage *img)
pt.x = m_matchPoint.x + m_modelImg-&
pt.y = m_matchPoint.y + m_modelImg-&
img = m_srcI
cvRectangle(img, m_matchPoint, pt, cvScalar(0,0,255));
cvShowImage(name, img);
* 函数名称:sort
* 函数功能:对数组进行升序排序
* 函数入口:
* 输入参数:待排序数组指针及数组个数
* 输出参数:
* 返 回 值: void
* 其它说明:
void CHausdorff::sort(double a[],int n) const //升序
for(int i=0;i&n;i++)
for(int j=i+1;j&n;j++)
if(a[i]&a[j])
temp=a[i];
a[i]=a[j];
* 函数名称:meanDistance
* 函数功能:对距离数组求平均值
* 函数入口:
* 输入参数:距离数组指针及数组个数
* 输出参数:
* 返 回 值: 距离数组的平均值
* 其它说明:
double CHausdorff::meanDistance(double a[], int n) const
double sum = 0;
for (int i = 0; i & i++)
sum += a[i];
* 函数名称:createTable
* 函数功能:创建距离变换表
* 函数入口:
* 输入参数:NULL
* 输出参数:距离变换表的指针
* 返 回 值: void
* 其它说明:
void CHausdorff::createTable()
int wm, hm,
wm = m_modelImg-&
hm = m_modelImg-&
r = std::max(wm,hm);
m_disTable = new double*[r];
for (int i = 0; i & i++)
m_disTable[i] = new double[r];
for (int j = 0; j & j++)
for(int i = 0; i & i++)
m_disTable[j][i] = i*i + j*j;
m_disTable[i][j] = m_disTable[j][i];
* 函数名称:freeTable
* 函数功能:释放距离变换表内存
* 函数入口:
* 输入参数:
* 输出参数:
* 返 回 值: void
* 其它说明:
void CHausdorff::freeTable()
int wm, hm,
wm = m_modelImg-&
hm = m_modelImg-&
r = std::max(wm,hm);
for (int i = 0; i & i++)
delete []m_disTable[i];
delete []m_disT
CFeatures类定义
CFeatures.h文件
/******************************************
* Copyright (C) 2015 HolaMirai()
* All rights reserved.
* 文件名:CFeatures.h
* 摘要:图像前置处理,用于获取特征点
* 当前版本:V1.0,日,HolaMirai,创建该文件
* 历史记录:...
******************************************/
* BUG: 1.使用HARRIS、SIFT、SURF提取特征点时,Debug版本耗时非常长,release版本正常
2.使用HARRIS、SIFT、SURF提取特征点时,CFeatures类不能正确析构,初步判断是dll和EXE堆释放错误,
而且出错点很可能是 m_vecPoints向量问题
* 类定义说明
/********************************************
* CFeatures类
* CFeatures类接受一个int值,表示特征点类型
* 使用getFeatures()函数可以得到特征点的二值化图像
* 一个工程只需定义一个CFeatures类的实例
********************************************/
#ifndef CFEATURES_H
#define CFEATURES_H
* 特征点类型
enum feature_type
FEATURE_CANNY,
//特征点为CANNY边缘点
FEATURE_HARRIS,
//特征点为Harris特征点
FEATURE_SIFT,
//特征点为SIFT特征点
FEATURE_SURF,
//特征点为SURF特征点
#include &cv.h&
#include &vector&
class CFeatures
CFeatures(int feature_type);
~CFeatures();
void getFeatures(IplImage *grayImg, IplImage *featuresImg);
void drawFeatures(const char *name, IplImage *img);
void vecPointsToImage(IplImage *featuresImg);
IplImage *m_featuresI
IplImage *m_imgS
std::vector&cv::KeyPoint& m_vecP
#endifCFeatures.cpp文件
/******************************************
* Copyright (C) 2015 HolaMirai()
* All rights reserved.
* 文件名:CFeatures.cpp
* 摘要:图像前置处理,用于获取特征点
* 当前版本:V2.0,日,HolaMirai,完成四种特征点获取方法
* 历史记录:V1.0,日,HolaMirai,创建该文件
******************************************/
#include &CFeatures.h&
#include &highgui.h&
#include &opencv2/nonfree/nonfree.hpp&
/***********************************************/
* 函数名称:CFeatures
* 函数功能:CFeatures类构造函数
* 函数入口:
* 输入参数: 需要获取的特征点的特征点类型,值为enum feature_type其中一个
* 输出参数:无
* 返 回 值:
* 其它说明:
CFeatures::CFeatures(int feature_type)
m_type = feature_
initModule_nonfree();//if use SIFT or SURF
* 函数名称:~CFeatures
* 函数功能:CFeatures类析构函数
* 函数入口:
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
CFeatures::~CFeatures()
* 函数名称:getFeatures
* 函数功能:获取特征点
* 函数入口:
* 输入参数: 待搜索图像的灰度图 grayImg 指针, 接受特征点的灰度图像指针 featuresImg, featuresImg与 grayImg尺寸相同
* 输出参数:特征点的灰度图像 featuresImg
* 返 回 值:
* 其它说明:
void CFeatures::getFeatures(IplImage *grayImg, IplImage *featuresImg)
switch (m_type)
case FEATURE_CANNY:
assert(grayImg-&width == featuresImg-&width &&
grayImg-&height == featuresImg-&height &&
grayImg-&nChannels == grayImg-&nChannels);
cvCanny(grayImg,featuresImg,50,150);
case FEATURE_HARRIS:
Ptr&FeatureDetector& detector = FeatureDetector::create( &HARRIS& );
//特征点寻找
detector-&detect(grayImg, m_vecPoints);
vecPointsToImage(featuresImg);
case FEATURE_SIFT:
Ptr&FeatureDetector& detector = FeatureDetector::create( &SIFT& );
//特征点寻找
detector-&detect(grayImg, m_vecPoints);
vecPointsToImage(featuresImg);
case FEATURE_SURF:
Ptr&FeatureDetector& detector = FeatureDetector::create( &SURF& );
//特征点寻找
detector-&detect(grayImg, m_vecPoints);
vecPointsToImage(featuresImg);
} /*getFeatures()*/
* 函数名称:vecPointsToImage
* 函数功能:将vector类型的特征点变换成 IplImage 图像类型
* 函数入口:
* 输入参数: 特征点向量m_vecPoints, 接受特征点的灰度图像指针 featuresImg
* 输出参数:特征点的灰度图像 featuresImg
* 返 回 值:
* 其它说明:
void CFeatures::vecPointsToImage(IplImage *featuresImg)
vector&KeyPoint&::
vector&KeyPoint&::iterator end_it = m_vecPoints.end();
cvZero(featuresImg);
for (it = m_vecPoints.begin(); it != end_ it++)
w= (int)it-&pt.x;
h = (int)it-&pt.y;
ptr = (uchar *)(featuresImg-&imageData + h*featuresImg-&widthStep + w);
// 特征点置255,其他置0
*ptr = 255;
ptr = NULL;
}/*vecPointsToImage()*/
* 函数名称:drawFeatures
* 函数功能:画出特征点
* 函数入口:
* 输入参数: 显示窗口 name, 在哪副图像上画出特征点的图像指针 img
* 输出参数:
* 返 回 值:void
* 其它说明:画出的是最近一次处理的图片的特征点
void CFeatures::drawFeatures(const char *name, IplImage *img)
IplImage *m_imgShow = cvCloneImage(img);
vector&KeyPoint&::
vector&KeyPoint&::iterator end_it = m_vecPoints.end();
for (it = m_vecPoints.begin(); it != end_ it++)
center.x = (int)it-&pt.x;
= (int)it-&pt.y;
cvCircle(m_imgShow,center,3,cvScalar(rand()%255,rand()%255,rand()%255));
cvShowImage(name,m_imgShow);
cvReleaseImage(&m_imgShow);
}/*drawFeatures()*/
测试程序文件
huas.cpp代码
/******************************************
* Copyright (C) 2015 HolaMirai()
* All rights reserved.
* 文件名:haus.cpp
* 摘要:包含main函数的主文件,用于测试CHausdorff类, CFeatures类
* 当前版本:V2.0,日,添加CFeatures类,并使用CFeatures类来获取特征点
* 历史记录:V1.0,日,HolaMirai,创建该文件
******************************************/
#include &opencv2/opencv.hpp&
#include &iostream&
#include &CHausdorff.h&
#include &CFeatures.h&
#include &windows.h&
//单张图片匹配
void main()
char srcName[] = &sg.jpg&;
char modelName[] = &sgt.jpg&;
IplImage *srcColor = cvLoadImage(srcName,1);
IplImage *modelColor = cvLoadImage(modelName,1);
IplImage *srcGray = cvLoadImage(srcName,0);
IplImage *modelGray = cvLoadImage(modelName,0);
IplImage *srcFeat = cvCreateImage(cvGetSize(srcGray),IPL_DEPTH_8U,1);
IplImage *modelFeat = cvCreateImage(cvGetSize(modelGray),IPL_DEPTH_8U,1);
CFeatures features(FEATURE_HARRIS);
features.getFeatures(srcGray,srcFeat);
features.drawFeatures(&src&,srcColor);
features.getFeatures(modelGray,modelFeat);
features.drawFeatures(&model&,modelColor);
CHausdorff haus(modelFeat,srcFeat,8,8);
DWORD start_t = GetTickCount();
haus.match();
DWORD end_t = GetTickCount();
cout&&&匹配耗时:&&&end_t - start_t&&&ms&&&
haus.drawMatch(&resultMatch&,srcColor);
cvWaitKey(0);
//system(&pause&);
cvReleaseImage(&srcColor);
cvReleaseImage(&modelColor);
cvReleaseImage(&srcGray);
cvReleaseImage(&modelGray);
cvReleaseImage(&srcFeat);
cvReleaseImage(&modelFeat);
cvDestroyAllWindows();
//从相机中获取图像连续匹配
void main()
char modelName[] = &m1.jpg&;
CvCapture *capture = cvCreateCameraCapture(0);
IplImage *srcColor = cvQueryFrame(capture);
IplImage *modelColor = cvLoadImage(modelName,1);
IplImage *srcGray = cvCreateImage(cvGetSize(srcColor),IPL_DEPTH_8U,1);
IplImage *modelGray = cvLoadImage(modelName,0);
IplImage *srcFeat = cvCreateImage(cvGetSize(srcColor),IPL_DEPTH_8U,1);
IplImage *modelFeat = cvCreateImage(cvGetSize(modelColor),IPL_DEPTH_8U,1);
CFeatures features(FEATURE_HARRIS);
features.getFeatures(modelGray,modelFeat);
char winSrc[] = &src&;
cvNamedWindow(&src&,1);
CHausdorff haus(modelFeat,NULL,8,8);
for (int i = 0; i & 30; i++)
srcColor = cvQueryFrame(capture);
cvShowImage(winSrc,srcColor);
cvWaitKey(30);
while (cvWaitKey(30) != 'q')
srcColor = cvQueryFrame(capture);
cvCvtColor(srcColor,srcGray,CV_BGR2GRAY);
features.getFeatures(srcGray,srcFeat);
haus.setSourceImage(srcFeat);
DWORD start_t = GetTickCount();
haus.match();
DWORD end_t = GetTickCount();
cout&&&匹配耗时:&&&end_t - start_t&&&ms&&&
haus.drawMatch(&resultMatch&,srcColor);
cvWaitKey(0);
//system(&pause&);
cvReleaseImage(&srcColor);
cvReleaseImage(&modelColor);
cvReleaseImage(&srcGray);
cvReleaseImage(&modelGray);
cvReleaseImage(&srcFeat);
cvReleaseImage(&modelFeat);
cvDestroyAllWindows();
使用Harris特征点进行匹配,release版本耗时为203ms,基本可以满足实时性要求
输入带匹配图和模板图,结果如下图所示:
&转载请注明作者和出处:,未经允许请勿用于商业用途
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13433次
排名:千里之外
原创:25篇
转载:12篇
(3)(1)(1)(4)(4)(2)(4)(5)(3)(9)(2)(1)(1)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
Hausdorff距离的计算原理及其在二维匹配中的应用.pdf75页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:200 &&
Hausdorff距离的计算原理及其在二维匹配中的应用.pdf
你可能关注的文档:
··········
··········
硕士学位论文 应用 andIts ofHausdorffDistance
TheCalculation Application Theory tothe of2DGeometrical Matching Objects 作者姓名: 重复惠.. 学科、专业:扭越剑造巫墓自动丝 学 号: 座机电话号码 指导教师: 重型堑.麴攮 完成日期: 2Q!三生§旦 大连理工大学 Dalian of UniversityTechnology ㈣㈣㈣㈣㈣一 Y241 4843 大连理工大学学位论文独创性声明 作者郑重声明:所呈交的学位论文,是本人在导师的指导下进行研究
工作所取得的成果。尽我所知,除文中已经注明引用内容和致谢的地方外,
本论文不包含其他个人或集体已经发表的研究成果,也不包含其他已申请
学位或其他用途使用过的成果。与我一同工作的同志对本研究所做的贡献
均已在论文中做了明确的说明并表示了谢意。 若有不实之处,本人愿意承担相关法律责任。
学位论文题目:也盘鲢虫蚕酶盘童&涩丛生兰霾出鳢囱垂虱
作者签名:
.缮氲靠 日期:鲨!圣 年―L月上日 大连理工大学硕士学位论文 摘
要 Hausdorff距离作为一种相似性度量广泛用于众多工程领域;如模式识别、图像匹
配、机器人路径规划、CAD/CAM和触觉仿真中,对物体间的碰撞干涉检测和反馈力的计
算、曲线、曲面逼近中构造优化目标和评价逼近程度等领域。Hausdorff距离在离散几
何对象,如图像匹配方面应用的研究较早也较为成熟。随着计算机图像处理技术的发展,
新的更加智能的匹配算法不断涌现出来。与图像处理领域中Hausdorff距离的应用研究
形成鲜明对比的是,针对Hausdorff距离在连续几何对象方面的应用研究较少,截止目
前,只有少数学者对自由曲线或曲面间的Hausdorff距离的精确计算进行过研究。
理,而后分别研究了其在离散几何对象和连续几何对象方面
正在加载中,请稍后...

我要回帖

更多关于 hausdorff空间 的文章

 

随机推荐