OV5647与树莓派bullseye 64bit的兼容性问题

OV5647与树莓派bullseye 64bit的兼容性问题

  • 1. 源由
  • 2. 问题
  • 3. 分析
    • 方法一:使用 pyudev 库
    • 方法二:使用 v4l2-ctl 工具
    • 方法三:直接读取 /dev 目录
    • 方法四:使用 OpenCV
    • 方法五:使用 Picamera
    • 方法六:使用 libcamera
  • 4. 实测
    • 方法一:使用 pyudev 库
    • 方法二:使用 v4l2-ctl 工具
    • 方法三:直接读取 /dev 目录
    • 方法四:使用 OpenCV
    • 方法五:使用 Picamera
    • 方法六:使用 libcamera
  • 5. 总结

1. 源由

最近一直在倒腾摄像头,OpenIPC/FPV、CompanionComputer、IPC等,都离不开这个摄像头。可惜树莓派上的这个摄像头尤其奇怪,明明之前是好的,但是系统升级以后出现了一些兼容性问题。

为此,特地总结归纳下。有知道的朋友也请告知下如何解决,谢谢!

问题出处主要是Rover上CompanionComputer一直摄像头问题不断,导致不断地换货、测试、分析、定位。

最后OV5647的买家来了一句“OV5647树莓派只是支持32位”。我晕,我可以发誓“前面几个月,我用的这个树莓派伴机电脑,一直用64位系统,同一张tf卡,没见什么问题啊!!!”

  • Ardupilot开源代码之Rover上路计划
  • ArduPilot开源代码之CompanionComputer上天计划

2. 问题

貌似问题越来越指向兼容性、参数优化等问题。
而目前最为重要的问题,就是采用python的gst库获取设备的时候,会出现Segmentation fault,这个可不是什么好事情。

  • RTP streaming lost, not sure if the encoding process is exit #223
  • 4G LTE networks results in significant screen freezing and stuttering #225
  • Video: Camera didn’t show on WebGUI sometimes #233
  • Can’t access video WebGUI #234

3. 分析

在树莓派上编程以获取摄像头设备列表,可以使用多种方法,包括 pyudevv4l2-ctl、以及直接读取 /dev 目录。

以下是几种有效的方法,按理应该能够在树莓派上成功获取摄像头设备列表并验证其工作状态。如果依然遇到问题,请检查硬件连接、摄像头模块的兼容性以及驱动是否正确安装。

方法一:使用 pyudev 库

pyudev 是一个与设备直接交互的库,适用于树莓派。

  1. 安装 pyudev

    pip install pyudev
    
  2. 使用以下代码获取摄像头设备列表:

    import pyudevcontext = pyudev.Context()
    cameras = []
    for device in context.list_devices(subsystem='video4linux'):cameras.append(device.device_node)print("Available cameras:", cameras)
    

方法二:使用 v4l2-ctl 工具

v4l2-ctl 是一个命令行工具,可以列出视频设备。

  1. 安装 v4l-utils

    sudo apt-get install v4l-utils
    
  2. 使用以下代码获取摄像头设备列表:

    import subprocessdef list_cameras():try:output = subprocess.check_output("v4l2-ctl --list-devices", shell=True).decode('utf-8')devices = []lines = output.split('\n')for i in range(len(lines)):if "video" in lines[i]:devices.append(lines[i].strip())return devicesexcept Exception as e:print(f"Error: {e}")return []print("Available cameras:", list_cameras())
    

方法三:直接读取 /dev 目录

使用以下代码获取摄像头设备列表:

```python
import osdef list_cameras():video_devices = [f"/dev/{f}" for f in os.listdir('/dev') if f.startswith('video')]return video_devicesprint("Available cameras:", list_cameras())
```

方法四:使用 OpenCV

OpenCV 是一个流行的计算机视觉库,也可以用于检测摄像头设备。

  1. 安装 OpenCV:

    sudo apt-get install python3-opencv
    pip install numpy
    
  2. 使用以下代码获取摄像头设备列表:

    import cv2def list_cameras():index = 0arr = []while True:cap = cv2.VideoCapture(index)if not cap.read()[0]:breakelse:arr.append(index)cap.release()index += 1return arrprint("Available cameras:", list_cameras())
    

方法五:使用 Picamera

Picamera 库是专门为树莓派摄像头模块设计的。

  1. 安装 picamera

    pip install picamera
    
  2. 使用以下代码检查摄像头是否连接:

    from picamera import PiCamera
    from time import sleepcamera = PiCamera()
    try:camera.start_preview()sleep(5)camera.capture('/home/pi/Desktop/image.jpg')camera.stop_preview()print("Camera is working and captured an image.")
    except PiCameraError as e:print(f"Failed to access camera: {e}")
    

方法六:使用 libcamera

  1. 使用 /dev 目录列出设备
import osdef list_video_devices():video_devices = [f"/dev/{device}" for device in os.listdir('/dev') if device.startswith('video')]return video_devicesprint("Video devices:", list_video_devices())
  1. 使用 libcamera 工具检查设备兼容性
import subprocess
import osdef list_video_devices():video_devices = [f"/dev/{device}" for device in os.listdir('/dev') if device.startswith('video')]return video_devicesdef check_libcamera_compatibility(device):try:result = subprocess.run(["libcamera-hello"], capture_output=True, text=True, timeout=5)if "No cameras available" in result.stderr:return Falsereturn Trueexcept subprocess.TimeoutExpired:return Falseexcept Exception as e:print(f"Error checking device {device}: {e}")return Falsevideo_devices = list_video_devices()
compatible_devices = [device for device in video_devices if check_libcamera_compatibility(device)]print("All video devices:", video_devices)
print("Compatible with libcamera:", compatible_devices)

4. 实测

从这里,我们可以真实的看到摄像头存在,并且经过libcamera验证也是可以出图的。

$ libcamera-hello --list-camera
Available cameras
-----------------
0 : ov5647 [2592x1944] (/base/soc/i2c0mux/i2c@1/ov5647@36)Modes: 'SGBRG10_CSI2P' : 640x480 [58.92 fps - (16, 0)/2560x1920 crop]1296x972 [43.25 fps - (0, 0)/2592x1944 crop]1920x1080 [30.62 fps - (348, 434)/1928x1080 crop]2592x1944 [15.63 fps - (0, 0)/2592x1944 crop]

方法一:使用 pyudev 库

仅仅只是遍历了/dev/video*的效果,并未很好的发现设备。

$ python3 test-pyudev.py
Available cameras: ['/dev/video10', '/dev/video11', '/dev/video12', '/dev/video18', '/dev/video31', '/dev/video13', '/dev/video14', '/dev/video15', '/dev/video16', '/dev/video20', '/dev/video21', '/dev/video22', '/dev/video23', '/dev/v4l-subdev0', '/dev/video0']

方法二:使用 v4l2-ctl 工具

仅仅只是遍历了/dev/video*的效果,并未很好的发现设备。

$ python3 test-v4l2-ctl.py
Available cameras: ['/dev/video0', '/dev/video10', '/dev/video11', '/dev/video12', '/dev/video18', '/dev/video31', '/dev/video13', '/dev/video14', '/dev/video15', '/dev/video16', '/dev/video20', '/dev/video21', '/dev/video22', '/dev/video23']

方法三:直接读取 /dev 目录

仅仅只是遍历了/dev/video*,未很好的发现设备,与遍历目录结果一致。

 $ python3 test-dev.py
Available cameras: ['/dev/video0', '/dev/video31', '/dev/video18', '/dev/video12', '/dev/video11', '/dev/video10', '/dev/video23', '/dev/video22', '/dev/video21', '/dev/video20', '/dev/video16', '/dev/video15', '/dev/video14', '/dev/video13']

方法四:使用 OpenCV

未发现摄像头设备。

 $ python3 test-opencv.py
Available cameras: []

方法五:使用 Picamera

略. 树莓派目前已经从Picamera升级到libcamera,这里不做介绍。

方法六:使用 libcamera

未发现摄像头设备。

$ python3 test-libcamera.py
All video devices: ['/dev/video0', '/dev/video31', '/dev/video18', '/dev/video12', '/dev/video11', '/dev/video10', '/dev/video23', '/dev/video22', '/dev/video21', '/dev/video20', '/dev/video16', '/dev/video15', '/dev/video14', '/dev/video13']
Compatible with libcamera: []

5. 总结

从上述分析和实测情况看:

  • 方法三采用遍历目录的方式,很直接,效果就是遍历
  • 其他pyudev、v4l2-ctl采用的细节不清楚,但是效果与遍历目录一致
  • 使用opencv、libcamera似乎更是玄学,结果也是没有找到摄像头设备
  • 相信上面除了遍历目录以外,或多或少会有通过驱动API去发现设备,但是结果没有成功
  • 反而libcamera-hello --list-camera枚举设备成功,并反馈正确参数

因此,期望后续能有一个实际的方法能够正确的找到摄像头设备。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
$ uname -a
Linux rpanion 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023 aarch64 GNU/Linux

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『原型资源』Axure自带图标库不够用,第三方经典图标库来袭

​今天小编为大家带来第三方经典图标库,己确认内容可用现推荐给大家。直接上手就可不用自己画哈~ 获取原型文档请与班主任联系! 先睹为快,合适再拿走不谢: 图标太多,截取部分给大家参考o(* ̄︶ ̄*…

Java最新面试题(全网最全、最细、附答案)

一、Java基础 1、基础概念与常识Java 语言有哪些特点? 简单易学(语法简单,上手容易);面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关性&a…

OCP学习笔记-007 SQL语言之二:DML

2. DML - Data Manipulation Language 数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括insert、delete、udpate和select等。(增添改查) 事务:A transaction consists of a collection of DML statements that form a logi…

Vue 3获取DOM元素的大小以及相对于视口的位置的getBoundingClientRect属性

在Vue 3中,可以使用ref来获取DOM元素的getBoundingClientRect属性。 如果元素已挂载,我们使用 getBoundingClientRect 方法来获取元素的位置和大小信息。这个方法返回一个对象,其中包含了 left、top、right、bottom 等属性,这些属…

LVS负载均衡集群企业级应用实战-LVS/NAT模式(三)

目录 LVS/NAT模式 一. 环境准备 二. 对虚拟服务器操作 三. 对真实服务器操作 四. 打开网站验证 LVS/NAT模式 一. 环境准备 主机名主机IP模拟服务器系统用途localhost 10.36.178.156 192.168.226.137 虚拟服务器 Rocky_linux 客户兼负载均衡机分发IPlocalhost192.168.226…

关于Linux桌面系统的普及 这里是一些建议

Linux 桌面系统在普及方面面临一些挑战,尽管它在服务器和开发者社区中非常受欢迎。为了提高其普及率,可以从以下几个方面着手: 1. 改善用户体验 用户界面友好性:提升桌面环境的易用性和美观度,使其更符合普通用户的习…

记C#优化接口速度过程

前提摘要 首先这个项目是接手的前一任先写的项目,接手后,要求对项目一些速度相对较慢的接口进行优化,到第一个速度比较慢的接口后,发现单接口耗时4-8秒,是的,请求同一个接口,在参数不变的情况下…

【个人博客搭建】(24)统一api接口返回格式

统一接口的返回格式是为了方便开发的数据对接。 在现如今前后端分离的趋势下,需要对接各种类型的数据 所以,我们需要一个标准的数据格式。 1、定义数据格式:例如下边就是一个常见的格式 {"succeed":true,"code": 200,&q…

【算法——动态规划(从dfs回溯开始推导dp)】

基础理论 递归: 递:大问题分解子问题的过程 ; 归:产生答案 dp:只进行归;用已知的最底层的(递归的边界,搜索树的底),推出未知 《视频索引》 一句话&…

TDengine数据迁移

前言 taosdump 是一个支持从运行中的 TDengine 集群备份数据并将备份的数据恢复到相同或另一个运行中的 TDengine 集群中的工具应用程序。 taosdump 可以用数据库、超级表或普通表作为逻辑数据单元进行备份,也可以对数据库、超级 表和普通表中指定时间段内的数据记录…

蓝牙BLE上位机工具开发理论线索梳理_5.Windows WinRT API包Microsoft.Windows.SDK.Contracts

1. WinRT API包介绍 本文介绍下Windows WinRT API包(Microsoft.Windows.SDK.Contracts), 如图1是SDK包的描述。 图1 Microsoft.Windows.SDK.Contracts Windows WinRT API包使您能够将最新的Windows运行时API支持添加到您的。net Framework 4.…

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 探测效果(地图探测、地图窥探)

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 探测效果(地图探测、地图窥探) 实现原理 ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类,可以添加数据以及操作 FBO(ManagedFBO)&#xf…

媲美Sora,免费使用!带物理模拟的,文生视频模型

6月13日,知名3D建模平台Luma AI发布最新文生视频模型Dream Machine,向所有用户免费开放使用。 Dream Machine除了支持文本之外,还可使用图片作为引导来生成视频,其生成的视频质量、动作一致性、色彩、光影、饱和度、运镜等方面&a…

Mysql学习笔记-进阶篇

一、存储引擎 1、MYSQL体系结构 连接层、服务层、引擎层、存储层; 2、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是库的,所以存储引擎也可被称为表类型。 1)在创…

golang闭包

【1】什么是闭包: 闭包就是一个函数和与其相关的引用环境组合的一个整体 【2】案例展示: package main import "fmt" //函数功能:求和 //函数的名字:getSum 参数为空 //getSum函数返回值为一个函数,这个函…

[工具探索]英寸vs毫米下常见尺寸排版

文章目录 常见尺寸1. 照片尺寸2. 纸张尺寸3. 显示器和电视屏幕尺寸4. 手机屏幕尺寸5. 笔记本电脑屏幕尺寸6. 其他设备尺寸 换算公式换算方法常见照片尺寸对比表国际标准ISO(216)纸张尺寸 什么是英寸? 英寸(英语:inch&a…

Hutool有哪些常用方法

Hutool是一个Java工具类库,它提供了很多方便的方法来简化Java开发。以下是一些Hutool的常用方法及其示例: 一、日期时间处理 DateUtil.format(Date date, String pattern): 格式化日期。 // 代码如下 Date date new Date(); String format DateUtil…

计算机组成原理 期末复习笔记整理(上)(个人复习笔记/侵删/有不足之处欢迎斧正)

零、计算机的发展 冯.诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,可按地址寻访 3.指令和数据用二进制表示 4.指令由操作码和地址码组成 5.存储程序(首次提出存储结构) 6.以运算器为中心(现代…

水泥行业超低排放简介

在当今社会,随着环保意识的不断提高,水泥行业作为重要的工业领域,其超低排放的实施范围及成效日益受到人们的关注。朗观视觉小编将从多个角度探讨水泥行业超低排放的实施范围,分析其背后的意义与影响,展望未来的发展趋…

如何在国产深度发行版Linux上部署ONLYOFFICE协作空间社区版?

如何在国产深度发行版Linux上部署ONLYOFFICE协作空间社区版? 书接上文: ONLYOFFICE 协作空间服务器如何一键安装自托管私有化部署 讲的是如何把ONLYOFFICE协作空间服务器部署到自托管云服务器VPS上面,这里继续,在自己Windows电…