泰山派摄像头使用-opencv流程

1. 泰山派添加camera

连接摄像头连接到usb接口,查看dev设备:

在终端中输入如下命令,可以查看到camera设备资源:

ls /dev/video*

检查板卡上的camera设备资源示例

也可以使用v4l2命令查看

v4l2-ctl --list-devices

v4l2-ctl --list-devices是一个命令行工具命令,用于列出系统中可用的视频设备列表及其相关信息。它是V4L2(Video for Linux Two)的一部分,用于查看和管理视频设备。

V4L2(Video for Linux Two)是Linux内核中的一个框架,用于支持视频设备的捕捉、显示和编解码等功能。它是Video4Linux的第二个版本。

两个video:

一个是图像/视频采集,一个是metadata采集

2. 相关工具库安装

安装opencv

pip3 install opencv-python-headless==4.8.0.76

pip3 install opencv-python==4.8.0.76

pip3 install opencv-contrib-python==4.8.0.76

验证是否安装成功

cat@lubancat:~$ python3

Python 3.8.10 (default, Nov 14 2022, 12:59:47)

GCC 9.4.0 on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import cv2 as cv

>>> print(cv.version)

4.8.0

>>>

3. 摄像头拍照

python 复制代码
import cv2
import time

# 帧宽和高度
width = 640
height = 480

num = 1

# 创建一个VideoCapture对象,并打开系统默认的摄像头(也可以打开视频或者指定的设备)
cap = cv2.VideoCapture(9)

# 不能打开摄像头
if not cap.isOpened():
    raise RuntimeError('Could not open camera.')

# 设置帧宽和高度
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

while(cap.isOpened()):
    time.sleep(2)
    # 返回两个参数,ret表示是否正常打开,frame是图像数组,一帧
    ret,frame  = cap.read()

    # 窗口显示,名为Lubancat_Camera_test
    cv2.imshow("Lubancat_Camera_test", frame)

    # 延迟1ms,并根据键盘输入返回值val,是板卡接的键盘
    val = cv2.waitKey(1) & 0xFF

    print("=======================================")
    # 第一个参数是保存为的图片名,第二个参数为待保存图像,jpeg格式
    cv2.imwrite("photo" + str(num) + ".jpg", frame)
    print("width = ", width)
    print("height = ", height)
    print("success to save photo: "'photo' + str(num)+".jpg")
    print("=======================================")
    break

# 释放摄像头
cap.release()
# 关闭窗口
cv2.destroyAllWindows()

执行程序:

python3 camera_photo.py

可以通过下面方法获取摄像头的video编号

python 复制代码
import subprocess

def get_camera_device():
    '''获取可用的摄像头'''
    try:
        output = subprocess.check_output("v4l2-ctl --list-devices", shell=True).decode()
        print(output)
        index = output.index('HD video')
        end_str = output[index:]

        lines = end_str.split('\n')
        for line in lines:
            if "/dev/video" in line:  # 根据摄像头名称进行匹配
                index = line.index('/dev/video')
                device = line[index + len('/dev/video'):]
                return int(device)
    except subprocess.CalledProcessError as e:
        print("Error:", e)
        return -1

3.1. 录制视频

python 复制代码
import os
import cv2
import time

# 帧宽,高度,帧率
width = 640
height = 480
fps = 25.0

# 创建一个VideoCapture对象,并打开系统默认的摄像头
video = cv2.VideoCapture(9)

# 设置帧宽和高度
video.set(cv2.CAP_PROP_FRAME_WIDTH, width)
video.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

# 定义视频文件的写入格式,未压缩的YUV颜色编码类型(使用该格式保存的视频文件很大,需要注意下),有些格式可能不支持,编码器失败,需要安装相关库
# fourcc = cv2.VideoWriter_fourcc(*'MJPG')
fourcc = cv2.VideoWriter_fourcc('I','4','2','0')

# 用于实现多张图像保存成视频文件,第一个参数是需要保存的视频文件名称,第二个函数是编解码器的代码,
# 第三个参数为保存视频的帧率,第四个参数是保存的视频文件的尺寸,一定要与图像的尺寸相同
# out = cv2.VideoWriter('output.mp4',fourcc, fps, (width,height))
out = cv2.VideoWriter('output.avi',fourcc, fps, (width,height))
def main():
    count = 0
    while(video.isOpened()):
        ret, frame = video.read()
        if not ret:
            continue
        if count>100:
            return

        # 将捕捉到的图像存储,保存的视频是没有声音的
        out.write(frame)
        count+=1
        time.sleep(0.04)


    # 释放资源
    video.release()
    out.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

录制视频格式

|----------------------------------------|------------------------------------------|
| 参数 | 解释 |
| VideoWriter_fourcc('M','P','4','V') | MPEG-4编码 .mp4 可指定结果视频的大小 |
| VideoWriter_fourcc('X','2','6','4') | MPEG-4编码 .mp4 可指定结果视频的大小 |
| VideoWriter_fourcc('I', '4', '2', '0') | 该参数是YUV编码类型,文件名后缀为.avi 广泛兼容,``但会产生大文件 |
| VideoWriter_fourcc('P', 'I', 'M', 'I') | 该参数是MPEG-1编码类型,文件名后缀为.avi |
| VideoWriter_fourcc('X', 'V', 'I', 'D') | 该参数是MPEG-4编码类型,文件名后缀为.avi,``可指定结果视频的大小 |
| VideoWriter_fourcc('T', 'H', 'E', 'O') | 该参数是Ogg Vorbis,文件名后缀为.ogv |
| VideoWriter_fourcc('F', 'L', 'V', '1') | 该参数是Flash视频,文件名后缀为.flv |

相关推荐
JJJennie7771 小时前
当AI开始学会欺骗
网络·人工智能
糖果店的幽灵2 小时前
大模型测评DeepEval快速入门-安全与通用指标详解
人工智能·安全·langgraph·大模型测评·deepeval
江畔柳前堤7 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术8 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客8 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术8 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO9 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术9 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架10 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab10 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能