如何正确获取cv2.VideoCapture对象的颜色通道数?
解决OpenCV无法正确获取视频通道数的问题
这是个很常见的OpenCV小坑!cv2.CAP_PROP_CHANNEL这个属性其实并不可靠,绝大多数视频格式下它都没法返回正确的通道数,所以你拿到0.0是完全正常的情况。要准确获取灰度视频(通道数1)或彩色视频(通道数3)的通道数,推荐用下面这个亲测有效的方案:
正确的实现方式
直接读取视频的第一帧图像,通过图像的shape属性来判断通道数,这是最可靠的做法:
def _create_capture_object(self): self._cap = cv2.VideoCapture(self._path_to_video) # 先读取一帧图像来确定通道数 ret, frame = self._cap.read() if not ret: raise ValueError(f"无法读取视频文件: {self._path_to_video}") # 根据帧的shape判断通道数 if len(frame.shape) == 2: # 灰度图的shape是(高度, 宽度),没有第三维度,通道数为1 self._n_channels = 1 else: # 彩色图的shape是(高度, 宽度, 通道数),取最后一位 self._n_channels = frame.shape[2] # 读完第一帧后,把视频指针重置回开头,避免后续处理跳帧 self._cap.set(cv2.CAP_PROP_POS_FRAMES, 0) # 其余属性正常获取 self._width = self._cap.get(cv2.CAP_PROP_FRAME_WIDTH) self._height = self._cap.get(cv2.CAP_PROP_FRAME_HEIGHT) self._frame_rate = self._cap.get(cv2.CAP_PROP_FPS) self._frame_count = self._cap.get(cv2.CAP_PROP_FRAME_COUNT)
为什么这个方法靠谱?
视频本质上是连续的图像序列,每一帧图像的通道数就是视频的通道数。灰度帧是二维数组((H, W)),彩色帧是三维数组((H, W, C)),通过shape的维度数就能直接判断通道数,完全不会受视频格式的影响。
另外,读取第一帧后一定要用CAP_PROP_POS_FRAMES把视频指针重置到0,不然后续的帧读取会从第二帧开始,导致处理逻辑出错。
内容的提问来源于stack exchange,提问作者Gulzar
相关产品推荐
相关产品推荐

