目录
[一、什么是 CSI 摄像机接口(先理解原理)](#一、什么是 CSI 摄像机接口(先理解原理))
[二、常见 CSI 摄像头模块(以 Raspberry Pi 为例)](#二、常见 CSI 摄像头模块(以 Raspberry Pi 为例))
[1️⃣ 识别 CSI 接口](#1️⃣ 识别 CSI 接口)
[2️⃣ 排线方向(90% 新手问题)](#2️⃣ 排线方向(90% 新手问题))
[3️⃣ 多 CSI 接口的板子](#3️⃣ 多 CSI 接口的板子)
[四、系统与驱动配置(Raspberry Pi OS 新旧差异)](#四、系统与驱动配置(Raspberry Pi OS 新旧差异))
[✅ 新系统(Bullseye / Bookworm)](#✅ 新系统(Bullseye / Bookworm))
[⚠️ 老系统(Buster 及之前)](#⚠️ 老系统(Buster 及之前))
[示例 1:实时预览](#示例 1:实时预览)
[六、Python 使用 CSI 摄像头(机器视觉必备)](#六、Python 使用 CSI 摄像头(机器视觉必备))
[方式 A:Picamera2(官方推荐)](#方式 A:Picamera2(官方推荐))
[方式 B:OpenCV(VideoCapture)](#方式 B:OpenCV(VideoCapture))
[八、CSI vs USB 摄像头(什么时候选 CSI?)](#八、CSI vs USB 摄像头(什么时候选 CSI?))
[九、Jetson 平台简述(迁移提示)](#九、Jetson 平台简述(迁移提示))
[十、常见问题 & 排错清单](#十、常见问题 & 排错清单)
[❌ 摄像头无法识别](#❌ 摄像头无法识别)
[❌ 画面卡顿](#❌ 画面卡顿)
[❌ OpenCV 打不开](#❌ OpenCV 打不开)
下面是一份 从原理 → 硬件 → 软件 → 实战 → 排错 的完整指南,专门讲 基于 CSI(Camera Serial Interface)接口的摄像机模块 。内容以 Raspberry Pi + CSI 摄像头 为主(这是最常见、资料最完整的场景),但我也会在关键地方说明如何迁移到 Jetson / 其他 SoC。
一、什么是 CSI 摄像机接口(先理解原理)
CSI(Camera Serial Interface) 是由 MIPI 制定的高速串行接口,专门用于摄像头数据传输。
核心特点
-
高速:远高于 USB(可达数 Gbps)
-
低延迟:直接连到 SoC ISP(图像信号处理器)
-
低功耗:适合嵌入式 / 移动设备
-
专用通道:不像 USB 需要协议开销
常见规格
-
MIPI CSI-2(最常见)
-
通道数:1-lane / 2-lane / 4-lane
-
典型模块:OV5647、IMX219、IMX477
二、常见 CSI 摄像头模块(以 Raspberry Pi 为例)
| 模块 | 分辨率 | 特点 | 适合场景 |
|---|---|---|---|
| OV5647 | 5MP | 老款、稳定 | 学习/低成本 |
| IMX219 | 8MP | Pi Camera v2 | 通用项目 |
| IMX477 | 12.3MP | HQ Camera | 机器视觉 |
| 夜视版 | 同上 | 红外 | 安防/低光 |
三、硬件连接(非常重要)
1️⃣ 识别 CSI 接口
-
Raspberry Pi 主板上标注 CAMERA
-
窄排线接口(和屏幕 DSI 类似)
2️⃣ 排线方向(90% 新手问题)
-
蓝色面朝 USB 口(Pi)
-
金属触点朝向 HDMI / PCB
-
插入后压紧黑色卡扣
⚠️ 排线反插 = 摄像头无法识别(但一般不会烧坏)
3️⃣ 多 CSI 接口的板子
-
Compute Module / 高端板支持多摄像头
-
普通 Pi 一般只有 1 个 CSI 摄像头接口
四、系统与驱动配置(Raspberry Pi OS 新旧差异)
✅ 新系统(Bullseye / Bookworm)
现在默认使用 libcamera (取代旧的 raspistill)
启用摄像头
bash
sudo raspi-config
选择:
bash
Interface Options → Camera → Enable
重启。
检查是否识别
bash
libcamera-hello
如果看到预览窗口,说明成功。
⚠️ 老系统(Buster 及之前)
使用旧接口:
bash
sudo raspi-config
→ Interfacing Options → Camera → Enable
测试:
bash
raspistill -o test.jpg
五、基础使用示例(libcamera)
示例 1:实时预览
bash
libcamera-hello
示例 2:拍照
bash
libcamera-still -o image.jpg
示例 3:录像
bash
libcamera-vid -o video.h264 -t 10000
示例 4:调整分辨率 / 帧率
bash
libcamera-vid -o out.h264 --width 1280 --height 720 --framerate 60
六、Python 使用 CSI 摄像头(机器视觉必备)
方式 A:Picamera2(官方推荐)
bash
pip install picamera2
python
from picamera2 import Picamera2
import cv2
picam2 = Picamera2()
picam2.start()
while True:
frame = picam2.capture_array()
cv2.imshow("CSI Camera", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
方式 B:OpenCV(VideoCapture)
python
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("CSI Camera", frame)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
⚠️ 在新系统中,推荐使用 Picamera2;OpenCV 方式依赖 V4L2 兼容层。
七、进阶参数调优(机器视觉关键)
常用参数
bash
libcamera-still \
--brightness 0.1 \
--contrast 1.2 \
--sharpness 1.5 \
--awb auto \
--exposure normal \
-o tuned.jpg
固定曝光(防止画面跳变)
bash
libcamera-vid --shutter 10000 --gain 1.5 -o out.h264
红外摄像头(关闭自动白平衡)
bash
--awb off
八、CSI vs USB 摄像头(什么时候选 CSI?)
| 项目 | CSI | USB |
|---|---|---|
| 延迟 | 极低 | 较高 |
| 带宽 | 专用 | 共享 |
| ISP | 硬件支持 | 依赖驱动 |
| 适合 | 机器视觉 | 即插即用 |
👉 需要高帧率、低延迟、稳定视觉时一定选 CSI
九、Jetson 平台简述(迁移提示)
在 NVIDIA Jetson 上:
-
CSI 通过 device tree 绑定
-
使用
nvarguscamerasrc -
OpenCV / GStreamer 集成更强
-
支持多摄像头 + GPU 推理
示例:
bash
gst-launch-1.0 nvarguscamerasrc ! nvoverlaysink
十、常见问题 & 排错清单
❌ 摄像头无法识别
-
排线反了 / 未压紧
-
未启用 camera interface
-
型号不兼容(非 Pi 原厂)
❌ 画面卡顿
-
分辨率过高
-
帧率设置不合理
-
CPU 被推理占满(需降低分辨率)
❌ OpenCV 打不开
-
使用 Picamera2
-
检查
/dev/video*
十一、实战项目示例
-
人脸检测(OpenCV + CSI)
-
物体检测(YOLO + CSI + TensorFlow Lite)
-
机器人巡线(CSI + OpenCV)
-
工业缺陷检测(CSI + 高分辨率)
-
安防摄像头(CSI + RTSP 推流)