如果我需要访问底层数据,Opencv图像应该使用什么格式



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

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

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

由于A[y*width + x] = 255;工作正常,因此底层图像数据A必须是大小为width*height的1D像素阵列,每个元素都是cv_8u(8位无符号int(。

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

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

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

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

3,因为有3个通道。channel是0..2,x和y正如您所期望的那样。

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

OpenCV有一个实现这一点的方法,cv2.cvtColor((,该方法获取一个输入图像(在本例中为您所拥有的单通道图像(和一个转换代码(请参阅此处了解更多信息(。

因此,代码如下所示:

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

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

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

相关内容

最新更新