如何在OpenCVSharp代码中使用新的c++风格的API

本文关键字:c++ 风格 API OpenCVSharp 代码 | 更新日期: 2023-09-27 18:15:15

我正在使用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);

我设置错误的值吗?移植不是那么简单吗?

如何在OpenCVSharp代码中使用新的c++风格的API

看起来像您的camera.SourceImagenewSourceImage的差异。在第一个代码片段中,您将newSourceImage分配到作用域之外,因此我假设您可以这样做:

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

但是在第二个代码片段中,您将其创建为var newSourceImage = ...。所以,它看起来像"不扭曲"自己决定你的垫类型,并做错了。

你能显示所有的初始化吗?

这个问题解决了吗?

我没有使用OpenCVSharp,但我在c++中使用OpenCV,并使用c++/CLI包装器从c#调用它。我以前使用过EmguCV,我认为在c++中使用OpenCV比通过包装器更好,有时错误更清晰,因为你可以调试和查看调用堆栈,而且有一个更广泛的社区来帮助你使用OpenCV的c++和Python api。

也就是说,从我的经验来看,如果你能找到本机代码并调试它,那将是最好的,这样你就可以确保OpenCV的undistort实际上得到了正确的参数。尝试启用本地代码调试,但我认为你也需要OpenCVSharp的源代码来调试它。

如果这不起作用,也许你可以看看OpenCV的原始undistortion方法,并使用OpenCVSharp重新创建它。或者可以单独解除通道的扭曲并合并。几乎不理想,但你不能修复隐藏行为,只能绕过它。