字符分割排列-opencv 字符分割结果排列

问题描述

opencv 字符分割结果排列

如题,对字符图片进行字符分割,采用的外轮廓最小外接矩形的方法,分割效果如图
为什么顺序不是从右到左呀,这样没有顺序的分割没太有意义呀。请问有人知道怎么改成分割后结果顺序从右到左或者从左到右么,谢谢!!!!代码如下
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"

int main(int argc, char* argv[])
{
IplImage* imgSrc = cvLoadImage("C:UsersthinkDesktop腐蚀膨胀结果.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_EXTERNAL,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
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);

   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");
cvShowImage("src", imgSrc);
cvWaitKey(0);
cvReleaseMemStorage(&storage);
cvReleaseImage(&imgSrc);
cvReleaseImage(&img_gray);
cvDestroyAllWindows();
return 0;

}

解决方案

我觉得你这不是代码的问题,是你自己把框框的顺序拉反了,你试着把框框摆放成正确的顺序,然后重新编译程序看看

解决方案二:

如果不是我说的那个问题,那可能是获取轮廓时,其存放的顺序就是这样的,那么你可以根据每个矩形框左上角的坐标来对每个轮廓进行排序,这样在for循环中显示的时候就是正确的顺序。

解决方案三:

怎么还在用opencv1.0,可以换更高版本的opencv了。
得到contours后有4个联通区域, 你先将4个联通区域按照一定规则(比如中心)从左到右排序,再显示或者运算就行了,不用纠结。

时间: 2024-10-28 12:35:54

字符分割排列-opencv 字符分割结果排列的相关文章

c# split分割字符串提取字符

问题描述 c# split分割字符串提取字符 C#,string a = "E:aabccddFName.jpg",怎么用split提取出"FName"?(那个是反斜杠) 解决方案 正确是a.split('')[5].split('.')[0] 解决方案二: string a = "E:aabccddFName.jpg"; //或者 a=System.IO.Path.GetFileName(a); string []arr=a.Split('')

车辆分割中角点分割-opencv车辆分割中角点选择并连线分割方法和代码

问题描述 opencv车辆分割中角点选择并连线分割方法和代码 就是已经得到了重合车辆的很多角点,现在需要选择真正的角点来连线进行分割,不知道怎么写代码. 解决方案 你这个车辆有重合,应该怎么检测效果好一些,我就不太清楚了, 不知道能不能参考矩形检测的方法:矩形检测http://blog.csdn.net/wangyaninglm/article/details/43959947 解决方案二: 试用动态分析,使用重合前各车的图片,去识别重合后车辆.

笔记:mysql升序排列asc,降序排列desc

经常会忘记mysql中升序和降序用什么字符来表示,现在就做个笔记:升序排列asc,降序排列desc,举个例子,下面是按时间降序调用栏目的文章,也即是栏目最新文章 [e:loop={"select classid, classname, classpath from `[!db.pre!]enewsclass` where classid=275 order by classid desc limit 9 ",100,24,0}]<ul><li><a hre

Python检测字符串中是否包含某字符集合中的字符

  这篇文章主要介绍了Python检测字符串中是否包含某字符集合中的字符,需要的朋友可以参考下 目的 检测字符串中是否包含某字符集合中的字符 方法 最简洁的方法如下,清晰,通用,快速,适用于任何序列和容器 代码如下: def containAny(seq,aset): for c in seq: if c in aset: return True return False 第二种适用itertools模块来可以提高一点性能,本质上与前者是同种方法(不过此方法违背了Python的核心观点:简洁,清

url传递中文字符,特殊危险字符的解决方案(仅供参考)urldecode、base64

web开发的过程中,当我们需要在url中传递中文字符或是其它的html等特殊字符时,似乎总会碰到各种各样的小问题,因为不同的浏览器对他们的编码又不一样.对于中文,一般的做法是: 把这些文本字符串传给url之前,先进行urlencode($text)一下. 但是对于一些很"危险"的字符,比如说html字符,甚至是SQL注入相关的字符,如果很明显的传给系统,出于安全考虑,系统一般都会把它们过滤掉的. 那么,如果我们需要保留这些危险字符,不被过滤,该这么办呢? 我想到的办法是先给它们 bas

asp.net 数据绑定 使用eval 时候报 字符文本中的字符太多 问题的解决方法

在使用datalist 数据绑定时: 复制代码 代码如下: <asp:TextBox ID="txtOutPlace" runat="server" Text ="<%#Eval('调出单位存放地点')%>" Width="130px"></asp:TextBox> 运行报"字符文本中的字符太多"的错误,这时是因为Eval必须是字符串(""引起来)不能

PHP实现过滤掉非汉字字符只保留中文字符

  这篇文章主要介绍了PHP实现过滤掉非汉字字符只保留中文字符,本文直接给出实现代码,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?php   $str = "a 1b 2b<中文>.xxyy字符";   //转换 GB2312 -> UTF-8 $str = mb_convert_encoding($str, 'UTF-8', 'GB2312');   preg_match_all('/[x{4e0

JS检测输入字符是否包含非法字符的示例代码

 本篇文章主要是对JS检测输入字符是否包含非法字符的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 代码如下: function checks(t){    szMsg="[#_%&'/",;:=!^]";    alertStr="";    for(i=1;i<szMsg.length+1;i++){     if(t.indexOf(szMsg.substring(i-1,i))>-1){      alertS

JS去掉第一个字符和最后一个字符的实现代码

本篇文章主要是对JS去掉第一个字符和最后一个字符的实现代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有一个字符串"[lightinthebox]",但是我只是需要lightinthebox,就是不要"[]".怎么用又快又有效的办法去掉呢. stringObject.substring(start,stop) //截取的是开始与结束的字符串. stringObject.substr(start,length) //截取的是开始与字符串长度. 考虑到这些