VC++ 利用Opencv 做的一个发票识别程序,识别有误

使用VC++和Opencv编写的发票识别程序在处理复杂贴票时出现识别错误。程序包括图像预处理(腐蚀、降噪)、区域划分、轮廓追踪和椭圆拟合等步骤。遇到的问题是复杂贴票的识别准确性不足,正在寻求解决方案。
摘要由CSDN通过智能技术生成

如题,如图

上图为识别有误样张,下图为识别正常样张。

现在是简单的贴票识别没问题,但是较复杂的贴票就会识别有误,识别不全,请教大家谁能帮我看下原因?

代码段:
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);
                                        }
      

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值