当前位置: 首页 > news >正文

【树莓派4B/CM4】Ubuntu 18.04下CSI摄像头的驱动安装与配置全攻略

1. 环境准备与硬件连接

在开始配置CSI摄像头之前,我们需要确保硬件和软件环境都准备妥当。树莓派4B和CM4虽然性能强劲,但在Ubuntu 18.04系统下使用CSI摄像头需要特别注意几个关键点。

首先说说硬件连接。CSI摄像头排线的金手指面必须朝向HDMI接口方向插入,这个细节很多人容易忽略。我遇到过不止一个案例,因为排线插反而导致摄像头无法识别。正确的操作步骤是:先断开树莓派电源,轻轻抬起CSI接口的黑色卡扣,将排线金属触点朝外插入到底,然后按下卡扣固定。这里有个小技巧——可以用手机闪光灯照射排线,能清晰看到金属触点的那面就是需要朝外的方向。

软件环境方面,Ubuntu 18.04默认不包含树莓派专用驱动,我们需要先更新系统:

sudo apt update && sudo apt upgrade -y

这个步骤可能会花费10-30分钟不等,取决于网络速度。建议在执行前先更换国内软件源,可以大幅提升下载速度。我在实际测试中发现,使用清华源或中科大源能将安装时间缩短60%以上。

2. 驱动安装与配置

驱动安装是整个过程中最关键的一环。由于我们使用的是非树莓派官方系统,需要手动安装raspi-config工具来启用摄像头接口。这里有个坑要注意:直接apt安装的raspi-config可能版本过旧,我推荐使用以下命令获取最新版:

wget http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/pool/main/r/raspi-config/raspi-config_20201108_all.deb sudo apt install lua5.1 libfftw3-single3 libsamplerate0 alsa-utils sudo dpkg -i raspi-config_20201108_all.deb

安装完成后,需要将当前用户加入video用户组,否则会没有权限访问摄像头设备:

sudo usermod -aG video $(whoami)

这个命令执行后需要重新登录才能生效,很多人卡在这一步就是因为忘了重新登录。我建议直接重启树莓派最稳妥。

接下来运行raspi-config配置摄像头:

sudo raspi-config

在界面中选择"Interface Options" -> "Camera",启用后退出。这里有个隐藏技巧:按Tab键可以在界面底部按钮间快速切换,比用方向键效率高得多。

3. 设备检测与验证

安装完驱动后,我们需要确认系统是否正确识别了摄像头。先安装视频工具包:

sudo apt install v4l-utils

然后用以下命令列出视频设备:

v4l2-ctl --list-devices

正常应该能看到类似"bcm2835-codec-decode"的设备信息。如果没显示,可能是以下原因:

  1. 摄像头排线接触不良(尝试重新插拔)
  2. 没有加载内核模块(执行sudo modprobe bcm2835-v4l2)
  3. 电源供电不足(换用5V/3A电源适配器)

对于CM4用户,还需要额外步骤:

cd /tmp git clone https://github.com/raspberrypi/userland.git cd userland ./buildme --aarch64

编译完成后,设置库路径:

echo "/opt/vc/lib" >> /etc/ld.so.conf ldconfig

这时可以运行/opt/vc/bin/vcgencmd get_camera来检测摄像头状态,应该会返回"supported=1 detected=1"。

4. 摄像头工具使用实战

Ubuntu 18.04下主要有三种方式使用CSI摄像头:

方案一:fswebcam最简单的静态图像捕获工具,安装命令:

sudo apt install fswebcam

拍摄测试照片:

fswebcam --no-banner -r 1280x720 test.jpg

参数说明:

  • --no-banner 去除水印
  • -r 设置分辨率
  • -S 跳过帧数(建议设为10让摄像头预热)

方案二:motion功能强大的视频监控软件,支持网络串流:

sudo apt install motion sudo nano /etc/motion/motion.conf

关键配置项:

stream_port 8085 stream_quality 50 framerate 15 width 800 height 600

启动服务:

sudo service motion start

浏览器访问http://树莓派IP:8085即可查看实时画面。

方案三:libcamera新一代开源相机栈,支持更丰富的功能:

sudo apt install libcamera-apps libcamera-hello --list-cameras libcamera-jpeg -o test.jpg --width 1920 --height 1080

如果遇到权限问题,可以创建udev规则:

sudo nano /etc/udev/rules.d/99-camera.rules

添加内容:

SUBSYSTEM=="vchiq", GROUP="video", MODE="0660"

然后重新加载规则:

sudo udevadm control --reload

5. ROS集成与深度应用

对于机器人开发者,将CSI摄像头接入ROS系统非常实用。在Ubuntu 18.04 + ROS Melodic环境下:

首先安装usb_cam功能包:

sudo apt install ros-melodic-usb-cam

创建启动文件:

nano ~/camera.launch

内容如下:

<launch> <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen"> <param name="video_device" value="/dev/video0"/> <param name="image_width" value="1280"/> <param name="image_height" value="720"/> <param name="pixel_format" value="yuyv"/> <param name="camera_frame_id" value="usb_cam"/> <param name="io_method" value="mmap"/> </node> </launch>

启动节点:

roslaunch usb_cam camera.launch

查看图像话题:

rostopic list rviz

在rviz中添加Image显示,选择/usb_cam/image_raw话题即可。

常见问题处理:

  1. 如果提示"Failed to open video device",检查/dev/video0权限
  2. 图像卡顿可以降低分辨率或帧率
  3. 色彩异常尝试修改pixel_format为mjpeg

6. 进阶配置与性能优化

要让CSI摄像头发挥最佳性能,还需要进行一些优化设置:

内存分配调整编辑/boot/config.txt:

sudo nano /boot/config.txt

添加:

gpu_mem=128 start_x=1

这个配置将为GPU分配128MB内存,足够支持1080p视频编码。

超频设置(仅限散热良好的设备)

over_voltage=2 arm_freq=1800 gpu_freq=600

超频后摄像头帧率能提升20%左右,但要注意温度监控:

vcgencmd measure_temp

自动启动服务创建systemd服务:

sudo nano /etc/systemd/system/camera.service

示例内容:

[Unit] Description=Camera Stream Service After=network.target [Service] ExecStart=/usr/bin/motion -n Restart=always User=pi [Install] WantedBy=multi-user.target

启用服务:

sudo systemctl enable camera.service sudo systemctl start camera.service

画质调优使用v4l2-ctl调整参数:

v4l2-ctl -d /dev/video0 --set-ctrl=exposure_auto=1 v4l2-ctl -d /dev/video0 --set-ctrl=white_balance_auto_preset=3 v4l2-ctl -d /dev/video0 --set-ctrl=sharpness=100

这些参数需要根据实际环境反复调试,建议先用v4l2-ctl --list-ctrls查看所有可用选项。

7. 疑难问题解决方案

在实际使用中可能会遇到各种奇怪的问题,这里总结几个典型案例:

案例一:摄像头频繁断开现象:摄像头工作时随机断开,dmesg显示"camera subsystem power on failed" 解决方案:

  1. 更换高质量电源(至少5V/3A)
  2. 在/boot/config.txt添加:
    avoid_warnings=2 disable_camera_led=1

案例二:图像出现条纹干扰现象:拍摄的照片有规律性条纹 解决方法:

  1. 添加电源滤波电容
  2. 设置正确的曝光模式:
    v4l2-ctl --set-ctrl=exposure_dynamic_framerate=1

案例三:ROS节点崩溃现象:usb_cam节点运行一段时间后段错误 解决方法:

  1. 降低分辨率:
    <param name="image_width" value="640"/> <param name="image_height" value="480"/>
  2. 更换视频采集方式:
    <param name="io_method" value="read"/>

案例四:视频延迟严重优化方案:

  1. 使用硬件编码:
    raspivid -t 0 -w 1280 -h 720 -fps 30 -b 4000000 -g 30 -o - | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8080}' :demux=h264
  2. 调整motion配置:
    stream_maxrate 30 stream_quality 80

8. 扩展应用场景

除了基础监控,CSI摄像头还能实现许多有趣的功能:

车牌识别系统使用OpenCV实现:

import cv2 import numpy as np cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 添加车牌识别算法 cv2.imshow('LPR', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release()

智能门禁系统结合人脸识别:

pip3 install face_recognition

示例代码:

import face_recognition known_image = face_recognition.load_image_file("known.jpg") known_encoding = face_recognition.face_encodings(known_image)[0] video_capture = cv2.VideoCapture(0) while True: ret, frame = video_capture.read() face_locations = face_recognition.face_locations(frame) face_encodings = face_recognition.face_encodings(frame, face_locations) # 比对逻辑...

工业检测应用使用Python+OpenCV实现简单缺陷检测:

def detect_defects(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (5,5), 0) _, thresh = cv2.threshold(blur, 120, 255, cv2.THRESH_BINARY_INV) contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: area = cv2.contourArea(cnt) if area > 500: cv2.drawContours(image, [cnt], -1, (0,255,0), 3) return image

农业监测系统结合TensorFlow Lite实现作物生长分析:

pip3 install tflite-runtime

加载模型进行推理:

import tflite_runtime.interpreter as tflite interpreter = tflite.Interpreter(model_path="model.tflite") interpreter.allocate_tensors() input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() # 对摄像头帧进行处理... interpreter.set_tensor(input_details[0]['index'], input_data) interpreter.invoke() output_data = interpreter.get_tensor(output_details[0]['index'])
http://www.cnnetsun.cn/news/1318347.html

相关文章:

  • Android网络优先级之争:以太网如何通过NetworkFactory评分机制抢占连接(附调试技巧)
  • 新手友好:在快马平台用AI生成第一个链接检查程序
  • 嵌入式电子阅读器低功耗设计与墨水屏驱动优化
  • KUKA KR210负载设置实战:如何避免A5轴超载的设计优化方案
  • FaceRecon-3D环境部署教程:Ubuntu/CUDA11.8下PyTorch3D零报错安装
  • 卡证检测矫正模型OCR协同方案:为PaddleOCR/Tesseract提供标准输入图
  • C#实战:5分钟搞定AI模型API的SSE流式输出(附完整代码)
  • Chatbot与Jira Service Desk集成实战:从零搭建自动化工单处理系统
  • 3D打印爱好者必看:如何用TMC2209驱动模块实现步进电机超静音运行(附StealthChop配置)
  • 还以为技术路线图多难呢,半小时就搞定了
  • Qt5 Creator中解决QWT库LNK2001错误的完整指南(含QWT_DLL预处理技巧)
  • PaddleOCR在无AVX支持的Linux系统上的性能优化与替代方案
  • Wasserstein距离在域适应中的实战应用:从理论到代码实现
  • 无人机避障技术解析:栅格地图与ESDF地图的实战应用
  • 中央空调系统:现代建筑舒适与节能的核心技术解析
  • Qwen2.5-VL-7B-Instruct效果展示:红外热成像图→设备故障点定位+报告生成
  • SkyWalking 9.1.0保姆级安装教程:从零搭建APM监控系统(Windows版)
  • 农产品溯源系统毕设入门:从零搭建一个可落地的区块链+数据库架构
  • GORM FindInBatches实战:如何高效处理百万级数据的分批查询与内存优化
  • 电机扭矩控制入门:如何用Arduino实现精准力矩调节(附代码)
  • Floyd算法实战:用Python手把手教你计算校园快递点最短路径
  • 深入探索Linux内存管理:初学者指南
  • 【Linux系统】线程同步
  • Agent的核心技能:工具调用——让AI从“纸上谈兵”到“动手实践”
  • 长沙心理医院指南:真实案例分享与暖心选择
  • 女生风格电商系统 计算机毕设
  • 计算机毕业设计springboot基于Vue的北方消逝民族网站的设计与实现 基于SpringBoot与Vue.js的北方濒危民族文化数字化传承平台 采用前后端分离架构的北方少数民族历史文化在线展示系统
  • 【花雕动手做】进口台湾全金属新款齿轮 直流精密减速电机马达DC12V 70转
  • 【笔试真题】- OPPO-2026.03.14
  • 探索格子玻尔兹曼(LBM)下多孔介质水气分布规律(D3q19模型)