zoukankan      html  css  js  c++  java
  • C# open cv即emgu cv 定位车牌思路及代码

    最近没什么事,了解图像处理,所以学习了以下!由于我不太会C++,只能试着用C#编写代码!但是网上关于emgu cv的资料少之又少,而且很多还是英文的,而且讲的不详细。所以慢慢琢磨。写了个c#定位车牌的代码,不过效果不是很理想。参考了c++高手的代码!

    思路就是1.灰度化,竖向边缘检测

    2.自适应二值化处理

    3.形态学处理(膨胀和腐蚀)

    4.轮廓查找与筛选

    代码如下:

                Image<Bgr, Byte> simage = img;    //new Image<Bgr, byte>("license-plate.jpg");
                //Image<Bgr, Byte> simage = sizeimage.Resize(400, 300, Emgu.CV.CvEnum.INTER.CV_INTER_NN);
                Image<Gray, Byte> GrayImg = new Image<Gray, Byte>(simage.Width, simage.Height);
                IntPtr GrayImg1 = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
                //灰度化
                CvInvoke.cvCvtColor(simage.Ptr, GrayImg1, Emgu.CV.CvEnum.COLOR_CONVERSION.BGR2GRAY);
                //首先创建一张16深度有符号的图像区域
                IntPtr Sobel = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_16S, 1);
                //X方向的Sobel算子检测
                CvInvoke.cvSobel(GrayImg1, Sobel, 2, 0, 3);
                IntPtr temp = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
                CvInvoke.cvConvertScale(Sobel, temp, 0.00390625, 0);
                ////int it = ComputeThresholdValue(GrayImg.ToBitmap());
                ////二值化处理
                ////Image<Gray, Byte> dest = GrayImg.ThresholdBinary(new Gray(it), new Gray(255));
                Image<Gray, Byte> dest = new Image<Gray, Byte>(simage.Width, simage.Height);
                //二值化处理
                CvInvoke.cvThreshold(temp, dest, 0, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_OTSU);
                IntPtr temp1 = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
                Image<Gray, Byte> dest1 = new Image<Gray, Byte>(simage.Width, simage.Height);
                CvInvoke.cvCreateStructuringElementEx(3, 1, 1, 0, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT, temp1);
                CvInvoke.cvDilate(dest, dest1, temp1, 6);
                CvInvoke.cvErode(dest1, dest1, temp1, 7);
                CvInvoke.cvDilate(dest1, dest1, temp1, 1);
                CvInvoke.cvCreateStructuringElementEx(1, 3, 0, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT, temp1);
                CvInvoke.cvErode(dest1, dest1, temp1, 2);
                CvInvoke.cvDilate(dest1, dest1, temp1, 2);
                IntPtr dst = CvInvoke.cvCreateImage(simage.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 3);
                CvInvoke.cvZero(dst);
                //dest.Dilate(10);
                //dest.Erode(5);
                using (MemStorage stor = new MemStorage())
                {
                    Contour<Point> contours = dest1.FindContours(
                        Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
                        Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_CCOMP,
                        stor);
                    for (; contours != null; contours = contours.HNext)
                    {
    
                        Rectangle box = contours.BoundingRectangle;
                        Image<Bgr, Byte> test = simage.CopyBlank();
                        test.SetValue(255.0);
                        double whRatio = (double)box.Width / box.Height;
                        int area = (int)box.Width * box.Height;
                        if (area > 1000 && area<10000)
                        {
                            if ((3.0 < whRatio && whRatio < 6.0))
                            {
                                test.Draw(box, new Bgr(Color.Red), 2);
                                simage.Draw(box, new Bgr(Color.Red), 2);//CvInvoke.cvNamedWindow("dst");
                                //CvInvoke.cvShowImage("dst", dst);
                                imageBox1.Image = simage;
                            }
                        }
                    }
                }

     

    还是有一些细节没处理好啊,希望大家能指点我这个新手

  • 相关阅读:
    spring 自定义事件发布及监听(简单实例)
    解析spring中的BeanFactory(看完会有收获)
    如何提高锁的性能
    spring MVC模式拦截所有入口方法的入参出参打印
    java基于feemarker 生成word文档(超级简单)
    数据库事务特性汇总
    如何让window.open()以post请求方式调用(巧妙解法)
    a标签添加背景图片的解决办法
    深入理解Django Admin的list_display, list_filter和raw_id_fields,filter_horizontal选项
    django配置log日志
  • 原文地址:https://www.cnblogs.com/defly/p/4269241.html
Copyright © 2011-2022 走看看