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

源图片

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

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

二值化后的图片

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

找到的轮廓

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

最后的结果

下面是源码:

    1. #include "stdafx.h"
    2. #include "cv.h"
    3. #include "highgui.h"
    4. #include "cxcore.h"
    5. int main(int argc, char* argv[])
    6. {
    7. IplImage* imgSrc = cvLoadImage("D:\\4.jpg",CV_LOAD_IMAGE_COLOR);
    8. IplImage* img_gray = cvCreateImage(cvGetSize(imgSrc), IPL_DEPTH_8U, 1);
    9. cvCvtColor(imgSrc, img_gray, CV_BGR2GRAY);
    10. cvThreshold(img_gray, img_gray,100, 255,CV_THRESH_BINARY_INV);// CV_THRESH_BINARY_INV使得背景为黑色,字符为白色,这样找到的最外层才是字符的最外层
    11. cvShowImage("ThresholdImg",img_gray);
    12. CvSeq* contours = NULL;
    13. CvMemStorage* storage = cvCreateMemStorage(0);
    14. // 上面源图片有瑕疵可以用腐蚀,膨胀来祛除
    15. int count = cvFindContours(img_gray, storage, &contours,sizeof(CvContour),CV_RETR_EXTERNAL);
    16. printf("轮廓个数:%d",count);
    17. int idx = 0;
    18. char szName[56] = {0};
    19. int tempCount=0;
    20. for (CvSeq* c = contours; c != NULL; c = c->h_next) {
    21. CvRect rc =cvBoundingRect(c,0);
    22. //      if ()
    23. //       {
    24. //           continue;     这里可以根据轮廓的大小进行筛选
    25. //       }
    26. cvDrawRect(imgSrc, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 0, 0));
    27. IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3);
    28. cvSetImageROI(imgSrc, rc);
    29. cvCopyImage(imgSrc, imgNo);
    30. cvResetImageROI(imgSrc);
    31. sprintf(szName, "wnd_%d", idx++);
    32. cvNamedWindow(szName);
    33. cvShowImage(szName, imgNo); //如果想切割出来的图像从左到右排序,或从上到下,可以比较rc.x,rc.y;
    34. cvReleaseImage(&imgNo);
    35. }
    36. cvNamedWindow("src");
    37. cvShowImage("src", imgSrc);
    38. cvWaitKey(0);
    39. cvReleaseMemStorage(&storage);
    40. cvReleaseImage(&imgSrc);
    41. cvReleaseImage(&img_gray);
    42. cvDestroyAllWindows();
    43. return 0;
    44. }

最新文章

  1. Cannot forward after response has been committed
  2. Centos6.4 用rpm方式安装MySql5.6
  3. BZOJ4348 : [POI2016]Park wodny
  4. 【不积跬步,无以致千里】linux下如何查看自己的外网IP
  5. TYPEC 接口芯片CC逻辑原理与必要性
  6. ANDROID内存优化(大汇总——上)
  7. CriticalFinalizerObject的作用
  8. Python3基础 list(zip()) 将两个列表打包起来
  9. 使用phpmailer插件发邮件失败提示:SMTP -> ERROR: Failed to connect to server: Connection timed out (110) smtp connect() failed;
  10. Demo3
  11. 打包github上的项目,并在本地使用
  12. Python之抽象类、抽象方法
  13. python 中的__new__与__init__
  14. Springbatch headerCallback 居然是在processor之前执行的
  15. OC常用控件封装
  16. 删除SQL Server大容量日志的方法(转)
  17. XMatch: 您的部门管理助手
  18. redis实现秒杀demo
  19. 关于Windows勒索病毒以及445端口防护
  20. 关于easyUI的一些js方法

热门文章

  1. 准标识符(Quasi-dientifier, QI)
  2. 【Zeyphr】保存json到数据库
  3. Failed to execute goal org.codehaus.cargo:cargo-maven2-plugin:1.2.3:run (default-cli) on project Maven_WebTest: Execution default-cli of goal org.codehaus.cargo:cargo-maven2-plugin:1.2.3:run failed: C
  4. iOS--cocopod升级新版本
  5. iOS 自定义NavigationBar右侧按钮rightBarButtonItem--button
  6. 【Alpha版本】冲刺阶段——Day 8
  7. extjs store的操作
  8. Jenkins_获取源码编译并启动服务(一)
  9. bzoj2565: 最长双回文串
  10. JS实现打印功能