1

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(...) を使用し、その問題を自分で処理します。そして、それはうまく機能します:)!

4

0 に答える 0