emguCv3.x 实现字符分割,轮廓检测

 /// <summary>
        /// 获取区域
        /// </summary>
        /// <param name="bitmap"></param>
        /// <param name="graybtm"></param>
        /// <returns></returns>
        public static Bitmap FindBundingBox(Bitmap bitmap, out Bitmap graybtm,out List<Rectangle> rects)
        {
            Image<Bgr, byte> img = new Image<Bgr, byte>(bitmap);
            Image<Gray, byte> gray = new Image<Gray, byte>(img.Width, img.Height);
            Image<Bgr, byte> resuImage = new Image<Bgr, byte>(img.Width, img.Height);
            Image<Gray, byte> dnc = new Image<Gray, byte>(img.Width, img.Height);
            CvInvoke.CvtColor(img, gray, ColorConversion.Bgra2Gray);//灰度化
            //做一下膨胀,x与y方向都做,但系数不同
            var kernal = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(4, 4), new Point(1, 1));
            CvInvoke.Erode(gray, gray, kernal, new Point(0, 2), 1, BorderType.Default, new MCvScalar());
            //CvInvoke.Canny(gray, gray, 100, 60);
            CvInvoke.Threshold(gray, gray, 100, 255, ThresholdType.BinaryInv | ThresholdType.Otsu);//二值化
            //检测连通域,每一个连通域以一系列的点表示,FindContours方法只能得到第一个域
            graybtm = gray.ToBitmap();
            VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
            CvInvoke.FindContours(gray, contours, dnc, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);
            var color = new MCvScalar(0, 0, 255);
            Console.WriteLine(contours.Size);
             rects = new List<Rectangle>();
            //开始遍历
            for (int i = 0; i < contours.Size; i++)
            {
                //得到这个连通区域的外接矩形
                var rect = CvInvoke.BoundingRectangle(contours[i]);
                //如果高度不足,或者长宽比太小,认为是无效数据,否则把矩形画到原图上
                if (rect.Height > 2 && rect.Width > 2)
                {
                    rects.Add(rect);
                    CvInvoke.DrawContours(resuImage, contours, i, color);
                }
            }

            return img.ConcateVertical(resuImage).ToBitmap();
        }
 private void StandardRects()
        {
            List<Rectangle> removeList=new List<Rectangle>();
            foreach (var item in glbRect)
            {
                if (glbRect.Exists(o => o.Contains(item) && o!=item))
                {
                    removeList.Add(item);
                }
            }
            glbRect.RemoveAll(o => removeList.Contains(o));
            glbRect=glbRect.OrderBy(o => o.X).ToList();
            lb_count.Text = "轮廓总数:" + glbRect.Count;
        }
时间: 2024-10-12 12:14:41

emguCv3.x 实现字符分割,轮廓检测的相关文章

python+opencv实现机器视觉基础技术(边缘提取,图像滤波,边缘检测算子,投影,车牌字符分割)

目录 一:边缘提取 1.对图像进行阈值分割并反色 2.边缘提取 二:图像滤波 1.读取原图 2.均值滤波 3.中值滤波 4.高斯滤波 5.高斯边缘检测 三:边缘检测算子 1.显示原图 2.对图像进行反色 3.对图像用sobel方法进行边缘检测 4.对图像用robert方法进行边缘检测 四:投影 1.显示原图 2.垂直方向投影 3.水平方向投影 五:车牌字符分割 1.读取原图 2.灰度转换 3.反色 4.阈值分割 5.投影 6.字符识别匹配分割 ??机器视觉是人工智能正在快速发展的一个分支.简单说

OPENCV图像轮廓检测

前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像轮廓检测. 一.图像轮廓检测 在opencv中,轮廓对应着一系列的点的集合,opencv提供了一个函数,用来获得这些点的集合 API:void finContours(输入图像,输出轮廓点集,输出向量,int 轮廓检索模式,int 轮廓近似方法,Point 轮廓点的可选偏移量) 注:1.输入图像,是

3D轮廓检测技术讲解

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 今天我们将讨论一种可以检测到3D物体的轮廓方式. 为了使事情变得更清楚,我指的是一个3D对象的轮廓,当光从任意方向落在它上面时. 移动光源可能会相应地改变轮廓. 这完全不同于在图像空

[转]图片中的字符分割提取(基于opencv)

http://blog.csdn.net/anqing715/article/details/16883863 源图片 像这些图片的字符就比较好操作,每个字符都独立,不连在一起,所以轮廓检测最好了.所以就有:1.源图片转成单通道的灰阶图片2.对灰度图像进行阈值操作得到二值图像 (对于一些手机拍的,背景色不是纯的话,可以用cvSmooth()平滑一下.) 二值化后的图片 3.轮廓检测(只获取最外层的)4.遍历所有检测到的轮廓,用cvBoundingRect()得到每一个轮廓的外接矩形 找到的轮廓

EasyPR源码剖析(8):字符分割

通过前面的学习,我们已经可以从图像中定位出车牌区域,并且通过SVM模型删除"虚假"车牌,下面我们需要对车牌检测步骤中获取到的车牌图像,进行光学字符识别(OCR),在进行光学字符识别之前,需要对车牌图块进行灰度化,二值化,然后使用一系列算法获取到车牌的每个字符的分割图块.本节主要对该字符分割部分进行详细讨论. EasyPR中,字符分割部分主要是在类 CCharsSegment 中进行的,字符分割函数为 charsSegment(). 1 int CCharsSegment::charsS

opencv实现车牌识别之字符分割

简介 在前一篇中,我们已经定位出来了在图片中车牌号的位置,并且将车牌号图片复制成了新图片,并显示出来,本章在这些被截取出来的图片上继续处理. 截取出来的新图片如下: 图像灰阶/二值化 首先也是选择将图像进行灰阶,然后采用以255一遍开始,取占了总pixel为5%的地方作为阀值,进行二值化. 代码如下: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <math.h

视频中人体轮廓检测

传统的运动人体轮廓检测算法主要有三类:帧间差分法,背景减除法,光流法. 优点                                                                缺点 帧间差分法                运算简单.                                               对于缓慢运动的前景目标容易产生空洞现象. 背景减除法                简单易行.                        

[转载+原创]Emgu CV on C# (七) —— Emgu CV on 轮廓检测

轮廓检测 对于查找轮廓我们一般要对图像Canny检测.但是对于很特殊的场合其实我们还可以直接对二值化的图像进行轮廓的提取. 关键函数 1. cvFindContours Retrieves contours from the binary image and returns the number of retrieved contours. The pointer firstContour is filled by the function. It will contain pointer to

js如何使用指定字符分割字符串

js如何使用指定字符分割字符串:在实际应用中,可能需要将字符进行分割,然后进行相关操作,下面就给出这样一个代码实例供大家参考.代码如下: var str="a-n-t-z-o-n-e"; var theArray=str.split("-"); console.log(theArray); 以上代码可以使用"-"作为分隔符来分割字符串,具体这里就不多介绍了,可以参阅javascript的String对象的split()方法一章节. 原文地址是:h