使用切片numpy数组调用mp.Image()会引发TypeError:__init__():不兼容的构造函数参数

lx0bsm1f  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(106)

我尝试使用Mediapipe来检测手。
密码

cv_mat = cv2.imread("hand.jpg")
cv_mat = cv_mat[..., ::-1]
image = mp.Image(image_format=mp.ImageFormat.SRGB, data=cv_mat)

无法正常工作,出现错误:

INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
Traceback (most recent call last):
    image = mp.Image(image_format=mp.ImageFormat.SRGB, data=cv_mat)
TypeError: __init__(): incompatible constructor arguments. The following argument types are supported:
    1. mediapipe.python._framework_bindings.image.Image(image_format: mediapipe::ImageFormat_Format, data: numpy.ndarray[numpy.uint8])
    2. mediapipe.python._framework_bindings.image.Image(image_format: mediapipe::ImageFormat_Format, data: numpy.ndarray[numpy.uint16])
    3. mediapipe.python._framework_bindings.image.Image(image_format: mediapipe::ImageFormat_Format, data: numpy.ndarray[numpy.float32])

Invoked with: kwargs: image_format=<ImageFormat.SRGB: 1>, data=array([[[255, 255, 255],...

如果我删除第二行cv_mat = cv_mat[..., ::-1]-它工作。
为什么?
切片是否有其他类型?
它在opencv中工作正常,我可以更改它,wfite到文件等。

djp7away

djp7away1#

mp.Image constructor的文档可能会更清晰一些,但它只支持“C命令”输入:
像素以交错方式被编码为行为主。[...]可以通过从连续存储像素数据的numpy ndarray中复制数据来创建图像
仔细查看构造帮助器可以确认它采用的是C顺序。
使用[...,::-1]转换为RGB改变了与矩阵相关的步幅,因此它实际上不再是连续的(尽管在某种意义上底层数据仍然是连续的)。
简单的修复方法是制作数据的副本(例如cv_mat[..., ::-1].copy()),或者就像你提到的那样使用cvtColor(),它的开销最小,但对你正在做的事情很明确:-)

相关问题