Как использовать карты двойного типа для переназначения в OpenCV

Проблема с cv::remap():

Я использую двойные значения для моих координат изображения и хочу cv::remap() те, чтобы создать искаженное изображение.

Тем не мение, OpenCV только позволяет мне использовать CV_32FC1 (float) как тип карты, а не CV_64FC1 (double).

За исключением типотипирования моего double значения для float перед переназначением и использованием карт типа float для cv::remap()Есть ли другой способ?

Фрагмент кода:

Eigen::Vector2d distort(Eigen::Vector2d & pointUndistorted);

int main(int argc, char** argv) {
cv::Mat image, dst;
image = cv::imread(argv[1], 1);
Eigen::Vector2d pointUndistorted;
Eigen::Vector2d pointDistorted;
int w = image.rows;
int h = image.cols;
cv::Mat map1(w,h,CV_64FC1);
cv::Mat map2(w,h,CV_64FC1);

for (int wIdx = 0; wIdx < w; ++wIdx)
{
for (int hIdx = 0; hIdx < h; ++hIdx)
{
pointUndistorted << (double)wIdx / (double)w -0.5, (double)hIdx / (double)h -0.5;
pointDistorted = distort(pointUndistorted);

map1.at<double>(wIdx,hIdx) = (pointDistorted[0] + 0.5) * h;
map2.at<double>(wIdx,hIdx) = (pointDistorted[1] + 0.5) * w;
}
}

cv::remap(image, dst, map1, map2, cv::INTER_LINEAR);
}

Это дает мне следующую ошибку:

Ошибка OpenCV: утверждение не выполнено (((map1.type () == (((5) & ((1 << 3) —
1)) + ((((2) -1) << 3)) || map1.type () == (((3) & ((1 << 3) — 1)) +
(((2) -1) << 3))) && map2.empty ()) || (map1.type () == (((5) & ((1 << 3)
— 1)) + (((1) -1) << 3)) && map2.type () == (((5) & ((1 << 3) — 1)) + (((1) -1) << 3)))) в передел, файл
/tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/imgproc/src/imgwarp.cpp,
линия 1840

0

Решение

Спасибо @Yakk за предложение:

Я взломал обходной путь с map.convertTo(map, CV_32FC1), который прекрасно работает для меня.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]