如题,如图
上图为识别有误样张,下图为识别正常样张。
现在是简单的贴票识别没问题,但是较复杂的贴票就会识别有误,识别不全,请教大家谁能帮我看下原因?
代码段:
void do_bill_image(const char* pTifFile)
{
if (NULL == pTifFile)
return;
int p[3];
p[0] = CV_IMWRITE_JPEG_QUALITY;
p[1] = 85;
p[2] = 0;
IplImage* lpImgSrc = cvLoadImage(pTifFile, CV_LOAD_IMAGE_COLOR);*/
if (lpImgSrc)
{
std::map<int, RECT> mapRC;
mapRC.clear();
IplImage* lpImgBinary = get_image_binary(lpImgSrc, 0);
if (lpImgBinary)
{
removice_noise_image(lpImgBinary, 3);//降噪
cvErode(lpImgBinary, lpImgBinary, NULL, 3);//腐蚀
//cvDilate(lpImgBinary, lpImgBinary, NULL, 3);//膨胀
removeblack(lpImgBinary);//漫水填充
int iSpace = lpImgBinary->width/2;
std::vector<UINT> vecHistogramSum;
vecHistogramSum.clear();
{ // 图片像素统计(垂直投影)
IplImage* lpImageOut = cvCreateImage(cvGetSize(lpImgBinary), lpImgBinary->depth, lpImgBinary->nChannels);
if (lpImageOut)
{
SumImageHistogram(lpImgBinary, lpImageOut, vecHistogramSum, 8, 0);
int iCount = 0;
unsigned long ulSum = 0;
std::vector<UINT>::iterator it = vecHistogramSum.begin();
while (it != vecHistogramSum.end())
{
if (*it)
{
ulSum += *it;
iCount++;
}
it++;
}
int iAvg = ulSum / iCount;
int ithreshold = iAvg / 5;
//如果获取的高度小于50个像素,认为是空白
if (8 > ithreshold)
return;
RECT rc;
ZeroMemory(&rc, sizeof(RECT));
rc.right = lpImageOut->width-1;
rc.bottom = lpImageOut->height/2;
std::vector<RECT> vecRegionalism;
vecRegionalism.clear();
statistical_image_chang_count_pos(lpImageOut, rc, vecRegionalism, ithreshold/2, ithreshold/2, false);
if (!vecRegionalism.empty())
{
//if (1 == vecRegionalism.size())
//{
//
//}
//else
{
std::vector<RECT>::iterator it = vecRegionalism.begin();
while (it != vecRegionalism.end())
{
if (100 > (it->right - it->left))
{
it++;
continue;
}
IplImage* lpImgTemp = Copy_Image_roi_data(lpImgBinary, it->left, 0, it->right, lpImgBinary->height);
if (lpImgTemp)
{
// 记录图片的水平投影
std::vector<RECT> vecRegsm;
vecRegsm.clear();
{ // 图片像素统计(水平投影)
IplImage* lpImgOut = cvCreateImage(cvGetSize(lpImgTemp), lpImgTemp->depth, lpImgTemp->nChannels);
if (lpImgOut)
{
vecHistogramSum.clear();
SumImageHistogram(lpImgTemp, lpImgOut, vecHistogramSum, 8, 1);
rc.left = 0;
rc.top = 0;
rc.right = lpImgOut->width - 1;
rc.bottom = lpImgOut->height - 1;
statistical_image_chang_count_pos(lpImgOut, rc, vecRegsm, 8, 8, true);
cvReleaseImage(&lpImgOut);
}