【问题标题】:Autodetect Raspberry-Pi Camera自动检测树莓派相机
【发布时间】:2015-02-04 16:53:48
【问题描述】:

我有一个问题,有没有办法检测 Raspi 相机 HW 模块?我正在用 Python 编写一个项目,我需要验证相机硬件模块是否连接到 RPi,因为我需要将相同的 Python 项目复制到多个 RPi,但其中一些没有连接相机。我正在使用 Picamera SW 模块,但我正在考虑如果相机存在于 /dev 树中的某处,则导入此类模块,如果这是可能的或实现此目的的方法,现在有人吗?

提前致谢

【问题讨论】:

  • 如果未连接相机,在初始化 picamera 类时是否会引发错误?还是什么都不做...如果您尝试在未连接相机的情况下捕获图像怎么办...图像大小是 0 还是什么?
  • 嗨乔兰,实际上我最初的想法是如你所描述的那样,使用操作系统。命令:“raspistill”用于在启动时运行 python 项目之前拍摄快照。可以肯定的一件事是 .jpeg 不会存在,忘记大小,问题是尝试使用 Python 时,它会在尝试拍摄快照时引发异常,而我真正需要的只是检测条件何时它是否存在,现在我已经实现了一个有效的解决方案,我会在主线程中发布它,非常感谢您的回答。

标签: python raspberry-pi


【解决方案1】:

好的,我在谷歌搜索后找到的解决方案是命令 vcgencmd,它用于检测相机是否已连接,因此通过发出 Python 执行子进程我已经得到了想要的结果

操作系统命令“vcgencmd get_camera”给出输出:

supported=0 detected=0

所以通过使用子进程 python 调用:

import subprocess
c = subprocess.check_output(["vcgencmd","get_camera"])
int(camdet.strip()[-1]) #-- Removes the final CR character and gets only the "0" or "1" from detected status

if (c):
    print "Camera detected"
else:
    print "not detected"

希望这对其他人有用,欢迎任何更简单的建议解决方案

【讨论】:

    【解决方案2】:

    根据上一篇文章,我使用它来检查 picamera 是否可用。 如果您得到支持并检测到值为 1,则您有可用的 picamera

    #!/usr/bin/python
    import subprocess
    #--next line returns something like supported=1 detected=1
    #--if get supported and deteted valued at 1 you have a picamera available    
    commandResult = subprocess.check_output("vcgencmd get_camera", shell=True)
    

    【讨论】:

      【解决方案3】:

      第一行将给出命令的输出,即: 支持=1 检测到=1 之后我们使用 Python RegEx(正则表达式),可以通过以下方式导入:import re 它将找到字符串中的所有数字值并返回它们。我们将它们转换为 int 以确保它是 0 或 1。 并在第三行解包列表以分别获取两个值。

      现在您可以在 Python 脚本中使用这些值来检查 Raspberry 中的摄像头状态。

      import re
      import subprocess
      
      commandResult = subprocess.getoutput("vcgencmd get_camera")
      commandResult = [int(x) for x in re.findall('\d+', commandResult)]
      camera_Supported , camera_Detected = commandResult
      print ("commandResult is: ", commandResult)
      print ("camera_Supported is: ", camera_Supported)
      print ("camera_Detected is: ", camera_Detected)
      

      【讨论】:

      • 请记住,Stack Overflow 不仅仅是为了解决眼前的问题,而是为了帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。鉴于此,您能否edit 您的答案包括对您正在做什么的解释以及为什么您认为这是最好的方法?