gpt4 book ai didi

python - 在 OpenCV 中更改 channel 顺序会阻止绘制矩形

转载 作者:太空宇宙 更新时间:2023-11-03 21:39:51 24 4
gpt4 key购买 nike

我写了一些代码来创建一个黑色图像,然后在左上角画一个红色方 block :

import cv2
import numpy as np

x = np.zeros([100, 100, 3], dtype=np.float32)
print(x.shape)
cv2.rectangle(x, (0, 0), (50, 50), (0, 0, 255), -1)
cv2.imwrite('x.png', x)

这将保存以下图像:

enter image description here

它打印出 x 的形状为 (100, 100, 3)。这一切都符合预期。

但是,由于我现在不想解释的原因,图像实际上以不同的格式到达。 OpenCV 要求的 channel 顺序不是[y, x, colour],而是[colour, y, x]。因此,我需要更改 channel 顺序。

所以我的最终代码是:

import cv2
import numpy as np

y = np.zeros([3, 100, 100], dtype=np.float32)
y = np.moveaxis(y, 0, 2)
print(y.shape)
cv2.rectangle(y, (0, 0), (50, 50), (0, 0, 255), -1)
cv2.imwrite('y.png', y)

然而,这只是保存了一张黑色图像:

enter image description here

但它打印出 y 的形状为 (100, 100, 3),即与 x 相同。在这两种情况下,此打印输出行下方的代码实际上是相同的。所以两个图像是相同的(都是 float32 NumPy 数组,到处都是零,维度为 (100, 100, 3))。

那么为什么更改 channel 顺序会导致 OpenCV 无法绘制矩形,而这两种情况下图像应该相同?

最佳答案

问题是,根据this doc , np.moveaxis 返回带有移动轴的 Array。该数组是输入数组的 View 。所以

cv2.rectangle(y, (0, 0), (50, 50), (0, 0, 255), -1)

并没有真正利用内存。我不确定 cv2 如何调用 C 函数并与内存交互。但我认为创建副本更安全:

y = np.zeros([3, 100, 100], dtype=np.uint8)
y = np.uint8(np.moveaxis(y, 0, 2)).copy()

cv2.rectangle(y, (0, 0), (50, 50), (0, 0, 255), -1)
plt.imshow(y[:,:, [2,1,0]]);

并且输出符合预期。还要注意 dtype=np.uint8不是 np.float32?

关于python - 在 OpenCV 中更改 channel 顺序会阻止绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57150911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com