泰山派摄像头使用-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 |

相关推荐
小小测试开发几秒前
RAG应用评测:从指标体系到LLM-as-a-Judge的自动化落地
android·运维·人工智能·自动化
神经星星2 分钟前
「TVM教程」理解 Relax 抽象层
人工智能·深度学习
阿拉斯攀登6 分钟前
垂钓助手-四种漂相识别:下顿顶漂黑漂点漂的状态机设计
人工智能
ECT-OS-JiuHuaShan7 分钟前
共轭互逆链路论,彻底打击庸俗辩证法和不可知论
数据库·人工智能·算法·机器学习·数学建模
m4Rk_9 分钟前
【论文阅读】Agent 记忆机制(52):Cognitive Scaffold——面向 DeepResearch Agent 的结晶化记忆框架
论文阅读·人工智能·学习·开源·github
虎王物联10 分钟前
Docker WASM 边缘计算:12ms 冷启动如何重塑 IoT 网关部署
物联网·docker·容器·边缘计算·wasm
薛定e的猫咪10 分钟前
【大模型量化】使用 llama.cpp 完成量化、本地推理与服务化部署
人工智能·深度学习·算法·llama
2601_9567436812 分钟前
上海物联网应用开发技术选型指南:从HTTP/MQTT/Modbus协议适配、平台化架构设计到源代码交付与私有化部署,解析工程落地的关键考量点
物联网·网络协议·http·开发经验·上海
xiaohaiAIgeo14 分钟前
【2026年】实验室气路泄漏监测与自动切断
人工智能·科普知识
薛定e的猫咪15 分钟前
【源码解读版】ContraBAR:用 CPC 对比学习替代变分推断做贝叶斯元 RL
人工智能·深度学习·学习·算法·机器学习