#include "math.h"
#include "Utility.h"
#include "Hog.h"
const double PI = 3.141592;
CHoG::CHoG(void)
{
m_iWindowSize = 64;
m_iBlockSize = 16;
m_iCellSize = 8;
m_iOrientationBins = 9;
m_pCellOrientationBins = new double[m_iOrientationBins * m_iOrientationBins];
m_pBlcokOrientationBins = new double[m_iBlockSize * m_iBlockSize];
m_pWindowOrientationBins = new double[m_iWindowSize * m_iWindowSize];
for (int i = 0; i < m_iWindowSize * m_iWindowSize; ++i)
{
m_pWindowOrientationBins[i] = 0.00;
}
m_pOrientationRegions = new double[m_iOrientationBins + 1];
for (int i = 0; i < m_iOrientationBins; ++i)
{
m_pOrientationRegions[i] = i % m_iOrientationBins * PI;
}
m_pOrientationRegions[m_iOrientationBins] = PI;
m_pGray = NULL;
m_pNormalizedSize = NULL;
m_pGradientX = NULL;
m_pGradientY = NULL;
m_pOrietation = NULL;
m_pMagnitude = NULL;
m_pBlcokOrientation = NULL;
m_pBlockMagnitude = NULL;
m_pWeightedMagnitudeBlock = NULL;
m_pCellOrientation = NULL;
m_pCellMagnitude = NULL;
}
CHoG::~CHoG(void)
{
//delete []m_pCellOrientation;
delete []m_pCellOrientationBins;
delete []m_pBlcokOrientationBins;
delete []m_pWindowOrientationBins;
delete []m_pOrientationRegions;
if(m_pGray)
{
cvReleaseImage(&m_pGray);
m_pGray = NULL;
}
if(m_pNormalizedSize)
{
cvReleaseImage(&m_pNormalizedSize);
m_pNormalizedSize = NULL;
}
if(m_pGradientX)
{
cvReleaseImage(&m_pGradientX);
m_pGradientX = NULL;
}
if(m_pGradientY)
{
cvReleaseImage(&m_pGradientY);
m_pGradientY = NULL;
}
if(m_pOrietation)
{
cvReleaseImage(&m_pOrietation);
m_pOrietation = NULL;
}
if(m_pMagnitude)
{
cvReleaseImage(&m_pMagnitude);
m_pMagnitude = NULL;
}
if (m_pBlcokOrientation)
{
cvReleaseImage(&m_pBlcokOrientation);
m_pBlcokOrientation = NULL;
}
if(m_pBlockMagnitude)
{
cvReleaseImage(&m_pBlockMagnitude);
m_pBlockMagnitude = NULL;
}
if(m_pWeightedMagnitudeBlock)
{
cvReleaseImage(&m_pWeightedMagnitudeBlock);
m_pWeightedMagnitudeBlock = NULL;
}
if(m_pCellOrientation)
{
cvReleaseImage(&m_pCellOrientation);
m_pCellOrientation = NULL;
}
if(m_pCellMagnitude)
{
cvReleaseImage(&m_pCellMagnitude);
m_pCellMagnitude = NULL;
}
}
void CHoG::Init(const IplImage* pSrc)
{
assert(NULL != pSrc);
m_pGray = cvCreateImage(cvGetSize(pSrc), IPL_DEPTH_8U, 1);
if (1 == pSrc->nChannels)
{
cvCopy(pSrc, m_pGray);
}
else
{
cvCvtColor(pSrc, m_pGray, CV_RGB2GRAY);
}
m_pBlcokOrientation = cvCreateImage(cvSize(m_iBlockSize, m_iBlockSize), IPL_DEPTH_32F, 1);
m_pBlockMagnitude = cvCreateImage(cvSize(m_iBlockSize, m_iBlockSize), IPL_DEPTH_32F, 1);
m_pWeightedMagnitudeBlock = cvCreateImage(cvSize(m_iBlockSize, m_iBlockSize), IPL_DEPTH_32F, 1);
m_pCellOrientation = cvCreateImage(cvSize(m_iCellSize, m_iCellSize), IPL_DEPTH_32F, 1);
m_pCellMagnitude = cvCreateImage(cvSize(m_iCellSize, m_iCellSize), IPL_DEPTH_32F, 1);
// + [3/1/2012 Michael]
// Fix Me:
// Forgot to init Gaussian Template.
/*
CreateGuassianTemplate
*/
// - [3/1/2012 Michael]
NormalizeSize();
CalculateXYGradient();
CalculateOrientationAndMagnitudeMap();
int _iBlockRowNum = m_iWindowSize / m_iCellSize - 1;
int _iBlockColNum = m_iWindowSize / m_iCellSize - 1;
for (int j = 0; j < _iBlockRowNum; ++j)
{
for (int i = 0; i < _iBlockColNum; ++i)
{
CopyBlockOrientation(j, i);
CopyBlockMagnitude(j, i);
CalculateWeightedMagnitudeBlock();
CalculateBlockHistogram();
// + [3/1/2012 Michael]
// Fix me:
// Forgot to do Block Normalization.
/*
NormalizeBlcokHistogramL1Sqrt
*/
// - [3/1/2012 Michael]
}
}
CvScalar _sValue;
for (int i = 0; i < m_iWindowSize; ++i)
{
for (int j = 0; j < m_iWindowSize; ++j)
{
_sValue = cvGet2D(m_pOrietation, i, j);
m_pWindowOrientationBins[i * m_iWindowSize + j] = _sValue.val[0];
}
}
}
void CHoG::NormalizeSize(void)
{
m_pNormalizedSize = cvCreateImage(cvSize(m_iWindowSize, m_iWindowSize), IPL_DEPTH_8U, 1);
assert(NULL != m_pGray);
assert(NULL != m_pNormalizedSize);
cvResize(m_pGray, m_pNormalizedSize, CV_INTER_CUBIC);
}
void CHoG::CalculateXYGradient(void)
{
if (m_pGradientX)
{
cvReleaseImage(&m_pGradientX);
m_pGradientX = NULL;
}
if (m_pGradientY)
{
cvReleaseImage(&m_pGradientY);
m_pGradientY = NULL;
}
m_pGradientX = cvCreateImage(cvGetSize(m_pNormalizedSize), IPL_DEPTH_32F, 1);
assert(NULL != m_pGradientX);
m_pGradientY = cvCreateImage(cvGetSize(m_pNormalizedSize), IPL_DEPTH_32F, 1);
assert(NULL != m_pGradientY);
const int _HEIGHT = m_pNormalizedSize->height;
const int _WIDTH = m_pNormalizedSize->width;
int _iXPrevCoordinate = 0;
int _iXBackCoordinate = 0;
int _iYPrevCoordinate = 0;
int _iYBackCoordinate = 0;
double _dXDifference = 0.00;
double _dYDifference = 0.00;
CvScalar _sXPrev;
CvScalar _sXBack;
CvScalar _sXDifference;
CvScalar _sYPrev;
CvScalar _sYBack;
CvScalar _sYDifference;
for (int i = 0; i < _HEIGHT; ++i)
{
for (int j = 0; j < _WIDTH; ++j)
{
_iXPrevCoordinate = j - 1;
if (_iXPrevCoordinate < 0)
{
_iXPrevCoordinate = 0;
}
_iXBackCoordinate = j + 1;
if (_iXBackCoordinate >= _WIDTH)
{
_iXBackCoordinate = _WIDTH - 1;
}
_sXPrev = cvGet2D(m_pNormalizedSize, i, _iXPrevCoordinate);
_sXBack = cvGet2D(m_pNormalizedSize, i, _iXBackCoordinate);
_dXDifference = _sXBack.val[0] - _sXPrev.val[0];
_sXDifference.val[0] = _dXDifference;
cvSet2D(m_pGradientX, i, j, _sXDifference);
//////////////////////////////////////////////////////////////////////////
//
_iYPrevCoordinate = i - 1;
if (_iYPrevCoordinate < 0)
{
_iYPrevCoordinate = 0;
}
_iYBackCoordinate = i + 1;
if (_iYBackCoordinate >= _HEIGHT)
{
_iYBackCoordinate = _HEIGHT - 1;
}
_sYPrev = cvGet2D(m_pNormalizedSize, _iYPrevCoordinate, j);
_sYBack = cvGet2D(m_pNormalizedSize, _iYBackCoordinate, j);
_dYDifference = _sYBack.val[0] - _sYPrev.val[0];
_sYDifference.val[0] = _dYDifference;
cvSet2D(m_pGradientY, i, j, _sYDifference);
}
}
}
void CHoG::CreateGuassianTemplate()
{
const double _dSigma = CalculateSigma(m_iBlockSize);
if (_dSigma < 0.00)
{
return;
}
const double _PI = 3.141592;
const double _dCenterX = double(m_iBlockSize) / 2.00 - 1.00;
const double _dCenterY = double(m_iBlockSize) / 2.00 - 1.00;
double _dDistance = 0.00;
double _dGaussian = 0.00;
double _dSum = 0.00;
for (int i = 0; i < m_iBlockSize; ++i)
{
for (int j = 0; j < m_iBlockSize; ++j)
{
_dDistance = (double(i) - _dCenterY) * (double(i) - _dCenterY) + (double(j) - _dCenterX) * (double(j) - _dCenterX);
_dGaussian = (1.00 / (2.00 * _PI * (_dSigma * _dSigma))) * exp(-_dDistance / (2.00 * _dSigma * _dSigma));
m_caGaussianWeightedWindow[i][j] = _dGaussian;
_dSum += _dGaussian;
}
}
//Normalize template.
if (abs(_dSum) > 0.00)
{
for (int i = 0; i < m_iBlockSize; ++i)
{
for (int j = 0; j < m_iBlockSize; ++j)
{
m_caGaussianWeightedWindow[i][j] = m_caGaussianWeightedWindow[i][j] / _dSum;
}
}
}
else
{
for (int i = 0; i < m_iBlockSize; ++i)
{
for (int j = 0; j < m_iBlockSize; ++j)
{
m_caGaussianWeightedWindow[i][j] = 0.00;
}
}
}
}
double CHoG::CalculateSigma(const int iTemplateSize)
{
if (iTemplateSize < 0)
{
return -1.00;
}
return ((double(iTemplateSize) / 2.00 - 1.00) * 0.30 + 0.8);
}
void CHoG::CalculateOrientationAndMagnitudeMap()
{
CvScalar _sGradientX;
CvScalar _sGradientY;
CvScalar _sAngle;
CvScalar _sMagnitude;
double _dAngle = 0.00;
double _dMagnitude = 0.00;
double _dGradientY = 0.00;
double _dGradientX = 0.00;
m_pOrietation = cvCreateImage(cvGetSize(m_pNormalizedSize), I
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
/* 作者: Michael Chen /* Email: 1241159842@qq.com /* QQ: 1241159842 /* 日期: 2012/03/08 /* 环境: VS2008+OpenCV2.1 /* 功能: 使用HoG和欧氏距离做的一个图像搜索的小应用。输入一副目标图像,在目标文件夹中进行匹配, /* 为了更好的查看结果和分析,本例子还对每次匹配结果进行保存,最后输出到文件。欢迎交流。
资源推荐
资源详情
资源评论
收起资源包目录
HoGMatch.rar (23个子文件)
HoGMatch
HoGMatch.suo 18KB
HoGMatch
Match.h 435B
GrayImage.cpp 707B
HoG.h 2KB
Utility.cpp 1KB
Distance.cpp 96B
Unit.cpp 343B
Search.h 599B
EuclideanDistance.h 333B
HoGMatch.vcproj.Michael-PC.Michael.user 1KB
HoGMatch.vcproj 5KB
Distance.h 195B
Utility.h 335B
Unit.h 254B
Search.cpp 3KB
HoG.cpp 13KB
GrayImage.h 233B
main.cpp 973B
EuclideanDistance.cpp 2KB
IFeature.h 250B
IFeature.cpp 90B
Match.cpp 4KB
HoGMatch.sln 890B
共 23 条
- 1
资源评论
- nanjingrenwei2013-11-13听具有参考价值的,不错。
- gengboting42012-04-25算法很独特,可以运行,学习了
极乐净土0822
- 粉丝: 194
- 资源: 54
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功