Ubuntu系统使用v4l-utils工具来查看所连接摄像头参数

opencv系列



前言

问题:通过opencv录制下来的视频,打开的时候显示“无法解码多工流传输的视频”。
笔记本自带的摄像头,录制方法就是用opencv的VideoWrite。
问题原因发现及解决:网上看了很多录制下来打不开的原因,无非就是保存的帧率、视频尺寸和相机不匹配,去跟淘宝问了个软件,就是很简单的显示相机参数的软件,然后发现尺寸和我想的不一样(实际上我用opencv去设置了相机参数,但成功的话应该没有这个问题的了,这个问题…以后有时间研究一下),就是把尺寸调好以后就正常了。

一、测试代码

录制视频

# 录制测试视频
# coding:utf-8
import cv2
import numpy as np
# 选择摄像头
cap = cv2.VideoCapture(0)
# 设置编码器
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 25, (640,480))

while True:
    ret,frame = cap.read()
    if ret == True:
        frame =  cv2.flip(frame, 1)
        out.write(frame)
        cv2.imshow("frame", frame)
        key = cv2.waitKey(1)
        if key == 27:
            break
    else:
        break
cap.release()
out.release()
cv2.destroyAllWindows()

播放视频

# 播放视频
# coding:utf-8
import cv2
import numpy as np
cap = cv2.VideoCapture("output.avi")
while True:
    ret, frame = cap.read()
    if ret is False:
        print("......")
        break
    cv2.imshow("frame", frame)
    key = cv2.waitKey(30)
    if key == 27:
        break
cv2.destroyAllWindows()

二、查看摄像头参数

在Ubuntu系统下如何使用v4l-utils工具来查看所连接摄像头(包含USB摄像头及树莓派摄像头)信息。

1. 安装v4l-utils

sudo apt-get install v4l-utils

2. 查找连接的摄像头列表

(base) zz@xl:~/work/code$ ls /dev/video*
/dev/video0  /dev/video1  /dev/video2  /dev/video3

(base) zz@xl:~/work/code$ v4l2-ctl --list-devices
Integrated Camera: Integrated C (usb-0000:00:14.0-7):
	/dev/video0
	/dev/video1
	/dev/video2
	/dev/video3

3. 查看各相机支持的分辨率、帧率、像素格式等参数

(base) zz@xl:~/work/code$ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture

	[0]: 'MJPG' (Motion-JPEG, compressed)
		Size: Discrete 1280x720
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 320x180
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 352x288
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 424x240
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 848x480
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 960x540
			Interval: Discrete 0.033s (30.000 fps)
	[1]: 'YUYV' (YUYV 4:2:2)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 320x180
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 320x240
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 352x288
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 424x240
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
		Size: Discrete 848x480
			Interval: Discrete 0.050s (20.000 fps)
		Size: Discrete 960x540
			Interval: Discrete 0.067s (15.000 fps)
		Size: Discrete 1280x720
			Interval: Discrete 0.100s (10.000 fps)

4. 注意事项

(1)如上所示的/dev/video1 USB摄像头支持 MJPG 和 YUYV 两种像素格式,每种格式支持多种分辨率及帧率。如果需要实时抓取1080p的图像,则需要采用MJPG格式,默认的YUYV格式不能满足实时抓取需求。
(2)另外,调用摄像头时传入的摄像头设备、图像帧宽、帧高、帧率,应与v4l2-ctl 打印的参数一致。

5. OpenCV(C++)调用摄像头代码

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
cv::VideoCapture capture;capture.open("/dev/video1", cv::CAP_V4L2);
capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M','J','P','G'));
capture.set(cv::CAP_PROP_FRAME_WIDTH, 1920);
capture.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);
capture.set(cv::CAP_PROP_FPS, 30);
cv::Mat frame;
while (1) {
	capture >> frame;
	if (!frame.empty())
	{
		cv::imshow("frame", frame);
	}
	if (cv::waitKey(1) == 27)
		break;
	}
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值