我正在使用OpenCVSharp,但目前我一半的代码在C中,另一半在C++应用程序接口中,我正在尝试将其全部移植到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);我是否错误地设置了值?移植不是那么简单吗?
发布于 2017-07-28 21:09:08
看起来你的camera.SourceImage和newSourceImage的不同之处。在您的第一个代码片段中,您指定了超出作用域的newSourceImage,因此我假设您可以这样做:
newSourceImage = new Mat(new Size(...), MatType.CV_8UC3)但是在您的第二个代码片段中,您将其创建为var newSourceImage = ...。因此,它看起来像是“无失真”本身决定了你的Mat类型,但它做错了。
你能展示所有的初始化吗?
发布于 2015-10-21 20:49:14
你解决这个问题了吗?
我没有使用过OpenCVSharp,但我在C++中使用了OpenCV,并使用C++/CLI包装器从C#调用它。我以前使用过EmguCV,我认为在C++中使用OpenCV比通过包装器更好,有时错误会更清楚,因为你可以调试和查看调用堆栈,而且还有更广泛的社区可以帮助你使用OpenCV的C++和Python。
这就是说,根据我的经验,如果你能接触到原生代码并对其进行调试,那将是最好的,这样你就可以确保OpenCV的不失真实际上得到了正确的参数。尝试启用本机代码调试,但我认为您也需要OpenCVSharp的源代码来调试它。
如果这不起作用,也许你可以看看OpenCV的原始不失真方法,然后用OpenCVSharp重新创建它。或者,将通道分开并合并,使其不失真。算不上理想,但你不能修复隐藏的行为,只能绕过它。
https://stackoverflow.com/questions/32870747
复制相似问题