如何在OpenCV中使用双重类型的地图重新映射
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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错误:断言失败(((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行
感谢@Yakk的建议:
我用map.convertTo(map, CV_32FC1)
破解了一个解决方案,这对我来说非常好。
以上是关于如何在OpenCV中使用双重类型的地图重新映射的主要内容,如果未能解决你的问题,请参考以下文章
opencv InitUndistortRectifyMap 地图大小