Opencv houghLines不';我没有发现正确的线路。如何纠正这一点? 完成的工作

Opencv houghLines不';我没有发现正确的线路。如何纠正这一点? 完成的工作,opencv,ocr,emgucv,hough-transform,Opencv,Ocr,Emgucv,Hough Transform,我尝试通过以下步骤检测和读取车牌: 1) 使用houghlines检测四边形(抱歉,此步骤中已出现此问题) 2) 将此四边形的透视图更正为矩形 3) 在此矩形上执行OCR 您可以看到我的代码的视觉问题/效果 可以找到代码本身 免责声明:我使用Emgu简历来回答这个问题,但如果有人愿意回答我,我不想打扰他或她给我这个包装的答案 public string loadImage() { OpenFileDialog ofd = new OpenFileDialo

我尝试通过以下步骤检测和读取车牌:

1) 使用houghlines检测四边形(抱歉,此步骤中已出现此问题)
2) 将此四边形的透视图更正为矩形
3) 在此矩形上执行OCR

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

免责声明:我使用Emgu简历来回答这个问题,但如果有人愿意回答我,我不想打扰他或她给我这个包装的答案

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);
            }
公共字符串loadImage()
{
OpenFileDialog ofd=新建OpenFileDialog();
ShowDialog();
字符串s=ofd.FileName.Normalize();
返回s;
}
public void processImage()
{
字符串s=loadImage();
图像img=新图像;
Console.WriteLine(“读取文件@”+s);
图像tinyGrayImg=img.Resize(0.25,间隔CV\u间隔NN);
CvInvoke.cvShowImage(“原始灰色”,tinyGrayImg);
Console.WriteLine(“将“+s+”转换为灰度”);
Image canny=新图像(CvInvoke.cvGetSize(tinyGrayImg));
cvCanny(tinyGrayImg,canny,97225,3);
CvInvoke.cvShowImage(“canny”,canny);
Console.WriteLine(“Canny应用于”+s);
尝试
{
MemStorage mem=新的MemStorage();
Image linesImg=canny.Convert();
IntPtr line=CvInvoke.cvHoughLines2(canny,mem.Ptr,HOUGH_TYPE.CV_HOUGH_probability,1,Math.PI/180,70,30,10);
序号段=新序号(行,成员);
LineSegment2D[]segArray=segments.ToArray();
for(int i=0;i
问题
正如你在所附图片中看到的(我没有足够的业力直接添加图片)HOUGH_概率过滤器没有像我预期的那样工作,我也不知道为什么车牌的边缘不能被识别。任何关于如何达到我的目标的想法都是受欢迎的。

HOUGH变换并不完美。它将按照非常简单的算法检测线条,我可以向您保证,您得到的结果非常好

现在,您需要过滤结果。例如,如果您知道直线始终处于某些角度,请删除其余部分。如果您知道它们将具有某些长度,请删除所有较小的部分

如果这还不够,也许你开始时做的精明的变换不够。也许你需要一个基于颜色的感兴趣区域(ROI)(白板)。或者,您可以使用斑点检测来查找白色对象。您知道作为常量的所有内容都应该用于计算机视觉。使用诸如Hough变换之类的单一算法可以有所帮助,但它不会自动查找所有内容,您需要帮助它


希望有帮助!

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

现在,您需要过滤结果。例如,如果您知道直线始终处于某些角度,请删除其余部分。如果您知道它们将具有某些长度,请删除所有较小的部分

如果这还不够,也许你开始时做的精明的变换不够。也许你需要一个基于颜色的感兴趣区域(ROI)(白板)。或者,您可以使用斑点检测来查找白色对象。您知道作为常量的所有内容都应该用于计算机视觉。使用诸如Hough变换之类的单一算法可以有所帮助,但它不会自动查找所有内容,您需要帮助它


希望有帮助!

您可以在此处尝试线段检测器代码:作为霍夫变换的替代方案。老实说:C超过了我的理解,请在您的问题中提供代码,因为将来可能会丢失外部链接。您可以在此处尝试线段检测器代码:作为霍夫变换的替代方案。老实说:C越过我的头请在你的问题中提供代码,因为外部链接可能会在将来丢失。我的问题是它在车牌周围没有真正的线条。只是在顶部和底部有一块,但没有形成“矩形”的相交线(四边形或平行线更好,因为它是透视图)我可以将其用作过滤器。Hough变换用于检测粗体和长线。它尽可能地利用现有的内容。这就是为什么我建议更好的想法,如颜色和斑点检测。在现实生活中(真实图片),希望通过hough变换找到一个漂亮的矩形几乎是不可能的。我的问题是它在车牌周围没有线条。只有一块在顶部和底部,但没有形成“矩形”的相交线(四边形或平行线更好,因为它是透视图)我可以用它作为过滤器。Hough变换是用来检测粗体和长线的。它尽其所能地利用现有的东西。这就是为什么我建议更好的想法,比如颜色和斑点检测。在现实生活中(真实图片),希望用Hough变换找到一个漂亮的矩形几乎是不可能的。