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
只接受 uint8
、uint16
和 float32
。在 OpenCV 中,它们是 CV_8U
、CV_16U
和 CV_32F
,它们的数值为 0, 2, 5
.
解决方案:使用支持的数据类型。似乎 skvideo.io.vread
已经 returns 数据在 uint8
中。把它周围多余的 np.array(..., dtype=np.int16)
去掉。
我正在读取视频文件并将其转换为 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
只接受 uint8
、uint16
和 float32
。在 OpenCV 中,它们是 CV_8U
、CV_16U
和 CV_32F
,它们的数值为 0, 2, 5
.
解决方案:使用支持的数据类型。似乎 skvideo.io.vread
已经 returns 数据在 uint8
中。把它周围多余的 np.array(..., dtype=np.int16)
去掉。