博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]图片中的字符分割提取(基于opencv)
阅读量:7003 次
发布时间:2019-06-27

本文共 1748 字,大约阅读时间需要 5 分钟。

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

源图片

 

像这些图片的字符就比较好操作,每个字符都独立,不连在一起,所以轮廓检测最好了。

所以就有:
1.源图片转成单通道的灰阶图片
2.对灰度图像进行阈值操作得到二值图像

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

二值化后的图片

 

3.轮廓检测(只获取最外层的)

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

找到的轮廓

 

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

最后的结果

 

下面是源码:

 

 

[cpp]   
 
 
    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. }  
你可能感兴趣的文章
RPC原理及其调用过程
查看>>
python3 _笨方法学Python_日记_DAY5
查看>>
LintCode_100 删除排序数组中的重复数字
查看>>
SourceTree 跳过登录注册,直接使用
查看>>
Spring-MVC:应用上下文webApplicationContext
查看>>
bzoj 2038 小Z的袜子
查看>>
隐藏的最大整数
查看>>
CSS 三栏自适应布局
查看>>
[SharePoint 2010]关于基于声明(Claims)的用户认证模式
查看>>
python开发函数进阶:装饰器
查看>>
Python中的数据结构 --- 集合(set)
查看>>
洛谷——2347砝码称重
查看>>
网络提速(最短路)
查看>>
洛谷——P2683 小岛
查看>>
python双端队列-collection模块
查看>>
Maven项目搭建(三):Maven直接部署项目
查看>>
git自定义项目钩子和全局钩子
查看>>
排球比赛计分规则
查看>>
SQL SERVER 2008 服务器登录名、角色、数据库用户、角色、架构的关系(转)
查看>>
关于DNS的总结
查看>>