Android OpenCV(C#)中的不失真点,并正确形成输入矩阵

Android OpenCV(C#)中的不失真点,并正确形成输入矩阵,c#,android,opencv,C#,Android,Opencv,为了加速我为Android平台开发的计算机视觉实时应用程序中的某些处理,我希望不失真一些关键点,而不是整个帧。我已尽我所能遵循文档,但收到以下错误: OpenCV错误:断言失败(CV_IS_MAT(_cameraMatrix)和&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 相关文件如下: 在我的代码中,我单独定义和填充矩阵元素,因为它们很小。我无法找到一种方法来优雅地填充MatofPoi

为了加速我为Android平台开发的计算机视觉实时应用程序中的某些处理,我希望不失真一些关键点,而不是整个帧。我已尽我所能遵循文档,但收到以下错误:

OpenCV错误:断言失败(CV_IS_MAT(_cameraMatrix)和&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

相关文件如下:

在我的代码中,我单独定义和填充矩阵元素,因为它们很小。我无法找到一种方法来优雅地填充MatofPoint2f,但搜索导致我从列表中转换,如下所示

Mat camMtx = new Mat(1, 5, CvType.Cv64fc1, new Scalar(0));
Mat distCoef = new Mat(3, 3, CvType.Cv64fc1, new Scalar(0));
MatOfPoint2f uncalibpoints = new MatOfPoint2f();
MatOfPoint2f calibpoints = new MatOfPoint2f();
List<Point> points = new List<Point>();
points.Add(center); //Some previously stored point
points.Add(apex1); //Some previously stored point
points.Add(apex2); //Some previously stored point
points.Add(apex3); //Some previously stored point
uncalibpoints.FromList(points); //Convert list of points to MatofPoint2f

Console.WriteLine(uncalibpoints.Channels());
Console.WriteLine(uncalibpoints.Size());
Console.WriteLine(uncalibpoints.GetType());

//Manually setting the matrix values
distCoef.Put(0, 0, 0.51165764);
distCoef.Put(0, 1, -1.96134156);
distCoef.Put(0, 2, 0.00600294);
distCoef.Put(0, 3, 0.00643735);
distCoef.Put(0, 4, 2.59503145);
camMtx.Put(0, 0, 1551.700);
camMtx.Put(0, 1, 0.0);
camMtx.Put(0, 2, 962.237163);
camMtx.Put(1, 0, 0.0);
camMtx.Put(1, 1, 1536.170);
camMtx.Put(1, 2, 589.418432);
camMtx.Put(2, 0, 0.0);
camMtx.Put(2, 1, 0.0);
camMtx.Put(2, 2, 1.0);

Imgproc.UndistortPoints(uncalibpoints, calibpoints, camMtx, distCoef);`
Mat camMtx=新的Mat(1,5,CvType.Cv64fc1,新的标量(0));
Mat distCoef=新的Mat(3,3,CvType.Cv64fc1,新的标量(0));
MatOfPoint2f取消验证点=新的MatOfPoint2f();
MatOfPoint2f校准点=新的MatOfPoint2f();
列表点=新列表();
点。添加(中间)//一些以前存储的点
添加点(apex1)//一些以前存储的点
添加点(apex2)//一些以前存储的点
添加点(apex3)//一些以前存储的点
从列表中取消验证点(点)//将点列表转换为MatofPoint2f
Console.WriteLine(uncalibpoints.Channels());
Console.WriteLine(uncalibpoints.Size());
WriteLine(uncalibpoints.GetType());
//手动设置矩阵值
distCoef.Put(0,0,0.51165764);
距离系数Put(0,1,-1.96134156);
distCoef.Put(0,2,0.00600294);
distCoef.Put(0,3,0.00643735);
距离系数Put(0,4,2.59503145);
camMtx.Put(0,01551.700);
camMtx.Put(0,1,0.0);
camMtx.Put(0,2962.237163);
camMtx.Put(1,0,0.0);
camMtx.Put(1,1,1536.170);
凸轮轴(1,2,589.418332);
camMtx.Put(2,0,0.0);
camMtx.Put(2,1,0.0);
camMtx.Put(2,2,1.0);
不失真点(未校准点、校准点、camMtx、distCoef)`

上述代码存在两个问题:

  • camMtx和Distcoff分配中的简单错误(在复制粘贴类型错误中反转了它们的分配)

  • 取消扭曲点调用应如下所示:

    不失真点(未校准点、校准点、camMtx、distCoef、new Mat()、camMtx)