7

私は OpenCVSharp を使用していますが、現在、コードの半分を C で、残りの半分を C++ API で使用しています。非推奨の API を回避し、画像を 2 回ロードすることを回避するために、すべてを C++ バージョンに移植しようとしています (画像ごとに 1つMatずつではなく、共有します)MatCvMat

動作するコードは次のとおりです。

            CvMat distortion = new CvMat(8, 1, MatrixType.F64C1);
            distortion[0, 0] = camera.CameraConfig.k1;
            distortion[1, 0] = camera.CameraConfig.k2;
            distortion[2, 0] = camera.CameraConfig.p1;
            distortion[3, 0] = camera.CameraConfig.p2;
            distortion[4, 0] = camera.CameraConfig.k3;
            distortion[5, 0] = 0;
            distortion[6, 0] = 0;
            distortion[7, 0] = 0;

            CvMat intrinsic = new CvMat(3, 3, MatrixType.F32C1);
            intrinsic[0, 0] = camera.CameraConfig.fx;
            intrinsic[0, 1] = camera.CameraConfig.skew;
            intrinsic[0, 2] = camera.CameraConfig.cx;
            intrinsic[1, 0] = 0;
            intrinsic[1, 1] = camera.CameraConfig.fy;
            intrinsic[1, 2] = camera.CameraConfig.cy;
            intrinsic[2, 0] = 0;
            intrinsic[2, 1] = 0;
            intrinsic[2, 2] = 1;
            Cv.Undistort2(camera.SourceImage, newSourceImage,intrinsic,distortion);

そして、動作しないコード (入力したときは明らかなポートのように見えました) (シーンに存在する色の単一の色付きの画像になってしまいます):

            Mat distortion = new Mat(8, 1, MatType.CV_64FC1);
            distortion.Set(0, 0, camera.CameraConfig.k1);
            distortion.Set(1, 0, camera.CameraConfig.k2);
            distortion.Set(2, 0, camera.CameraConfig.p1);
            distortion.Set(3, 0, camera.CameraConfig.p2);
            distortion.Set(4, 0, camera.CameraConfig.k3);
            distortion.Set(5, 0, 0);
            distortion.Set(6, 0, 0);
            distortion.Set(7, 0, 0);

            Mat intrinsic = new Mat(3, 3, MatType.CV_32FC1);
            intrinsic.Set(0, 0, camera.CameraConfig.fx);
            intrinsic.Set(0, 1, camera.CameraConfig.skew);
            intrinsic.Set(0, 2, camera.CameraConfig.cx);
            intrinsic.Set(1, 0, 0);
            intrinsic.Set(1, 1, camera.CameraConfig.fy);
            intrinsic.Set(1, 2, camera.CameraConfig.cy);
            intrinsic.Set(2, 0, 0);
            intrinsic.Set(2, 1, 0);
            intrinsic.Set(2, 2, 1);
            var newSourceImage = camera.SourceImage.Undistort(intrinsic, distortion);

値を間違って設定していませんか? 移植はそれほど簡単ではありませんか?

4

2 に答える 2

0

これを解決しましたか?

私は OpenCVSharp を使用していませんが、C++ で OpenCV を使用し、C++/CLI ラッパーを使用して C# から呼び出しています。以前に EmguCV を使用したことがありますが、C++ で OpenCV を使用する方がラッパーを使用するよりも優れていると思います。デバッグしてコール スタックを確認できるため、エラーが明確になることがあります。また、OpenCV の C++ および Python API を支援する幅広いコミュニティもあります。

そうは言っても、私の経験から、ネイティブ コードにアクセスしてデバッグできれば、OpenCV の undistort が実際に適切なパラメーターを取得していることを確認できるので、それが最適です。ネイティブ コードのデバッグを有効にしてみてください。ただし、デバッグするには OpenCVSharp のソース コードも必要になると思います。

これがうまくいかない場合は、OpenCV の元の undistort メソッドを見て、OpenCVSharp を使用して再作成することができます。または、チャネルを別々に歪ませてマージすることもできます。理想的ではありませんが、隠れた動作を修正することはできません。回避するだけです。

于 2015-10-21T12:49:13.897 に答える