我知道这“看起来”像一个重复的问题,但是-我无法以任何明确的方式回答。 在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“相机”数据导入其中。任何人都能成功使用这种代码吗?
答案 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;
不确定这是最佳答案,但它是一个答案。