如何在 OpenCV 中使用双类型映射进行重新映射
How to use double typed maps for remapping in OpenCV
cv::remap()
有问题:
我正在为我的图像坐标使用双精度值,并希望 cv::remap()
使用它们来创建扭曲的图像。
但是,OpenCV
只允许我使用 CV_32FC1
(float
) 作为地图类型,而不是 CV_64FC1
(double
)。
除了在重新映射之前将我的 double
值类型转换为 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 Error: Assertion failed (((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)))) in remap, file
/tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/imgproc/src/imgwarp.cpp,
line 1840
感谢@Yakk 的建议:
我用 map.convertTo(map, CV_32FC1)
破解了一个变通方法,它对我来说工作得很好。
cv::remap()
有问题:
我正在为我的图像坐标使用双精度值,并希望 cv::remap()
使用它们来创建扭曲的图像。
但是,OpenCV
只允许我使用 CV_32FC1
(float
) 作为地图类型,而不是 CV_64FC1
(double
)。
除了在重新映射之前将我的 double
值类型转换为 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 Error: Assertion failed (((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)))) in remap, file /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/imgproc/src/imgwarp.cpp, line 1840
感谢@Yakk 的建议:
我用 map.convertTo(map, CV_32FC1)
破解了一个变通方法,它对我来说工作得很好。