gpt4 book ai didi

opencv - 如何调用 UndistortPoints

转载 作者:行者123 更新时间:2023-12-02 17:47:32 27 4
gpt4 key购买 nike

我有一个 (x,y) 点、一个 3x3 相机矩阵和 4 个失真系数,我想得到未失真的点。我的代码看起来像这样......

double distorted_point_x = 10;
double_distorted_point_y = 20;

Emgu.CV.Matrix<double> distorted_point = new Emgu.CV.Matrix<double>(new double[,] {{distorted_point_x,distorted_point_y}});
Emgu.CV.Matrix<double> undistorted_point = new Emgu.CV.Matrix<double>(new double[,] {{-1,-1}}); // init to -1
Emgu.CV.Matrix<double> distortion_coefficients = new Matrix<double>(new double[] {0,0,0,0});
Emgu.CV.Matrix<double> camera_matrix = new Matrix<double>(new double[,] {{0,0,0},{0,0,0},{0,0,0}});

// copy the stuff; there's probably a more elegant way to copy but this works
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
camera_matrix[row, col] = my_calibrated_camera_matrix[row, col];
}
}

CvInvoke.UndistortPoints(distorted_point, undistorted_point, camera_matrix, distortion_coefficients);

undistorted_point_x = undistorted_point[0, 0];
undistorted_point_y = undistorted_point[0, 1];

当我运行(VS2010)时,我将此异常转储到异常日志文件中:
UnhandledException: OpenCV: CV_IS_MAT(_src) && CV_IS_MAT(_dst) &&
(_src->rows == 1 || _src->cols == 1) && (_dst->rows == 1 || _dst->cols
== 1) && _src->cols + _src->rows - 1 == _dst->rows + _dst->cols - 1 &&
(CV_MAT_TYPE(_src->type) == CV_32FC2 || CV_MAT_TYPE(_src->type) ==
CV_64FC2) && (CV_MAT_TYPE(_dst->type) == CV_32FC2 ||
CV_MAT_TYPE(_dst->type) == CV_64FC2)

我有来自 opencv 的 undistort.cpp,我知道这是来自 cvUndistortPoints() 中的 CV_ASSERT。我想知道它是否正在轰炸 CV_MAT_TYPE() 测试,看起来它期望矩阵有 2 个 channel 。 (当输入不是图像数据时为什么需要这个?)如果它确实需要是 2 channel ,我如何在矩阵中指定它?我尝试使用 Mat,但我不知道如何初始化 Mat 的内容。我真的很感激任何指示。谢谢。

最佳答案

cvUndistortPoints OpenCV 端的方法需要 CV_32FC2 的矩阵类型或 CV_64FC2
您可以使用带有显式 channel 编号的矩阵构造函数创建它

var rows = 1;
var cols = 1;
var channels = 2;

var distorted_point = new Matrix<double>(rows, cols, channels)
{
Data =
{
[0, 0] = distorted_point_x,
[0, 1] = distorted_point_y
}
};

var undistorted_point = new Matrix<double>(rows, cols, channels)
{
Data =
{
[0, 0] = -1,
[0, 1] = -1
}
};

或者如果您不需要 double您可以使用的精度
var distorted_point = new VectorOfPointF(new[] { new PointF(10, 20) });
var undistorted_point = new VectorOfPointF(new[] { new PointF(-1, -1) });

最后相机矩阵应该是
var camera_matrix = new Matrix<double>(3, 3);

关于opencv - 如何调用 UndistortPoints,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31732340/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com