我正在使用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);
我错误地设定了这些值吗?移植不是那么简单吗?
答案 0 :(得分:1)
看起来与camera.SourceImage
和newSourceImage
不同。在您的第一个代码段中,您将newSourceImage
指定为范围,因此我假设您可以执行以下操作:
newSourceImage = new Mat(new Size(...), MatType.CV_8UC3)
但是在第二个代码段中,您将其创建为var newSourceImage = ...
。
所以,看起来'undistort'本身决定了你的Mat类型并且做错了。
你能表明所有的初始化吗?
答案 1 :(得分:0)
你解决了这个问题吗?
我没有使用OpenCVSharp,但我在C ++中使用OpenCV并使用C ++ / CLI包装器从C#调用它。之前使用过EmguCV之后,我认为在C ++中使用OpenCV要比通过包装器更好,有时错误更清晰,因为你可以调试并查看调用堆栈,还有一个更广泛的社区来帮助你使用OpenCV的C ++和Python API。 / p>
话虽如此,根据我的经验,如果你能够访问本机代码并对其进行调试,那将是最好的,这样你就可以确定OpenCV的unistort实际上是在获得正确的参数。尝试启用本机代码调试,但我认为您也需要OpenCVSharp的源代码来调试它。
如果这不起作用,也许您可以查看OpenCV的原始undistort方法并使用OpenCVSharp重新创建它。或者可以单独取消分配频道并合并。很难理解,但你不能修复隐藏的行为,只能解决它。