如何在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);
我设置错误的值吗?移植不是那么简单吗?
看起来像您的camera.SourceImage
和newSourceImage
的差异。在第一个代码片段中,您将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重新创建它。或者可以单独解除通道的扭曲并合并。几乎不理想,但你不能修复隐藏行为,只能绕过它。