OpenCV 不支持输入图像的深度,使用 cv2.cvtColor 时 'depth' 为 3 (CV_16S)

OpenCV unsupported depth of input image, 'depth' is 3 (CV_16S) when using cv2.cvtColor

我正在读取视频文件并将其转换为 numpy 数组。

像这样:

video= np.array(skvideo.io.vread(folder + "video.avi"), dtype=np.int16)

稍后我访问第一帧并将其保存在img下

img = video[0]

形状现在有 3 个通道:

389, 516, 3

转换为灰度时:

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

我收到这个错误:

error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.simd_helpers.hpp:94: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3, 4>; VDcn = cv::impl::{anonymous}::Set<1>; VDepth = cv::impl::{anonymous}::Set<0, 2, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = (cv::impl::<unnamed>::SizePolicy)2u; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'
> Unsupported depth of input image:
>     'VDepth::contains(depth)'
> where
>     'depth' is 3 (CV_16S) 

视频和图片显示正常。 我实际上遇到了这个错误,因为我想绘制直方图,但在通过第一帧时出现没有文档的错误。

我可以使用 cv2.VideoCapture 吗? 我不明白这是怎么回事,因为它是一个非常好的 numpy 数组。

感谢您的帮助!

奇怪的是,如果我读入带有视频捕获的视频然后遍历帧,它确实有效。

所以上述的一种解决方案是

video= cv2.VideoCapture(folder + 'video.avi')
is_true, frame = video.read()

然后像以前一样做剩下的事情。

如果有人能解释为什么(数组之间的区别是什么)那就太好了。

cvtColor报错因为数据有错dtype.

您的数据有 dtype int16(有符号整数)。

cvtColor 只接受 uint8uint16float32。在 OpenCV 中,它们是 CV_8UCV_16UCV_32F,它们的数值为 0, 2, 5.

解决方案:使用支持的数据类型。似乎 skvideo.io.vread 已经 returns 数据在 uint8 中。把它周围多余的 np.array(..., dtype=np.int16) 去掉。