解决树莓派4B x64系统下OpenCV无法运用C++调用CSI摄像头的问题

 一、前言

  在 Raspberry Pi OS 2021-10-30 的版本更新中。之前的摄像头命令 raspistill 被移除,替代方案是 libcamera。在这次更新后,无法正常运用C++进行CSI摄像头的调用,但、如果在OpenCV中调用CSI摄像头会出现无数据的现象(cv2.VideoCapture(0)这时不会报错),需要对系统文件进行配置后方可调用摄像头。

  在新版本中,打开如下界面已经没有Camera选项,新版本变为自动识别摄像头。网上许多教程还是停留在旧版本,对初学者造成许多不便。同时这样的配置也会对我们调用摄像头造成困难。

  二、问题匹配

  执行以下命令,检测是否可以识别摄像头:

vcgencmd get_camera

   结果如下:

  如果返回结果为:  supported=0 detected=0,说明此时摄像头硬件没有被识别出来,而且设备是不支持摄像头配件的,下面是解决方法。

  三、识别摄像头配置

  1.修改config.txt文件

  输入

sudo nano /boot/firmware/config.txt

  在文件最后加上如下命令:加在最后【all】

gpu_mem=128
start_x=1

  注释掉原来的摄像头自动检测语句(第17行)

#camera_auto_detect=1

  Ctrl+o 写入  Ctrl+x 退出

2.修改/etc/modules

输入

sudo nano /etc/modules

在最后面添加如下命令

bcm2835-v4l2

Ctrl+o 写入  Ctrl+x 退出

保存后,重启系统!!!

3.验证

重复 二部分 内容,得到 supported=1 detected=1,则说明摄像头可以工作了

4.带来的问题

  修改后输入:

libcamera-hello

命令出现“no cameras available”报错

经网上查找资料发现,这样配置后系统使用的是旧的驱动,想要解决这个问题又要将更改的文件修改,只能说鱼与熊掌不可兼得。

### 解决方案概述 对于 Raspberry Pi 4B 上通过 CSI 摄像头接口使用 OpenCV 进行图像捕获和处理的问题,存在多种方法来实现这一目标。主要依赖于软件配置以及特定库的支持。 #### 方法一:基于 libcamera解决方案 为了使树莓派原装CSI摄像头IMX219能够被OpenCV正常读取,在较新的操作系统版本中推荐采用libcamera作为底层支持工具[^1]。这涉及到更新系统的包管理器并安装必要的组件: ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt install python3-opencv libatlas-base-dev libhdf5-dev libjasper-dev libqtgui4 libqt4-test ``` 接着确保已启用Camera模块,并重启设备让更改生效。之后可以通过Python脚本利用`cv2.VideoCapture()`函数指定视频源参数为`'libcamerasrc ! video/x-raw,format=BGR,width=640,height=480,framerate=30/1 ! appsink'`(GStreamer管道字符串),从而完成对CSI相机的数据流访问。 #### 方法二:UV4L 驱动方式 另一种常见做法是在Raspberry Pi 4B (32位系统)上安装uv4l驱动程序以解决OpenCV无法获取CSI摄像头图像的情况[^2]。此过程同样需要先确认硬件连接无误且基本功能可用(比如能执行命令行拍照)。具体操作如下所示: 1. 安装最新版的uv4l及相关插件; 2. 修改配置文件使得服务开机自启; 3. 编写简单的测试代码验证效果。 下面给出一段用于捕捉静态画面的例子: ```python import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret or cv2.waitKey(1)&0xFF==ord('q'): break # 显示实时预览窗口 cv2.imshow('frame', frame) key=cv2.waitKey(1) if key & 0xFF == ord('c'): # 当按'C'键时保存当前帧至/home/pi/Pictures/ img_name="/home/pi/Pictures/your_image_{:04d}.jpg".format(int(time.time())) cv2.imwrite(img_name,frame) print(f"Image saved as {img_name}") cap.release() cv2.destroyAllWindows() ``` 上述代码片段展示了如何创建一个循环不断抓拍新帧直至用户主动终止程序运行或者按下'C'按键触发截图动作[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值