首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OpenCVSharp代码中使用新的C++风格的应用程序接口?

如何在OpenCVSharp代码中使用新的C++风格的应用程序接口?
EN

Stack Overflow用户
提问于 2015-10-01 00:02:48
回答 2查看 828关注 0票数 7

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

下面是我的代码,它可以工作:

代码语言:javascript
复制
            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);

代码(在我输入的时候看起来像是一个显而易见的端口)不起作用(我最终得到了场景中存在的一种颜色的单色图像):

代码语言:javascript
复制
            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);

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

EN

回答 2

Stack Overflow用户

发布于 2017-07-28 21:09:08

看起来你的camera.SourceImagenewSourceImage的不同之处。在您的第一个代码片段中,您指定了超出作用域的newSourceImage,因此我假设您可以这样做:

代码语言:javascript
复制
newSourceImage = new Mat(new Size(...), MatType.CV_8UC3)

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-10-21 20:49:14

你解决这个问题了吗?

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

这就是说,根据我的经验,如果你能接触到原生代码并对其进行调试,那将是最好的,这样你就可以确保OpenCV的不失真实际上得到了正确的参数。尝试启用本机代码调试,但我认为您也需要OpenCVSharp的源代码来调试它。

如果这不起作用,也许你可以看看OpenCV的原始不失真方法,然后用OpenCVSharp重新创建它。或者,将通道分开并合并,使其不失真。算不上理想,但你不能修复隐藏的行为,只能绕过它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32870747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档