【问题标题】:What format should I use for a Opencv image if I need to access the underlaying data?如果我需要访问底层数据,我应该为 Opencv 图像使用什么格式?
【发布时间】:2021-06-30 15:48:39
【问题描述】:

我制作了一个使用 OpenCL 创建图像的程序,在 OpenCL 代码中我必须访问 opencv-image 的底层数据并直接修改它,但我不知道数据在内部是如何排列的。

我目前正在使用CV_8U,因为表示非常简单,0 黑色 255 白色以及介于两者之间的所有内容,但我想添加颜色,但我不知道使用什么格式。

这就是我目前修改图像A[y*width + x] = 255;的方式。

【问题讨论】:

    标签: opencv image-processing opencl


    【解决方案1】:

    由于您的A[y*width + x] = 255; 工作正常,那么底层图像数据 A 必须是大小为宽度 * 高度的一维像素数组,每个元素都是一个 cv_8u(8 位无符号整数)。

    【讨论】:

    • 但是我想加颜色不知道用什么其他格式
    • 您最初的问题并不清楚。由于您使用的是 CV_8U,因此像素格式是 8 位无符号整数,只是简单的灰度。有 CV_8uc3 等,其中“c3”指定有三个通道,通常是 RGB。那么你的一维数组应该是 3 * 宽 * 高,A[y*width*3 + x * 3 + 0] 将是 R,A[y*width*3 + x * 3 + 1] G,A[y*width*3 + x * 3 + 1] B。可能有办法为此制作一个 2D 甚至 3D 数组,但在最后它通常只是一大块线性内存。
    • 谢谢,这正是我所需要的 C3 正是我所需要的,现在我看到它非常直观。只有一件事如果我理解正确,每种颜色都是 0-255 的一个字节,还是每个像素有 3 个字节?我认为是后者。
    • 提出新的问题或未提及的事情。 How to Ask.
    【解决方案2】:

    像素的颜色值,在 OpenCV 的情况下,将在内存中排列B G R。 RGB 顺序会更常见,但 OpenCV 喜欢 BGR。

    您的数据应该是CV_8UC3,如果您使用imreadVideoCapture,就是这种情况。如果不是这样,则需要对以下信息进行相应的解释。

    您的数组索引数学需要扩展以考虑数据的布局:

    [(y*width + x)*3 + channel]
    

    3 因为 3 个频道。 channel 是 0..2,x 和 y 如你所愿。

    【讨论】:

      【解决方案3】:

      如其他答案中所述,您需要将此单通道图像转换为 3 通道图像才能具有颜色。 3 个通道是蓝色、绿色、红色 (BGR)。

      OpenCV 有一个方法可以做到这一点,cv2.cvtColor(),这个方法接受一个输入图像(在这种情况下是你拥有的单通道图像)和一个转换代码(更多信息请参见here)。

      所以代码如下:

      color_image = cv2.cvtColor(source_image, cv2.COLOR_GRAY2BGR)
      

      然后您可以通过访问每个颜色通道来修改颜色,例如

      color_image[y, x, 0] = 255 # this changes the first channel (Blue)
      

      【讨论】:

      • OP 声明他们使用 OpenCL 并暗示他们编写自己的 OpenCL 内核。 OpenCL 不支持该索引语法。
      • @ChristophRackwitz 你可能是对的。这个答案是为了帮助指出要做什么并提供一个大致的方向。由于问题上有一个“opencv”标签,我继续使用 OpenCV 语法。祝你有美好的一天。
      猜你喜欢
      • 2011-12-24
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2017-03-25
      • 2010-10-27
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多