7

我正在使用 OpenCVSharp,但目前我的一半代码在 C 中,另一半在 C++ API 中,我试图将其全部移植到 C++ 版本以避免不推荐使用的 API 以及避免加载图像两次(共享而不是每张图像Mat一个Mat和一个)CvMat

这是我的有效代码:

            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

1

看起来你的camera.SourceImagenewSourceImage. 在您的第一个片段中,您分配newSourceImage了范围之外,所以我假设您可以执行以下操作:

newSourceImage = new Mat(new Size(...), MatType.CV_8UC3)

但是在您的第二个片段中,您将其创建为var newSourceImage = .... 因此,看起来“不失真”本身决定了您的 Mat 类型并且做错了。

你能显示所有初始化吗?

于 2017-07-28T13:09:07.577 回答
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 回答