#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; }