调用OPENCV的cvfindcontour函数出现的排序问题

qq_34618935 2017-04-10 05:13:43
这是我在论坛里找到的一段基于轮廓字符分割的代码,我尝试把它应用在车牌字符分割上,中文则希望通过相对坐标关系定位画框,但是在对单个分割字符进行保存的时候发现得到的图片并不是按照我想要的从左到右的顺序,对于代码上注释的比较rc.x和rc.y的关系不知道如何下手,想知道是在哪里进行比较排序,希望得到各位大神的指导。ps:我使用的是UBUTU下的OPENCV3.2。
以下是我使用的具体代码:
#include <iostream>
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cvaux.h>

int main(int argc, char* argv[])
{
IplImage* imgSrc = cvLoadImage("6.jpg",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);// CV_THRESH_BINARY_INV使得背景为黑色,字符为白色,这样找到的最外层才是字符的最外层
cvShowImage("ThresholdImg",img_gray);
CvSeq* contours = NULL;
CvMemStorage* storage = cvCreateMemStorage(0);
// 上面源图片有瑕疵可以用腐蚀,膨胀来祛除
int count = cvFindContours(img_gray, storage, &contours,sizeof(CvContour), CV_RETR_CCOMP);
//CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的界;
printf("轮廓个数:%d",count);
int idx = 0;
char szName[56] = {0};
char xx[64];
int tempCount=0;
for (CvSeq* c = contours; c != NULL; c = c->h_next) {
CvRect rc =cvBoundingRect(c,0);

//以下为分割后图片框选&输出
IplImage* imgNo = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3);
IplImage* imageresize=0;
if (rc.width>10&&rc.height>60)
{
//continue; 根据轮廓的大小排除孔的选定

cvDrawRect(imgSrc, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(20*(idx+1),0,20*idx));//CV_RGB是字符框的颜色

cvSetImageROI(imgSrc, rc);
cvCopy(imgSrc, imgNo);

cvResetImageROI(imgSrc);

sprintf(szName, "%d", idx++);

cvNamedWindow(szName);
cvShowImage(szName, imgNo); //如果想切割出来的图像从左到右排序,或从上到下,可以比较rc.x,rc.y;
sprintf(xx,"n_%d.jpg",idx);
cvSaveImage(xx,imgNo);
cvReleaseImage(&imgNo);
}
}
这是我在论坛里找到的一段基于轮廓字符分割的代码

cvNamedWindow("src");
cvShowImage("src", imgSrc);
cvWaitKey(0);
cvReleaseMemStorage(&storage);
cvReleaseImage(&imgSrc);
cvReleaseImage(&img_gray);
cvDestroyAllWindows();
return 0;
}

...全文
772 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
大大的道道的 2017-04-13
  • 打赏
  • 举报
回复
因为你查找到的轮廓并不是从左到右排序的。。。 所以要根据轮廓的最小外接矩形rc 的坐标来排序 。。 你这个车牌还需要考虑到车牌并不是摆正的情况, 可能还需要旋转矩形。。。
qq_34618935 2017-04-10
  • 打赏
  • 举报
回复
感谢老师,这就去学习
赵4老师 2017-04-10
  • 打赏
  • 举报
回复
参考开源车牌识别项目OpenPR源代码相关片断。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧