OpenCVSharp 2.3 を使用していますが、CvMat と Cv.Houghlines2 Method の使用で問題が発生しています。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# の例外です。
エラー: 値を null にすることはできません。パラメータ名: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 関数のアンマネージ呼び出しが行われる位置にいくつかのエラー コードがあります。
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 構造体として選択されている場合、HoughLines2 は nullPtr を返します。これは、このメソッドの最後の行で CvSeq オブジェクトを構築するのに有効ではありません!! これは変更する必要があります。結果ポインターが有効なポインターであるかどうかを確認し、戻り値を処理します。これは null の場合もあります。
私は代わりに CvInvoke.Houghlines2(...) を使用し、その問題を自分で処理します。そして、それはうまく機能します:)!