使用2D数组初始化EMGU(NOT OpenCV C ++)Mat(C#)

时间:2018-11-26 20:15:38

标签: emgucv

我知道这“看起来”像一个重复的问题,但是-我无法以任何明确的方式回答。   在C ++中,可以像这样通过OpenCv操作来初始化Mat:

    float[,] camera = new float[,] {
                    { 857.483f, 0.0f, 968.06f },
                    { 0.0f, 876.72f, 556.37f },
                    { 0.0f, 0.0f, 1.0f }
                };
    A = Mat(3,3, CV_32FC1, &camera);

请注意,数组为2D。   现在,我想在EMGU中完成同一件事,//使用托管C#;因此Mat的构造方式为:

    Mat _cameraMatrix = new Mat(3, 3, DepthType.Cv64F, 1);
// and a similar 1D Mat:
    Mat _distCoeffs = new Mat(8, 1, DepthType.Cv64F, 1);
// to be passed to the method:
   CvInvoke.Undistort(bkgimage, ndimage, _cameraMatrix, _distCoeffs);

与cv :: Mat不同,EMGU Mat的构造函数似乎没有明显的方法将2D“相机”数据导入其中。任何人都能成功使用这种代码吗?

2 个答案:

答案 0 :(得分:0)

根据EmguCV文档,有一个构造函数将IntPr用作“数据”: 参见http://www.emgu.com/wiki/files/3.4.3/document/html/c8424736-2d44-c5d6-212f-31dedfe6fb95.htm

问题是如何获取该指针。在这里,也许这篇文章会为您提供帮助:

How to get IntPtr from byte[] in C#

希望这至少可以帮助您入门。

答案 1 :(得分:0)

很有趣,在尝试解决完全相同的问题-相机校准时,我遇到了这个问题。 有一种更简单但不太优雅的方法可以解决此问题:

Image<Gray, float> camImage = new Image<Gray, float>(new float[,,]
{
    {intrinsics.fx}, {0}, {intrinsics.ppx}},
    { {0}, {intrinsics.fy}, {intrinsics.ppy}},
    { {0}, {0}, {1} }
});
var camMatrix = camImage.Mat;

Image<Gray, float> distImage = new Image<Gray, float>(new float[,,] {{{0},{0},{0},{0}}});
var distCoeffs = distImage.Mat;

不确定这是最佳答案,但它是一个答案。