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