houghLines没有检测到正确的线条。怎么纠正这个?

时间:2013-09-30 09:13:58

标签: opencv ocr emgucv hough-transform

完成工作

我尝试通过以下步骤检测并阅读车牌:

1)使用houghlines检测四边形(此步骤已经出现此问题,抱歉)
2)将此四边形的视角修正为矩形
3)对该矩形执行OCR

您可以看到我的代码here的视觉问题/效果。
代码本身可以找到here

免责声明:我使用Emgu CV,但如果有人能够回答我,我不想打扰他或她特意给我这个包装的答案。< / p>

public string loadImage()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.ShowDialog();
            String s = ofd.FileName.Normalize();
            return s;
        }

public void processImage()
        {
            String s = loadImage();
            Image<Gray, Byte> img = new Image<Gray, byte>(s);
            Console.WriteLine("read file @" + s);

            Image<Gray, Byte> tinyGrayImg = img.Resize(0.25, INTER.CV_INTER_NN);
            CvInvoke.cvShowImage("original gray", tinyGrayImg);
            Console.WriteLine("converted " + s + " to grayscale");

            Image<Gray, Byte> canny = new Image<Gray, byte>(CvInvoke.cvGetSize(tinyGrayImg));
            CvInvoke.cvCanny(tinyGrayImg, canny, 97, 225, 3);
            CvInvoke.cvShowImage("canny", canny);
            Console.WriteLine("applied Canny to " + s);

            try
            {
                MemStorage mem = new MemStorage();
                Image<Bgr, byte> linesImg = canny.Convert<Bgr, byte>();
                IntPtr lines = CvInvoke.cvHoughLines2(canny, mem.Ptr, HOUGH_TYPE.CV_HOUGH_PROBABILISTIC, 1, Math.PI /   180, 70, 30, 10);
                Seq<LineSegment2D> segments = new Seq<LineSegment2D>(lines, mem);
                LineSegment2D[] segArray = segments.ToArray();

                for (int i = 0; i < segArray.Length; i++)
                {
                    linesImg.Draw(segArray[i], new Bgr(Color.Red), 1);
                }
                CvInvoke.cvShowImage("lines", linesImg);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

问题

正如您在附图中看到的那样(我没有足够的业力来直接添加图像)HOUGH_PROBABILISTIC过滤器不能像我预期的那样工作,我不知道为什么不能识别车牌的边缘。任何想法如何达到我的目标是值得欢迎的。

1 个答案:

答案 0 :(得分:4)

霍夫变换并不完美。它将根据它非常简单的算法检测线条,我可以向您保证,您获得的结果非常好。

现在,您需要过滤结果。例如,如果您知道该线将始终处于某个角度,则删除其余角度。如果你知道它们会有一些长度,那么删除所有较小的东西。

如果这还不够,也许你在开始时所做的那种改变是不可能的。也许你需要有一个基于颜色的感兴趣区域(ROI)(白板)。或者也许您可以使用斑点检测来查找白色物体。你知道作为常数的一切都应该用在计算机视觉中。使用像Hough变换这样的单一算法可以提供帮助,但它不会自动找到所有内容,您需要帮助它!

希望它有所帮助!