HausDorff距离计算源代码
HausDorff距离计算源代码【自己写的,分享】
由 heyoup ? 2010-04-29 11:49
CommonHeader.h
代码: 全选
#include
#include
#include
#include
#include
#define VERYBIG (10000);
HausDorffComputer.h
代码: 全选
#include "CommonHeader.h"
#pragma once
class HausDorffComputer
{
public:
HausDorffComputer(void);
HausDorffComputer(IplImage * imageA,IplImage * imageB,double rho,double
beta,int imageAScanInterval=0,int imageBScanInterval=0);
~HausDorffComputer(void);
void SetImageA(IplImage * image);
void SetImageB(IplImage * image);
void SetRho(double rho);
void SetBeta(double beta);
void SetImageAScanInterval(int interval);
void SetImageBScanInterval(int interval);
double GetHausDorffValue();
private:
IplImage * mImageA;
IplImage * mImageB;
double mRho;
double mBeta;
int mImageAScanInterval;
int mImageBScanInterval;
};
HausDorffComputer.cpp
代码: 全选
#include "HausDorffComputer.h"
#include "CommonHeader.h"
HausDorffComputer::HausDorffComputer(void) {
this->mImageA=0;
this->mImageB=0;
this->mRho=0;
this->mBeta=0;
}
HausDorffComputer::HausDorffComputer(IplImage * imageA,IplImage *
imageB,double rho,double beta,int imageAScanInterval,int
imageBScanInterval)
{
this->mImageA=imageA;
this->mImageB=imageB;
this->mRho=rho;
this->mBeta=beta;
this->mImageAScanInterval=imageAScanInterval;
this->mImageBScanInterval=imageBScanInterval; }
HausDorffComputer::~HausDorffComputer(void) {
}
void HausDorffComputer::SetImageA(IplImage * image) {
this->mImageA=image;
}
void HausDorffComputer::SetImageB(IplImage * image) {
this->mImageB=image;
}
void HausDorffComputer::SetRho(double rho) {
this->mRho=rho;
}
void HausDorffComputer::SetBeta(double beta) {
this->mBeta=beta;
}
void HausDorffComputer::SetImageAScanInterval(int interval)
{
this->mImageAScanInterval=interval; }
void HausDorffComputer::SetImageBScanInterval(int interval)
{
this->mImageBScanInterval=interval; }
double HausDorffComputer::GetHausDorffValue() {
int AWPointAmount=0;
for(int i=0;imImageA->width;i++)
{
for(int j=0;jmImageA->height;j++)
{
if((uchar)(this->mImageA->imageData[j*this->mImageA->width+i])=
=255)
{
AWPointAmount++;
}
}
}
CvPoint * AWPoints=new CvPoint[AWPointAmount];//此处应小心
AWPointAmount为0
AWPointAmount=0;
for(int i=0;imImageA->width;i++)
{
for(int j=0;jmImageA->height;j++)
{
if((uchar)(this->mImageA->imageData[j*this->mImageA->width+i])=
=255)
{
AWPoints[AWPointAmount].x=i;
AWPoints[AWPointAmount].y=j;
AWPointAmount++;
}
}
}
int BWPointAmount=0;
for(int i=0;imImageB->width;i++)
{
for(int j=0;jmImageB->height;j++)
{
if((uchar)(this->mImageB->imageData[j*this->mImageB->width+i])=
=255)
{
BWPointAmount++;
}
}
}
CvPoint * BWPoints=new CvPoint[BWPointAmount];//此处应小心
BWPointAmount为0
BWPointAmount=0;
for(int i=0;imImageB->width;i++)
{
for(int j=0;jmImageB->height;j++)
{
if((uchar)(this->mImageB->imageData[j*this->mImageB->width+i])=
=255)
{
BWPoints[BWPointAmount].x=i;
BWPoints[BWPointAmount].y=j;
BWPointAmount++;
}
}
}
int fitPointAmount=0;
double sumDistance=0;
#pragma omp parallel for reduction(+:sumDistance,fitPointAmount)
for(int
i=0;imImageAScanInterval==0?1:this->mImageAScan
Interval))
{
double minDistance=VERYBIG;
double tempDistance=0;
#pragma omp parallel for firstprivate(tempDistance)
for(int
j=0;jmImageBScanInterval==0?1:this->mImageBScan
Interval))
{
tempDistance=sqrt((double)((AWPoints[i].x-BWPoints[j].x)*(AWPoi
nts[i].x-BWPoints[j].x)+(AWPoints[i].y-BWPoints[j].y)*(AWPoints[i].y-BWP
oints[j].y)));
#pragma omp critical
minDistance=minDistancemBeta)
{
fitPointAmount++;
sumDistance+=minDistance;
}
}
if(fitPointAmount==0)
{
delete[] AWPoints;
delete[] BWPoints;
return VERYBIG
}
double
distanceAToB=pow((double)AWPointAmount/(double)fitPointAmount,this->mRho
)*sumDistance/(double)fitPointAmount;
fitPointAmount=0;
sumDistance=0;
#pragma omp parallel for reduction(+:sumDistance,fitPointAmount)
for(int
i=0;imImageBScanInterval==0?1:this->mImageBScanInterval))
{
double minDistance=VERYBIG;
double tempDistance=0;
#pragma omp parallel for firstprivate(tempDistance)
for(int
j=0;jmImageAScanInterval==0?1:this->mImageAScanInterval))
{
tempDistance=sqrt((double)((BWPoints[i].x-AWPoints[j].x)*(BWPoints[i].x-AWPoints[j].x)+(BWPoints[i].y-AWPoints[j].y)*(BWPoints[i].y-AWPoints[j].y)));
#pragma omp critical
minDistance=minDistancemBeta)
{
fitPointAmount++;
sumDistance+=minDistance;
}
}
if(fitPointAmount==0)
{
delete[] AWPoints;
delete[] BWPoints;
return VERYBIG
}
double
distanceBToA=pow((double)AWPointAmount/(double)fitPointAmount,this->mRho)*sumDistance/(double)fitPointAmount;
return distanceAToB>distanceBToA?distanceAToB:distanceBToA; }