为什么 UndistortPoints() 对于这些输入点会失败?

Why does UndistortPoints() fail for these input points?

我想取消扭曲 EmguCV 中的一些点,但我在执行过程中得到 CVException,因为以下断言失败:

OpenCV: src.isContinuous() && (src.depth() == CV_32F || src.depth() == CV_64F) && ((src.rows == 1 && src.channels() == 2) || src.cols*src.channels() == 2)

我是这样调用函数的:

                                                      //fx fy,  cx,  cy, k1, k2, p1, p2
IntrinsicParameters intrinsic = new IntrinsicParameters( 1, 1, 100, 100,  0,  0,  0,  0);

VectorOfPoint points = new VectorOfPoint(new Point[] { new Point(0, 0), new Point(255, 255) });
VectorOfPoint pointsUndistorted = new VectorOfPoint(points.Size);

CvInvoke.UndistortPoints(points, pointsUndistorted, intrinsic.CameraMatrix, intrinsic.DistorionCoefficients); 

解释:

  1. IntrinsicParameters 是一个自定义的 class,它包装了我使用默认值的所有内部参数)。我在上面添加了一个注释来表示哪个参数是哪个
  2. 我创建了一个名为 pointsVectorOfPoint,我想对其进行扭曲。
  3. 我创建另一个 VectorOfPoint 来保存结果
  4. 程序挂在所提供代码段的最后一行。当我在 VisualStudio 中单击暂停时,调试器显示上述断言失败。

我试图找到一些解释这一切的意思,但是 there's no comment whatsoever in the openCV source code

我在这里做错了什么?我不应该对这种类型的积分使用 undistortPoints() 吗?但是为什么我可以将它们传递给函数呢?

更新使用 Mat

我试着用Mat代替,用起来有点痛苦。 并想出了这个代码:

int n = 2;
Mat mat = new Mat(new Size(1, n), Emgu.CV.CvEnum.DepthType.Cv32F, 2);
Mat matDistorted = new Mat(new Size(1, n), Emgu.CV.CvEnum.DepthType.Cv32F, 2);

Matrix<float> yetAnotherMatrixOr_YAM_forShort = new Matrix<float>(new float[,]{{0, 0}, {255, 255}});

mat.SetTo(yetAnotherMatrixOr_YAM_forShort);

CvInvoke.UndistortPoints(mat, matDistorted, intrinsic.CameraMatrix, intrinsic.DistorionCoefficients);

我现在得到的异常来自不同的断言(欢呼?):

OpenCV: checkScalar(value, type(), _value.kind(), _InputArray::MAT )

调用 mat.SetTo() 时似乎发生了这种情况。我不确定为什么这么复杂。

看起来确实是 Point class 的问题。

将代码更改为使用 PointFVectorOfPointF 分别解决了问题:

VectorOfPointF points = new VectorOfPointF(new PointF[] { new PointF(0, 0), new PointF(255, 255) });

VectorOfPointF pointsUndistorted = new VectorOfPointF(points.Size);