我正在使用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(...)代替我自己处理这个问题。它很棒:)!