—— 從驅動配置、Yocto 構建,到 OpenCV 實戰
在樹莓派上運行攝像頭,在官方的 Raspberry Pi OS 可能很簡單,但在 Yocto 項目中,需要手動配置驅動、設備樹、軟件依賴 才能確保攝像頭正常工作。本篇文章從 BSP 驅動配置、Yocto 關鍵配置、OpenCV 實戰 講解如何 讓樹莓派攝像頭在 Yocto 鏡像中正常運行,并最終在 屏幕上實時顯示畫面。
1?? Yocto 關鍵知識點
在 Yocto 項目中,攝像頭的支持依賴:
📌 關鍵點
-
BSP(Board Support Package)配置
- 設備樹(Device Tree)確保攝像頭硬件被正確注冊
config.txt
配置 GPU、攝像頭固件
-
內核(Kernel)驅動
bcm2835-v4l2
模塊:用于支持 V4L2 攝像頭設備libcamera
:現代化的攝像頭用戶空間 APIv4l-utils
:V4L2 設備管理工具
-
鏡像構建(Yocto Bitbake)
IMAGE_INSTALL
確保安裝libcamera
、ffmpeg
、opencv
IMAGE_FEATURES
使系統支持 GUI 顯示systemd
啟動腳本 讓攝像頭 開機自動運行
-
用戶空間(User Space)
ffmpeg
錄制視頻v4l2-ctl
進行攝像頭測試OpenCV
進行實時圖像處理
2?? 驅動配置:設備樹 & 內核
📌 2.1 設備樹(Device Tree)配置
樹莓派的攝像頭使用 MIPI CSI-2 接口,在設備樹中需要正確注冊。
修改 Yocto BSP config.txt
,確保系統啟用攝像頭:
# 讓系統自動檢測攝像頭
camera_auto_detect=1
# 啟用 VC4-KMS 顯示驅動,支持 `libcamera`
dtoverlay=vc4-kms-v3d
# 啟用攝像頭固件支持
start_x=1
# GPU 預留 128MB 內存(攝像頭和 GUI 需要)
gpu_mem=128
🔹 關鍵點
camera_auto_detect=1
讓樹莓派 自動檢測攝像頭dtoverlay=vc4-kms-v3d
讓libcamera
和ffmpeg
可以正確訪問攝像頭start_x=1
讓 GPU 能夠處理 ISP(圖像信號處理)
📌 2.2 加載攝像頭驅動
在 Yocto 里,攝像頭驅動需要手動加載:
modprobe bcm2835_v4l2
確保 bcm2835_v4l2
被自動加載:
echo "bcm2835_v4l2" >> /etc/modules
🔹 驅動解釋
bcm2835-v4l2
是 樹莓派的 V4L2(Video4Linux)驅動- 讓
/dev/video0
設備正確生成 libcamera
需要vc4-kms-v3d
和bcm2835-v4l2
才能正常工作
3?? Yocto 鏡像配置
為了讓 Yocto 鏡像包含攝像頭所需的軟件,修改 rpi-test-image.bb
:
# 繼承 rpi-test-image
include recipes-core/images/rpi-test-image.bb# 添加 SSH 服務器,方便遠程調試
IMAGE_INSTALL:append = " openssh openssh-sftp-server"# 啟用 X11 圖形界面支持
IMAGE_FEATURES += "x11-base x11-sato splash"# 安裝攝像頭相關軟件
IMAGE_INSTALL += " libcamera libcamera-apps v4l-utils"# 安裝 ffmpeg 和 OpenCV
IMAGE_INSTALL += " ffmpeg opencv opencv-apps python3-opencv"
🔹 關鍵點
libcamera
用于攝像頭 APIv4l-utils
讓v4l2-ctl
可以測試攝像頭opencv
用于 Python 處理攝像頭畫面ffmpeg
讓攝像頭 支持錄制視頻
4?? 編譯 Yocto 鏡像
完成配置后,運行:
bitbake core-image-sato
然后刷寫到 SD 卡:
dd if=tmp/deploy/images/raspberrypi4-64/core-image-sato-raspberrypi4-64.wic of=/dev/sdX bs=4M status=progress
5?? 攝像頭驅動調試
📌 5.1 確保 /dev/video0
存在
ls /dev/video*
如果 /dev/video0
不存在,手動加載驅動:
modprobe bcm2835_v4l2
📌 5.2 使用 v4l2-ctl
測試攝像頭
v4l2-ctl --list-devices
如果攝像頭已檢測到,運行:
v4l2-ctl --stream-mmap --stream-count=100 -d /dev/video0
6?? 實戰:運行 OpenCV 進行攝像頭實時顯示
運行以下 Python 代碼:
import cv2cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:breakcv2.imshow("攝像頭", frame)if cv2.waitKey(1) & 0xFF == ord('q'): # 按 'q' 退出breakcap.release()
cv2.destroyAllWindows()
🎥 成功運行后,攝像頭畫面會在屏幕上實時顯示!
7?? 其他攝像頭應用
📸 7.1 使用 ffmpeg
拍照
ffmpeg -f v4l2 -video_size 1280x720 -i /dev/video0 -vframes 1 snapshot.jpg
🎥 7.2 錄制視頻
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 -t 10 output.mp4
📡 7.3 實時推流
ffmpeg -f v4l2 -i /dev/video0 -f mpegts udp://192.168.1.100:1234
在 VLC 中打開:
udp://@192.168.1.100:1234
8?? 結果展示
最終,攝像頭成功運行,并在屏幕上實時顯示:
🎯 結論
本篇文章完整講解了 如何在 Yocto 項目中配置樹莓派攝像頭:
- BSP 設備樹配置
- 內核驅動
bcm2835-v4l2
加載 - Yocto 鏡像構建
v4l2-ctl
&ffmpeg
測試- OpenCV 實戰
- 流媒體推送
? 關鍵命令總結
任務 | 命令 |
---|---|
檢查 /dev/video0 | ls /dev/video* |
測試 v4l2-ctl | v4l2-ctl --list-devices |
拍照 | ffmpeg -f v4l2 -i /dev/video0 -vframes 1 snapshot.jpg |
錄制視頻 | ffmpeg -f v4l2 -i /dev/video0 -t 10 output.mp4 |
實時顯示(OpenCV) | python3 script.py |
🎯 如果你對 Yocto BSP、攝像頭調試有任何問題,歡迎交流!🚀