zoukankan      html  css  js  c++  java
  • [转]图片中的字符分割提取(基于opencv)

    http://blog.csdn.net/anqing715/article/details/16883863

    源图片

    像这些图片的字符就比较好操作,每个字符都独立,不连在一起,所以轮廓检测最好了。
    所以就有:
    1.源图片转成单通道的灰阶图片
    2.对灰度图像进行阈值操作得到二值图像

    (对于一些手机拍的,背景色不是纯的话,可以用cvSmooth()平滑一下。)

    二值化后的图片

    3.轮廓检测(只获取最外层的)
    4.遍历所有检测到的轮廓,用cvBoundingRect()得到每一个轮廓的外接矩形

    找到的轮廓

    5.抠它们出来,这步在上面的遍历中直接通过setROI方法进行提取。

    最后的结果

    下面是源码:

    [cpp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
      1. #include "stdafx.h"  
      2. #include "cv.h"  
      3. #include "highgui.h"  
      4. #include "cxcore.h"  
      5.   
      6.   
      7.   
      8. int main(int argc, char* argv[])  
      9. {  
      10.     IplImage* imgSrc = cvLoadImage("D:\4.jpg",CV_LOAD_IMAGE_COLOR);  
      11.     IplImage* img_gray = cvCreateImage(cvGetSize(imgSrc), IPL_DEPTH_8U, 1);  
      12.     cvCvtColor(imgSrc, img_gray, CV_BGR2GRAY);  
      13.     cvThreshold(img_gray, img_gray,100, 255,CV_THRESH_BINARY_INV);// CV_THRESH_BINARY_INV使得背景为黑色,字符为白色,这样找到的最外层才是字符的最外层  
      14.     cvShowImage("ThresholdImg",img_gray);  
      15.     CvSeq* contours = NULL;  
      16.     CvMemStorage* storage = cvCreateMemStorage(0);   
      17.     // 上面源图片有瑕疵可以用腐蚀,膨胀来祛除  
      18.     int count = cvFindContours(img_gray, storage, &contours,sizeof(CvContour),CV_RETR_EXTERNAL);  
      19.     printf("轮廓个数:%d",count);  
      20.     int idx = 0;  
      21.     char szName[56] = {0};  
      22.     int tempCount=0;  
      23.     for (CvSeq* c = contours; c != NULL; c = c->h_next) {  
      24.          CvRect rc =cvBoundingRect(c,0);                                                                                                                 
      25. //      if ()      
      26. //       {    
      27. //           continue;     这里可以根据轮廓的大小进行筛选  
      28. //       }  
      29.     cvDrawRect(imgSrc, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 0, 0));  
      30.     IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3);   
      31.     cvSetImageROI(imgSrc, rc);  
      32.     cvCopyImage(imgSrc, imgNo);  
      33.     cvResetImageROI(imgSrc);   
      34.     sprintf(szName, "wnd_%d", idx++);   
      35.     cvNamedWindow(szName);   
      36.     cvShowImage(szName, imgNo); //如果想切割出来的图像从左到右排序,或从上到下,可以比较rc.x,rc.y;  
      37.     cvReleaseImage(&imgNo);   
      38.    }  
      39.     cvNamedWindow("src");   
      40.     cvShowImage("src", imgSrc);  
      41.     cvWaitKey(0);   
      42.     cvReleaseMemStorage(&storage);   
      43.     cvReleaseImage(&imgSrc);   
      44.     cvReleaseImage(&img_gray);   
      45.     cvDestroyAllWindows();   
      46.     return 0;                                                                                                                                       
      47. }  
  • 相关阅读:
    完整的开源和商业软件平台
    免费开源的文件比较/合并工具
    Javascript面向对象基础
    Javascript面向对象基础
    引入外部js获取dom为null的问题
    闭包函数
    初识对象
    构造函数
    内置对象
    Math对象
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/5657312.html
Copyright © 2011-2022 走看看