EMGU CV中的标准Hough线

时间:2013-03-08 19:06:00

标签: opencv emgucv hough-transform

我需要使用标准的Hough变换(而不是使用实现概率Hough变换的HoughLinesBinary方法),并尝试通过创建HoughLinesBinary方法的自定义版本来实现:

using (MemStorage stor = new MemStorage())
     {
        IntPtr lines = CvInvoke.cvHoughLines2(canny.Ptr, stor.Ptr, Emgu.CV.CvEnum.HOUGH_TYPE.CV_HOUGH_STANDARD, rhoResolution, (thetaResolution*Math.PI)/180, threshold, 0, 0);

        Seq<MCvMat> segments = new Seq<MCvMat>(lines, stor);
        List<MCvMat> lineslist = segments.ToList();
        foreach(MCvMat line in lineslist)
        {
           //Process lines: (rho, theta)
        }
     }

我的问题是我不确定返回的序列是什么类型。我认为它应该是MCvMat,因为阅读了OpenCV中使用CvMat *的文档,其中还指出对于STANDARD“矩阵必须是(创建的序列将是)CV_32FC2类型”

我不清楚我需要做什么才能从STANDARD hough行返回并处理正确的输出数据(即每行给出rho和theta信息的2x1向量)。

非常感谢任何帮助。谢谢

-Sal

1 个答案:

答案 0 :(得分:2)

我几天前遇到了同样的问题。这就是我使用编组解决它的方法。如果您找到更简单的解决方案,请告诉我。

using (MemStorage stor = new MemStorage())
{
    IntPtr lines = CvInvoke.cvHoughLines2(canny.Ptr, stor.Ptr, Emgu.CV.CvEnum.HOUGH_TYPE.CV_HOUGH_STANDARD, rhoResolution, (thetaResolution*Math.PI)/180, threshold, 0, 0);

    int maxLines = 100;
    for(int i = 0; i < maxLines; i++)
    {
        IntPtr line = CvInvoke.cvGetSeqElem(lines, i);
        if (line == IntPtr.Zero)
        {
            // No more lines
            break;
        }
        PolarCoordinates coords = (PolarCoordinates)System.Runtime.InteropServices.Marshal.PtrToStructure(line, typeof(PolarCoordinates));

        // Do something with your Hough lines
    }
}

结构定义如下:

public struct PolarCoordinates
{
    public float Rho;
    public float Theta;
}