我正在尝试使用 OpenCV 从网络摄像头中抓取帧。我也试过“奶酪”。两者都给了我一个非常奇怪的画面:扭曲的、错误的颜色。使用 mplayer 我能够找出正确的编解码器“yuy2”。甚至 mplayer 有时也会选择错误的编解码器(“yuv”),这使得它看起来就像使用 OpenCV / cheese 捕获图像一样。
我可以以某种方式告诉 OpenCV 使用哪个编解码器吗?
谢谢!
在最新版本的opencv中,您可以使用与视频相同的fourcc样式代码设置相机的捕获格式。见http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture
它可能仍然需要一些试错,像 YUV、YUYV、YUY2 这样的术语在相机制造商、驱动程序制造商、操作系统、directshow 层和 opencv 中使用得有点松散!
OpenCV 自动选择第一个可用的捕获后端(参见此处)。可能是它没有自动使用 V4L2。
如果从源代码构建,-D WITH_V4L=ON
也设置两者。-D WITH_LIBV4L=ON
为了设置要使用的像素格式,请设置CAP_PROP_FOURCC
捕获的属性:
capture = cv2.VideoCapture(self.cam_id, cv2.CAP_V4L2)
scapture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
width = 1920
height = 1080
capture.set(cv2.CAP_PROP_FRAME_WIDTH, width)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height)