#include "stdafx.h"
|
#include "EdgeFind.h"
|
|
CEdgeFind::CEdgeFind(void)
|
{
|
}
|
|
CEdgeFind::~CEdgeFind(void)
|
{
|
}
|
|
int CEdgeFind::ImageProjection(BYTE* pBuff, int nWidth, int nHeight, CRect ROI, int nThres, int nDist, int nContinue)
|
{
|
//¿¹¿Üó¸®
|
if(pBuff == NULL || nWidth <= 0 || nHeight <= 0)
|
return -1;
|
|
int nSumLength = ROI.Height();
|
int nProjectionLength = ROI.Width();
|
int nSumStart = ROI.top;
|
int nProjectionStart = ROI.left;
|
int nProjectionEnd = nProjectionStart + nProjectionLength;
|
|
if(nProjectionLength < 0 || nSumLength < 0)
|
return -1;
|
|
if(nWidth < ROI.Width() || nHeight < ROI.Height())
|
return -1;
|
|
int* pnSum = new int[nWidth + nDist];
|
nThres *= nSumLength;
|
ZeroMemory(pnSum, sizeof(int) * (nWidth + nDist));
|
int nSumLine, nProjectionLine;
|
int nGab;
|
int nContinueCount = 0;
|
int nLine = 0;
|
for (nProjectionLine = nProjectionStart; nProjectionLine < nProjectionEnd; nProjectionLine++)
|
{
|
for (nSumLine = nSumStart; nSumLine < nSumStart + nSumLength; nSumLine++)
|
{
|
pnSum[nProjectionLine] += *(pBuff + nProjectionLine + nSumLine * nWidth);
|
}
|
|
if (nProjectionLine >= nDist)
|
{
|
nGab = pnSum[nProjectionLine - nDist] - pnSum[nProjectionLine];
|
if (nGab < 0)
|
nGab *= -1;
|
if (nGab > nThres)
|
nContinueCount++;
|
else
|
nContinueCount = 0;
|
|
//¿¬¼ÓÀ¸·Î nContinue ÀÌ»ó ³ª¿À¸é
|
if (nContinueCount >= nContinue)
|
{
|
delete [] pnSum;
|
return nProjectionLine - (nContinue - 1);
|
}
|
}
|
}
|
delete [] pnSum;
|
return -1;
|
}
|
|
int CEdgeFind::ImageProjection_R(BYTE* pBuff, int nWidth, int nHeight, CRect ROI, int nThres, int nDist, int nContinue)
|
{
|
//¿¹¿Üó¸®
|
if(pBuff == NULL || nWidth <= 0 || nHeight <= 0)
|
return -1;
|
|
int nSumLength = ROI.Height();
|
int nProjectionLength = ROI.Width();
|
int nSumStart = ROI.top;
|
int nProjectionStart = ROI.right;
|
int nProjectionEnd = nProjectionStart - nProjectionLength;
|
|
if(nProjectionLength < 0 || nSumLength < 0)
|
return -1;
|
|
if(nWidth < ROI.Width() || nHeight < ROI.Height())
|
return -1;
|
|
int* pnSum = new int[nWidth + nDist];
|
nThres *= nSumLength;
|
ZeroMemory(pnSum, sizeof(int) * (nWidth + nDist));
|
int nSumLine, nProjectionLine;
|
int nGab;
|
int nContinueCount = 0;
|
int nLine = 0;
|
for (nProjectionLine = nProjectionStart - 1; nProjectionLine >= nProjectionEnd; nProjectionLine--)
|
{
|
for (nSumLine = nSumStart; nSumLine < nSumStart + nSumLength; nSumLine++)
|
{
|
pnSum[nProjectionLine] += *(pBuff + nProjectionLine + nSumLine * nWidth);
|
}
|
|
if (nProjectionLine <= nProjectionStart - 1 - nDist)
|
{
|
nGab = pnSum[nProjectionLine + nDist] - pnSum[nProjectionLine];
|
if (nGab < 0)
|
nGab *= -1;
|
if (nGab > nThres)
|
nContinueCount++;
|
else
|
nContinueCount = 0;
|
|
//¿¬¼ÓÀ¸·Î nContinue ÀÌ»ó ³ª¿À¸é
|
if (nContinueCount >= nContinue)
|
{
|
delete [] pnSum;
|
return nProjectionLine + (nContinue - 1);
|
}
|
}
|
}
|
delete [] pnSum;
|
return -1;
|
}
|
|
int CEdgeFind::ImageProjection_Vert(BYTE* pBuff, int nWidth, int nHeight, CRect ROI, int nThres, int nDist, int nContinue)
|
{
|
//¿¹¿Üó¸®
|
if(pBuff == NULL || nWidth <= 0 || nHeight <= 0)
|
return -1;
|
|
int nSumLength = ROI.Width();
|
int nProjectionLength = ROI.Height();
|
int nSumStart = ROI.left;
|
int nProjectionStart = ROI.top;
|
int nProjectionEnd = nProjectionStart + nProjectionLength;
|
|
if(nProjectionLength < 0 || nSumLength < 0)
|
return -1;
|
|
if(nWidth < ROI.Width() || nHeight < ROI.Height())
|
return -1;
|
|
int* pnSum = new int[nHeight + nDist];
|
nThres *= nSumLength;
|
ZeroMemory(pnSum, sizeof(int) * (nHeight + nDist));
|
int nSumLine, nProjectionLine;
|
int nGab;
|
int nContinueCount = 0;
|
int nLine = 0;
|
for (nProjectionLine = nProjectionStart; nProjectionLine < nProjectionEnd; nProjectionLine++)
|
{
|
for (nSumLine = nSumStart; nSumLine < nSumStart + nSumLength; nSumLine++)
|
{
|
pnSum[nProjectionLine] += *(pBuff + nSumLine + nProjectionLine * nWidth);
|
}
|
|
if (nProjectionLine >= nDist)
|
{
|
nGab = pnSum[nProjectionLine - nDist] - pnSum[nProjectionLine];
|
if (nGab < 0)
|
nGab *= -1;
|
if (nGab > nThres)
|
nContinueCount++;
|
else
|
nContinueCount = 0;
|
|
//¿¬¼ÓÀ¸·Î nContinue ÀÌ»ó ³ª¿À¸é
|
if (nContinueCount >= nContinue)
|
{
|
delete [] pnSum;
|
return nProjectionLine - (nContinue - 1);
|
}
|
}
|
}
|
delete [] pnSum;
|
return -1;
|
}
|
|
int CEdgeFind::ImageProjection_Vert_R(BYTE* pBuff, int nWidth, int nHeight, CRect ROI, int nThres, int nDist, int nContinue)
|
{
|
//¿¹¿Üó¸®
|
if(pBuff == NULL || nWidth <= 0 || nHeight <= 0)
|
return -1;
|
|
int nSumLength = ROI.Width();
|
int nProjectionLength = ROI.Height();
|
int nSumStart = ROI.left;
|
int nProjectionStart = ROI.bottom;
|
int nProjectionEnd = nProjectionStart - nProjectionLength;
|
|
if(nProjectionLength < 0 || nSumLength < 0)
|
return -1;
|
|
if(nWidth < ROI.Width() || nHeight < ROI.Height())
|
return -1;
|
|
int* pnSum = new int[nHeight + nDist];
|
nThres *= nSumLength;
|
ZeroMemory(pnSum, sizeof(int) * (nHeight + nDist));
|
int nSumLine, nProjectionLine;
|
int nGab;
|
int nContinueCount = 0;
|
int nLine = 0;
|
for (nProjectionLine = nProjectionStart - 1; nProjectionLine >= nProjectionEnd; nProjectionLine--)
|
{
|
for (nSumLine = nSumStart; nSumLine < nSumStart + nSumLength; nSumLine++)
|
{
|
pnSum[nProjectionLine] += *(pBuff + nSumLine + nProjectionLine * nWidth);
|
}
|
|
if (nProjectionLine <= nProjectionStart - 1 - nDist)
|
{
|
nGab = pnSum[nProjectionLine + nDist] - pnSum[nProjectionLine];
|
if (nGab < 0)
|
nGab *= -1;
|
if (nGab > nThres)
|
nContinueCount++;
|
else
|
nContinueCount = 0;
|
|
//¿¬¼ÓÀ¸·Î nContinue ÀÌ»ó ³ª¿À¸é
|
if (nContinueCount >= nContinue)
|
{
|
delete [] pnSum;
|
return nProjectionLine + (nContinue - 1);
|
}
|
}
|
}
|
delete [] pnSum;
|
return -1;
|
}
|