为什么UndistortPoints()会因这些输入点而失败?

时间:2016-01-06 14:02:46

标签: c# opencv emgucv distortion

我想在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是一个自定义类,它包装了所有内部参数,我使用了默认值)。我在上面添加了一条注释来表示哪个参数是哪个
  2. 我创建了一个名为VectorOfPoint的{​​{1}}我想扭曲。
  3. 我创建另一个points来保存结果
  4. 该程序在提供的代码段中的最后一行处挂起。当我在VisualStudio中单击暂停时,调试器会说上面提到的断言失败。
  5. 我试图找到一些解释,但这只是there's no comment whatsoever in the openCV source code

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

    使用undistortPoints()

    进行更新

    我尝试使用Mat代替,这有点痛苦。 I found this question explaining how to set the elements of a 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 ) 时会发生这种情况。我不确定为什么会这么复杂。

1 个答案:

答案 0 :(得分:1)

看起来问题确实是Point类。

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

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

VectorOfPointF pointsUndistorted = new VectorOfPointF(points.Size);