我需要使用标准的霍夫变换(而不是使用实现概率霍夫变换的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,由于阅读CvMat*在OpenCV中使用的文档,它还指出,对于标准"矩阵必须是(创建的序列将是)CV_32FC2类型"
我不清楚我需要做什么来返回和处理来自标准霍夫行的正确输出数据(即每行的2x1向量给出rho和theta信息)。
任何帮助都将非常感激。谢谢你
sal
几天前我自己也遇到了同样的问题。这就是我使用编组解决它的方法。如果你找到一个更简单的解决办法,请告诉我。
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;
}