采用opencv轮廓查找分割字符

这是原始图像,分辨率较小。

 

#include "stdafx.h"
#include "opencv/cv.h"
#include "opencv/highgui.h"

/*
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
*/


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;

/// Function header
void thresh_callback(int, void* );
// @function main //
int main( int argc, char** argv )
{
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"

 IplImage* imgSrc = cvLoadImage("D:\\2.bmp",CV_LOAD_IMAGE_COLOR);
 IplImage* img_gray = cvCreateImage(cvGetSize(imgSrc), IPL_DEPTH_8U, 1);
 cvCvtColor(imgSrc, img_gray, CV_BGR2GRAY);
 cvThreshold(img_gray, img_gray,100, 255,CV_THRESH_BINARY_INV|CV_THRESH_OTSU);// CV_THRESH_BINARY_INV使得背景为黑色,字符为白色,这样找到的最外层才是字符的最外层
 cvNamedWindow("ThresholdImg", CV_WINDOW_NORMAL);
 cvShowImage("ThresholdImg",img_gray);
 CvSeq* contours = NULL;
 CvMemStorage* storage = cvCreateMemStorage(0);
 // 上面源图片有瑕疵可以用腐蚀,膨胀来祛除
 int count = cvFindContours(img_gray, storage, &contours,sizeof(CvContour),CV_RETR_EXTERNAL);
 printf("轮廓个数:%d",count);
 int idx = 0;
 char szName[56] = {0};
 int tempCount=0;
 for (CvSeq* c = contours; c != NULL; c = c->h_next) {
  CvRect rc =cvBoundingRect(c,0);                                                                                                              
  //      if ()   
  //       { 
  //           continue;     这里可以根据轮廓的大小进行筛选
  //       }
  cvDrawRect(imgSrc, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 0, 0));
  IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3);
  cvSetImageROI(imgSrc, rc);
  cvCopyImage(imgSrc, imgNo);
  cvResetImageROI(imgSrc);
  sprintf(szName, "wnd_%d", idx++);
  cvNamedWindow(szName);
  cvShowImage(szName, imgNo);
  cvReleaseImage(&imgNo);
 }
 cvNamedWindow("src", CV_WINDOW_NORMAL);
 cvShowImage("src", imgSrc);
 cvWaitKey(0);
 cvReleaseMemStorage(&storage);
 cvReleaseImage(&imgSrc);
 cvReleaseImage(&img_gray);
 cvDestroyAllWindows();
 return 0;                                                                                                                                    
}

下面是采用大津法二值化后的结果。

下面是查找到外轮廓的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值