调用OPENCV的cvfindcontour函数出现的排序问题
这是我在论坛里找到的一段基于轮廓字符分割的代码,我尝试把它应用在车牌字符分割上,中文则希望通过相对坐标关系定位画框,但是在对单个分割字符进行保存的时候发现得到的图片并不是按照我想要的从左到右的顺序,对于代码上注释的比较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;
}