我正在尝试在OpenCV中使用重映射功能。我有一个 STMap,所以x
值在红色通道中,y
值在绿色通道中。
在这里,我正在加载要映射的源图像和STMap:
Mat image3= imread("stmap.tif", CV_32FC1);
Mat image4= imread("source.tif", CV_LOAD_IMAGE_UNCHANGED);
然后我拆分通道以从我的 STMap 中获取红色和绿色通道:
Mat bgr[3]; //destination array
split(image3,bgr);//split source
bgr[0].convertTo(bgr[0],CV_32FC1);
bgr[1].convertTo(bgr[1],CV_32FC1);
bgr[2].convertTo(bgr[2],CV_32FC1);
Mat dst;
最后,重新映射部分:
remap(image4, dst,bgr[2],bgr[1],INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));
但是,当我展示dst
垫时,它全是黑色的。我尝试将一些值打印到控制台,例如:
cout << bgr[2].at<float>(1000,300);
但它们都是0。我展示了bgr[1]
和bgr[2]
,它们绝对不全是黑色的 - 它们是灰度渐变,就像它们应该的那样。
那么问题可能出在哪里呢?
谢谢!
编辑:
我注意到每当我使用 .jpeg 文件和命令时:
cout << bgr2[2].at<float>(1000,300);
它会给我类似的东西0.1828510
但是当我使用 32 位.tif运行相同的命令时,它会给我:
1.04984e-320
编辑2:
我应该如何使用convertMaps()
功能?
这是我尝试过的,但没有奏效:
Mat image3= imread("STMap.jpg");
Mat image4= imread("image.jpg");
Mat bgr[3];
split(image3,bgr);
Mat map_x, map_y;
map_x.create( image.size(), CV_32FC1 );
map_y.create( image.size(), CV_32FC1 );
convertMaps(bgr[2], bgr[1], map_x, map_y, CV_32FC1);
另外,当我使用convertTo()
:
bgr[2].convertTo(red_channel, CV_32FC1, 1/255.0)
bgr[2]
正确显示(映射强度的灰度图像),并且red_channel
的所有值都在 0.0 和 1.0 之间
你对convertTo()
的呼吁根本没有意义。另请查看remap()
的文档,您会发现convertMap()
的参考,这是更改矩阵类型的首选方法(如果您真的必须这样做!
remap()
期望输入在特定范围内,可能还取决于输入矩阵的类型。如果它适用于 JPEG 但不适用于 32 位 TIFF,我希望您会遇到数据范围问题。