使用CvMat使用OpenCVSharp HoughLines2方法遇到问题

时间:2012-09-13 12:39:12

标签: c# .net opencv opencvsharp

我正在使用OpenCVSharp 2.3,我在使用CvMat和Cv.Houghlines2方法时遇到了问题! HoughLines2不接受我正在创建的任何CvMat对象。之前我使用过Cv.MemStorage结构,这可行,但是它不允许你设置一个你想要检测多少行的限制?

我尝试过这样的事情:

CvMat testCvMat1 = new CvMat(maxNoOfLines,1, MatrixType.F32C2);
// Line detection
OpenCvSharp.CvSeq lines = srcImgGray.HoughLines2(storage, OpenCvSharp.HoughLinesMethod.Standard, this.rhoSteps, this.thetaSteps, this.accuThreshold, 0, 0);
testCvMat1.Dispose();

或与PPHL

CvMat testCvMat2 = new CvMat(maxNoOfLines, 1, MatrixType.S32C4);
lines = srcImgGray.HoughLines2(testCvMat2, HoughLinesMethod.Probabilistic, this.rhoSteps, this.thetaSteps, this.accuThreshold, 50, 10);
testCvMat2.Dispose();

我总是得到相同的异常,这显然是C#异常:

  

错误:值不能为空。参数名称:ptr

即使我尝试这样的事情

CvMat testCvMat1 = new CvMat(maxNoOfLines,1, MatrixType.F32C2, new float[limit,2]);
CvMat testCvMat1 = new CvMat(1, maxNoOfLines, MatrixType.F32C2, new float[maxNoOfLines, 2]);
CvMat testCvMat1 = new CvMat(1, maxNoOfLines, MatrixType.F32C2);
CvMat testCvMat1 = new CvMat(1, maxNoOfLines, MatrixType.F32C2, 0);

我总是得到同样的例外,这显然是不对的。

我还在OpenCVSharp源代码中查找了任何错误的代码,但一切似乎都有效?!

那么,我做错了什么?有人有同样的经历吗?


好的,我自己找到了解决这个问题的方法:

包装器在HoughLines2 funktion的非托管调用发生的位置有一些错误的代码:

public static CvSeq HoughLines2(CvArr image, CvMat line_storage, HoughLinesMethod method, double rho, double theta, int threshold, double param1, double param2)
    {
        if (image == null)
            throw new ArgumentNullException("image");
        if (line_storage == null)
            throw new ArgumentNullException("line_storage");
        IntPtr result = CvInvoke.cvHoughLines2(image.CvPtr, line_storage.CvPtr, method, rho, theta, threshold, param1, param2);
        return new CvSeq(result);
    }

返回值导致异常,因为当一个有效的CvMat对象被选为lineStorage Structure时,HoughLines2返回nullPtr,这对于在此方法的最后一行构建CvSeq对象无效!!这必须改变!只需检查结果指针是否是有效指针并处理返回值,也可以为null。

我现在使用CvInvoke.Houghlines2(...)代替我自己处理这个问题。它很棒:)!

0 个答案:

没有答案