我想在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);
说明:
IntrinsicParameters
是一个自定义类,它包装了所有内部参数,我使用了默认值)。我在上面添加了一条注释来表示哪个参数是哪个VectorOfPoint
的{{1}}我想扭曲。points
来保存结果我试图找到一些解释,但这只是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 )
时会发生这种情况。我不确定为什么会这么复杂。
答案 0 :(得分:1)
看起来问题确实是Point
类。
更改代码以分别使用PointF
和VectorOfPointF
解决了问题:
VectorOfPointF points = new VectorOfPointF(new PointF[] { new PointF(0, 0), new PointF(255, 255) });
VectorOfPointF pointsUndistorted = new VectorOfPointF(points.Size);