Это может быть размер вашей матрицы:)
OpenCV ожидает вектор точек - столбец или матрицу строк с двумя каналами. Но поскольку ваша входная матрица составляет всего 2 точки, а количество каналов также равно 1, она не может определить, что является входом, строкой или столбцом.
Итак, заполните более длинный входной мат фиктивными значениями и оставьте только первое:
const int npoints = 4; // number of point specified
// Points initialization.
// Only 2 ponts in this example, in real code they are read from file.
float input_points[npoints][4] = {{0,0}, {2560, 1920}}; // the rest will be set to 0
CvMat * src = cvCreateMat(1, npoints, CV_32FC2);
CvMat * dst = cvCreateMat(1, npoints, CV_32FC2);
// fill src matrix
float * src_ptr = (float*)src->data.ptr;
for (int pi = 0; pi < npoints; ++pi) {
for (int ci = 0; ci < 2; ++ci) {
*(src_ptr + pi * 2 + ci) = input_points[pi][ci];
}
}
cvUndistortPoints(src, dst, &camera1, &distCoeffs1);
EDIT
Хотя OpenCV указывает undistortPoints, принимают только 2-канальный ввод, фактически он принимает
- 1-колоночный, 2-канальный, многорядный мат или (и этот случай не задокументирован)
- 2 столбца, многорядный, 1-канальный мат или
- мультиколонка, 1 ряд, 2-канальный коврик
(как видно из undistort.cpp, строка 390)
Но внутренняя ошибка (или отсутствие доступной информации) приводит к неправильному смешиванию второго с третьим, когда количество столбцов равно 2. Итак, ваши данные считаются двухстрочными, двухрядными, 1-канальный.