为什么 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);
解释:
IntrinsicParameters
是一个自定义的 class,它包装了我使用默认值的所有内部参数)。我在上面添加了一个注释来表示哪个参数是哪个
- 我创建了一个名为
points
的 VectorOfPoint
,我想对其进行扭曲。
- 我创建另一个
VectorOfPoint
来保存结果
- 程序挂在所提供代码段的最后一行。当我在 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 的问题。
将代码更改为使用 PointF
和 VectorOfPointF
分别解决了问题:
VectorOfPointF points = new VectorOfPointF(new PointF[] { new PointF(0, 0), new PointF(255, 255) });
VectorOfPointF pointsUndistorted = new VectorOfPointF(points.Size);
我想取消扭曲 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
是一个自定义的 class,它包装了我使用默认值的所有内部参数)。我在上面添加了一个注释来表示哪个参数是哪个- 我创建了一个名为
points
的VectorOfPoint
,我想对其进行扭曲。 - 我创建另一个
VectorOfPoint
来保存结果 - 程序挂在所提供代码段的最后一行。当我在 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 的问题。
将代码更改为使用 PointF
和 VectorOfPointF
分别解决了问题:
VectorOfPointF points = new VectorOfPointF(new PointF[] { new PointF(0, 0), new PointF(255, 255) });
VectorOfPointF pointsUndistorted = new VectorOfPointF(points.Size);