OpenCV - remap() - 获取黑色像素

Posted

技术标签:

【中文标题】OpenCV - remap() - 获取黑色像素【英文标题】:OpenCV - remap() - getting black pixels 【发布时间】:2016-07-12 15:16:49 【问题描述】:

我正在使用 STMap 来映射使用 remap() 的 .jpg 图像。

我加载了我的 STMap,拆分了通道并将每个通道矩阵转换为 CV_32FC1。 我检查了它们,它起作用了——每个矩阵都正确显示,它的所有值都在 0.0 和 1.0 之间。

但是,当我尝试使用remap() 函数时:

Mat dst;
remap(image4, dst,map_x,map_y,INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));
imshow( "Result", dst );

它只是显示一个黑色图像。

    image4 = 我的 .jpg 图片 map_x = 灰度 CV_32FC1(红色通道 原始STMP的) map_y = 灰度 CV_32FC1(绿色通道 原始 STMap 的)

可能是什么问题?

谢谢!

【问题讨论】:

我猜 map_x 和 map_y 必须是坐标(重新映射到的位置)而不是图像?不确定... 从网上查到的例子应该是 Mat 结构。 是一个 Mat,但像素值是目标像素位置。例如,如果您在 position(100, 200) 的源像素应放置在 position(300, 400) 您的 map_x.at(100,200)=300 和 map_y.at(100,200)=400 或 map_x/ y.at(300,400)=100/200,不确定。 map_x和map_y里面的值不应该是float类型吗? (CV_32FC1)。就我而言,它们是,所以它们的范围仅在 0.0 和 1.0 之间 它们是像素位置,范围(最多)从 0 到 imageWidth 和 0 到 imageHeight (使用浮点数是因为您可以通过设置某些像素之间的位置进行插值)。请参阅docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/remap/… 他们如何设置地图以翻转图像。 【参考方案1】:

使用cv::remap 时出现黑色图像是由于在传递的地图中使用偏移而不是绝对位置。

光流算法通常导出运动矢量,而不是绝对位置,而cv::remap 期望从中采样的绝对坐标(子像素)。

要在两者之间进行转换,从CV_32FC2 流矩阵开始,我们可以这样做:

// Convert from offsets to absolute locations.
Mat mapx(flow.size(), CV_32FC1);
Mat mapy(flow.size(), CV_32FC1);
for (int row = 0; row < flow.rows; row++)

  for (int col = 0; col < flow.cols; col++)
  
    Point2f f = flow.at<Point2f>(row, col);
    mapx.at<float>(row, col) = col + f.x;
    mapy.at<float>(row, col) = row + f.y;
  

那么mapxmapy就可以在remap中使用了。

【讨论】:

以上是关于OpenCV - remap() - 获取黑色像素的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV在轮廓边界内获取黑色像素

OpenCV 例程300篇249. 图像的重映射(cv2.remap)

OpenCV 例程300篇249. 图像的重映射(cv2.remap)

如何使用opencv获取已经灰度化二值化的一张黑色图片中的一个亮点的具体像素坐标

详解OpenCV的坐标重映射函数remap()的两种使用方法并附使用它得到图像的水平镜像和垂直镜像的示例代码

Opencv在图像上绘制黑色像素