标签 相机 下的文章

我用 gphoto2 给我的旧单反相机带来了新的生命,把它变成了 Linux 电脑的网络摄像头。

今年,在我基本上放弃了 MacBook,转而使用 NixOS 机器之后,我开始在与人进行视频通话时被要求“打开摄像头”。这是一个问题,因为我没有网络摄像头。我考虑购买一个,但后来我意识到我有一台完好无损的 2008 年产的佳能 EOS Rebel XS 数码单反相机放在书架上。这台相机有一个 mini-USB 接口,所以我自然而然地思考:一台数码单反相机、一个 mini-USB 接口和一台台式电脑,是否意味着我能拥有一个网络摄像头?

只有一个问题。我的佳能 EOS Rebel XS 不能录制视频。它可以拍摄一些漂亮的照片,仅此而已。所以这结束了?

还是有别的办法?

恰好有一个叫做 gphoto2 的神奇的开源软件。一旦安装,它允许你从计算机控制各种支持的相机,并拍摄照片和视频。

支持的相机

首先,了解你的设备是否得到支持:

$ gphoto2 --list-cameras

拍摄图像

你可以用它拍照:

$ gphoto2 --capture-image-and-download

快门触发,图像会保存到你当前的工作目录中。

录制视频

我意识到了这里的潜力,所以尽管我的相机没有视频功能,我还是决定尝试 gphoto2 --capture-movie 命令。不知怎么,尽管我的相机不支持视频功能,gphoto2 仍然能够生成一个 MJPEG 文件!

在我的相机上,我需要将其置于“实时预览”模式下,然后 gphoto2 才能录制视频。这包括将相机设置为纵向模式,然后按下 “ 设置 Set ” 按钮,使取景器关闭,相机屏幕显示图像。不幸的是,这还不足以将其用作网络摄像头。它仍然需要分配一个视频设备,例如 /dev/video0

安装 ffmpeg 和 v4l2loopback

毫不奇怪,有一个开源的解决方案来解决这个问题。首先,使用你的包管理器安装 gphoto2ffmpegmpv。例如,在 Fedora 、CentOS 、Mageia 和类似的 Linux 发行版上:

$ sudo dnf install gphoto2 ffmpeg mpv

在 Debian、Linux Mint 及其类似发行版:

$ sudo apt install gphoto2 ffmpeg mpv

我使用的是 NixOS,这是我的配置文件:

# configuration.nix
...
environment.systemPackages = with pkgs; [
  ffmpeg
  gphoto2
  mpv
...  
]

创建虚拟视频设备需要使用 v4l2loopback Linux 内核模块。在撰写本文时,该功能未包含在主线内核中,因此你需要自己下载和编译它:

$ git clone https://github.com/umlaeute/v4l2loopback
$ cd v4l2loopback
$ make
$ sudo make install
$ sudo depmod -a

如果你像我一样使用 NixOS ,你可以在 configuration.nix 中添加额外的模块包:

[...]
boot.extraModulePackages = with config.boot.kernelPackages;
[ v4l2loopback.out ];
boot.kernelModules = [
  "v4l2loopback"
];
boot.extraModprobeConfig = ''
  options v4l2loopback exclusive_caps=1 card_label="Virtual Camera"
'';
[...]

在 NixOS 上, 运行 sudo nixos-rebuild switch,然后重启。

创建一个视频设备

假设你的计算机当前没有 /dev/video 设备,你可以借助 v4l2loopback 在需要时创建一个。

运行以下命令,将 gphoto2 中的数据发送到 ffmpeg,使用设备如 /dev/video0 设备:

$ gphoto2 --stdout --capture-movie |
 ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video0

你得到的输出是这样的:

ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11.3.0 (GCC)
  configuration: --disable-static ...
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Capturing preview frames as movie to 'stdout'. Press Ctrl-C to abort.[mjpeg @ 0x1dd0380] Format mjpeg detected only with low score of 25, misdetection possible!
Input #0, mjpeg, from 'pipe:':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 768x512 ...
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> rawvideo (native))[swscaler @ 0x1e27340] deprecated pixel format used, make sure you did set range correctly
Output #0, video4linux2,v4l2, to '/dev/video0':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Video: rawvideo (I420 / 0x30323449) ...
    Metadata:
      encoder         : Lavc58.134.100 rawvideoframe=  289 fps= 23 q=-0.0 size=N/A time=00:00:11.56 bitrate=N/A speed=0.907x

要查看来自网络摄像头的视频,请使用 mpv 命令:

$ mpv av://v4l2:/dev/video0 --profile=low-latency --untimed

Streaming a live feed from the webcam

自动启动你的网络摄像头

每次想使用网络摄像头时都需要执行一次命令有点麻烦。幸运的是,你可以在启动时自动运行此命令。我将其实现为一个 systemd 服务:

# configuration.nix
...
  systemd.services.webcam = {
    enable = true;
    script = ''
      ${pkgs.gphoto2}/bin/gphoto2 --stdout --capture-movie |
        ${pkgs.ffmpeg}/bin/ffmpeg -i - \
            -vcodec rawvideo -pix_fmt yuv420p -f v4l2  /dev/video0
    '';
wantedBy = [ "multi-user.target" ];
  };
...

在 NixOS 上,运行 sudo nixos-rebuild switch,然后重新启动你的计算机。你的网络摄像头已经开启并处于活动状态。

要检查是否存在任何问题,可以使用 systemctl status webcam 命令。它会告诉你服务最后一次运行的时间,并提供其以前输出的日志。这对于调试非常有用。

迭代以使其变得更好

止步于此也许很诱人。但是,考虑到当前的全球危机,我们可能需要思考是否有必要一直开着网络摄像头。这让我感到不太理想,原因如下:

  • 这浪费电。
  • 这类事情涉及隐私问题。

我的摄像头有一个镜头盖,所以说实话,第二个原因并不真的让我感到困扰。当我不使用网络摄像头时,我总是可以把镜头盖上。然而,让一个耗电量大的单反相机整天开着(更不用说需要解码视频所需的 CPU 开销),对我的电费并没有任何好处。

理想情况是:

  • 我一直把相机插在电脑上,但是关闭的。
  • 当我想使用网络摄像头时,我按下相机的电源按钮将其打开。
  • 我的计算机会检测到相机并启动 systemd 服务。
  • 使用网络摄像头完成后,我再次将其关闭。

为了实现这一点,你需要使用一个自定义的 udev 规则。

udev 规则可以告诉你的计算机,当它发现某个设备已经可用时执行某个任务。这可以是外部硬盘甚至是非 USB 设备。在这种情况下,你需要通过其 USB 连接识别相机。

首先,指定 udev 规则被触发时要运行的命令。你可以用一个 shell 脚本来完成(systemctl restart webcam 应该可以工作)。我运行的是 NixOS,所以我只需要创建一个派生包(一个 Nix 包),它会重新启动 systemd 服务:

# start-webcam.nix
with import <nixpkgs> { };
writeShellScriptBin "start-webcam" ''
  systemctl restart webcam
  # debugging example
  # echo "hello" &> /home/tom/myfile.txt
  # If myfile.txt gets created then we know the udev rule has triggered properly''

接下来,实际定义 udev 规则。查找摄像头的设备和厂商 ID。使用 lsusb 命令可以完成此操作。该命令可能已经安装在你的发行版上,但我不经常使用它,因此我只需要根据需要使用 nix-shell 安装它:

$ nix-shell -p usbutils

无论你的计算机上已经安装了它,还是刚刚安装,请运行 lsusb

$ lsusb
Bus 002 Device 008: ID 04a9:317b Canon, Inc. Canon Digital Camera[...]

在此输出中,厂商 ID 为 04a9,设备 ID 为 317b。这已足以创建 udev 规则:

ACTION=="add", SUBSYSTEM=="usb",
ATTR{idVendor}=="04a9",
ATTR{idProduct}=="317b",
RUN+="/usr/local/bin/start-webcam.sh"

或者,如果你使用的是 NixOS:

# configuration.nix[...]let
  startWebcam = import ./start-webcam.nix;[...]
services.udev.extraRules = ''
  ACTION=="add",  \
  SUBSYSTEM=="usb", \
  ATTR{idVendor}=="04a9", \
  ATTR{idProduct}=="317b",  \
  RUN+="${startWebcam}/bin/start-webcam"'';[...]

最后,在你的 start-webcam systemd 服务中删除 wantedBy = ["multi-user.target"]; 这一行。(如果保留它,则无论相机是否开启,该服务都会在下次重启时自动启动。)

重复使用旧技术

我希望这篇文章能让你在放弃一些旧技术之前三思而后行。Linux 可以为技术注入活力,无论是你的电脑还是数码相机或其他外围设备等简单的东西。


via: https://opensource.com/article/22/12/old-camera-webcam-linux

作者:Tom Oliver 选题:lkxed 译者:Pabloxllwe 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

倪光南院士称中国自研芯片应押注 RISC-V

近日,中国工程院院士倪光南在《数字世界专刊》撰文指出,目前国内多种国产 CPU 架构并存,未来可能会造成资源分散,低水平重复。如果不能及时改变这种状况,若干年后,中国将缺乏能在全球市场上与 x86 和 ARM 两家竞争的 CPU 架构,从而在“主流 CPU”方面仍将受制于人。倪光南建议,大力发展壮大 RISC-V 产业生态,加大对 RISC-V 开源社区的贡献以增大社区话语权,形成 x86、ARM 和 RISC-V 三分天下的格局。

消息来源:《通信世界》
老王点评:? 倪院士真是不怕得罪人,铁骨铮铮的老人。

Windows 终端已成为 Windows 11 默认终端

一直以来,命令提示符一直是 Windows 的默认终端。微软宣布,从 Windows 11 22H2 开始所有命令行应用将默认用 “Windows 终端”打开。Windows 终端是微软在 2019 年宣布的开源命令行终端,源代码发布在 GitHub 上。它支持多标签、Unicode 和 UTF-8 字符、GPU 加速文本渲染引擎,定制主题、样式和配置。

消息来源:微软
老王点评:? 微软的这个终端真不错,可以和 Linux 上最好的终端相媲美。微软是不做开源软件则以,一做动辄就是精品啊。

开源相机库 libcamera 发布首个正式版本

libcamera 是“一个用于 Linux、安卓和 ChromeOS 的复杂的相机支持库”,已经开发了好几年了。相机是复杂的设备,需要大量的硬件图像处理操作,其处理控制算法是在相机中的专用 MCU 或主机的 CPU 中处理。相机设备和 Linux 之间的界限模糊,常常使用户除了使用供应商特定的闭源解决方案外没有其他选择。libcamera 在媒体社区与业界的合作中诞生的,以解决这种问题。

消息来源:Phoronix
老王点评:? 第一个正式版本号非常遵循开源传统,0.0.1。

谷歌正式推出可装在普通电脑的 ChromeOS Flex 操作系统

ChromeOS Flex 是一个基于 ChromeOS、兼容大部分硬件的操作系统,谷歌官方表示经过验证的设备已经“超过 400 款”。ChromeOS Flex 可以下载到 USB 设备中,然后在 Mac 或者 Windows 设备上进行安装。它于今年 2 月推出,主要基于谷歌在 2020 年收购的 CloudReady 的技术。它最大的优势就是能够让老旧设备“焕发生机”,尤其是那些原生系统已经无法再获得软件更新的设备。在未经谷歌认证的设备上同样可以安装 ChromeOS Flex,只要这些设备符合官方的最低要求。

消息来源:谷歌
老王点评:不知道是不是和 ChromeOS 一样,需要那种不一样的网络?

尼康停止单反相机的开发

配备高清摄像头的智能手机正在侵蚀相机市场,尼康表示今后将专注于开发逐渐在市场上成为主流的、引进人工智能和图像处理技术的无反相机。尼康在 1959 年推出首款单反相机 Nikon F,自 2020 年 6 月推出面向专业人士的旗舰机型 D6 后,再未推出过单反相机的新产品。单反相机的优势是可以根据被拍摄物体和摄影环境更换镜头。尼康在单反相机的销量份额上仅次于佳能,排在世界第 2 位。佳能也计划在数年内结束单反相机的旗舰机型的开发。

消息来源:日经中文网
老王点评:单反相机估计没想到它的敌人是智能手机吧。

谷歌高管认为 Instagram 和 TikTok 在侵蚀该公司核心产品

TikTok 对谷歌业务的威胁不限于视频服务 YouTube,谷歌公司高管承认 Instagram 和 TikTok 危及到了公司核心产品:搜索和地图。新一代的用户的搜索习惯和以前的用户不同,他们不是输入查询词,而是倾向于通过更沉浸的方式发现内容。比如在搜寻餐馆时,四成的年轻人不是打开谷歌地图或搜索,而是打开 TikTok 或 Instagram。

消息来源:Tech Crunch
老王点评:和单反的情况类似,打败搜索的不是更好的搜索,反而是其它的产品。

智能手机将在三年内扼杀单反相机

索尼半导体解决方案 CEO 在会议上称,手机的静止图像预计将在 2024 年超过可换镜头相机的图像质量。这包括无反光镜相机,以及现代基本上放弃的老式单反相机。智能手机摄像技术远未达到技术天花板,预计将继续其成像技术的演变,而对大多数人来说,独立的相机是多余的。索尼在全球手机图像传感器市场上占有 42% 的份额。

消息来源:techradar
老王点评:确实,我有多久没拿出来相机了?除了给它的电池充一下电?没想到打败相机的不是更先进的相机,却是手机。同样已经被或即将被手机消灭的设备有哪些呢?

苹果称其应用商店阻止了价值 15 亿美元的欺诈交易

根据苹果两年来发布的预防欺诈分析报告称,苹果在 2020 年和 2021 年各阻止了 15 亿美元的欺诈交易。并且,苹果还成功地打击了各类有问题的应用程序,它在 2020 年和 2021 年分别阻止了 100 万和 160 万个应用。苹果还因欺诈活动终止了 80 万个开发者账户,因类似理由拒绝了 15 万个账户。

消息来源:9to5mac
老王点评:不得不说,苹果在商店的管理上还是下了不少功夫,相对安卓商店,无论是谷歌的还是第三方的,我更信任苹果商店。

360 万台 MySQL 服务器暴露于互联网上

网络安全研究组织扫描发现,有近 360 万台 MySQL 服务器在使用默认的 3306 号 TCP 端口暴露在互联网上。其中 IPv4 地址约 230 万台,IPv6 地址约 130 台。按国家划分,这些可以轻松访问的 IPv4 MySQL 服务器数量如下:美国(74 万)、中国(30 万)、波兰(21 万)和德国(17 万)。而对于 IPv6 则是:美国(46 万)、荷兰(30 万)、新加坡(22 万)和德国(17 万)。不知道什么原因,没有统计到中国 IPv6 的 MySQL 服务器。

消息来源:shadowserver
老王点评:我只能说这些都是自找的,连最最起码安全措施都没有。

学习如何使用一个树莓派 Zero、高清网络摄像头和一个空的粉盒来搭建一个简单的相机。

在 2015 年底的时候,树莓派基金会发布了一个让大家很惊艳的非常小的 树莓派 Zero。更夸张的是,他们随 MagPi 杂志一起 免费赠送。我看到这个消息后立即冲出去到处找报刊亭,直到我在这一地区的某处找到最后两份。实际上我还没有想好如何去使用它们,但是我知道,因为它们非常小,所以,它们可以做很多全尺寸树莓派没法做的一些项目。

 title=

从 MagPi 杂志上获得的树莓派 Zero。CC BY-SA.4.0。

因为我对天文摄影非常感兴趣,我以前还改造过一台微软出的 LifeCam Cinema 高清网络摄像头,拆掉了它的外壳、镜头、以及红外滤镜,露出了它的 CCD 芯片。我把它定制为我的 Celestron 天文望远镜的目镜。用它我捕获到了令人难以置信的木星照片、月球上的陨石坑、以及太阳黑子的特写镜头(使用了适当的 Baader 安全保护膜)。

在那之前,我甚至还在我的使用胶片的 SLR 摄像机上,通过在镜头盖(这个盖子就是在摄像机上没有安装镜头时,用来保护摄像机的内部元件的那个盖子)上钻一个小孔来变成一个 针孔摄像机,将这个钻了小孔的盖子,盖到一个汽水罐上切下来的小圆盘上,以提供一个针孔。碰巧有一天,这个放在我的桌子上的针孔镜头盖被改成了用于天文摄像的网络摄像头。我很好奇这个网络摄像头是否有从针孔盖子后面捕获低照度图像的能力。我花了一些时间使用 GNOME Cheese 应用程序,去验证这个针孔摄像头确实是个可行的创意。

自从有了这个想法,我就有了树莓派 Zero 的一个用法!针孔摄像机一般都非常小,除了曝光时间和胶片的 ISO 速率外,一般都不提供其它的控制选项。数字摄像机就不一样了,它至少有 20 多个按钮和成百上千的设置菜单。我的数字针孔摄像头的目标是真实反映天文摄像的传统风格,设计一个没有控制选项的极简设备,甚至连曝光时间控制也没有。

用树莓派 Zero、高清网络镜头和空的粉盒设计的数字针孔摄像头,是我设计的 一系列 针孔摄像头的 第一个项目。现在,我们开始来制作它。

硬件

因为我手头已经有了一个树莓派 Zero,为完成这个项目我还需要一个网络摄像头。这个树莓派 Zero 在英国的零售价是 4 英磅,这个项目其它部件的价格,我希望也差不多是这样的价格水平。花费 30 英磅买来的摄像头安装在一个 4 英磅的计算机主板上,让我感觉有些不平衡。显而易见的答案是前往一个知名的拍卖网站上,去找到一些二手的网络摄像头。不久之后,我仅花费了 1 英磅再加一些运费,获得了一个普通的高清摄像头。之后,在 Fedora 上做了一些测试操作,以确保它是可用正常使用的,我拆掉了它的外壳,以检查它的电子元件的大小是否适合我的项目。

 title=

Hercules DualPix 高清网络摄像头,它将被解剖以提取它的电路板和 CCD 图像传感器。CC BY-SA 4.0.

接下来,我需要一个安放摄像头的外壳。树莓派 Zero 电路板大小仅仅为 65mm x 30mm x 5mm。虽然网络摄像头的 CCD 芯片周围有一个用来安装镜头的塑料支架,但是,实际上它的电路板尺寸更小。我在家里找了一圈,希望能够找到一个适合盛放这两个极小的电路板的容器。最后,我发现我妻子的粉盒足够去安放树莓派的电路板。稍微做一些小调整,似乎也可以将网络摄像头的电路板放进去。

 title=

变成我的针孔摄像头外壳的粉盒。CC BY-SA 4.0.

我拆掉了网络摄像头外壳上的一些螺丝,取出了它的内部元件。网络摄像头外壳的大小反映了它的电路板的大小或 CCD 的位置。我很幸运,这个网络摄像头很小而且它的电路板的布局也很方便。因为我要做一个针孔摄像头,我需要取掉镜头,露出 CCD 芯片。

它的塑料外壳大约有 1 厘米高,它太高了没有办法放进粉盒里。我拆掉了电路板后面的螺丝,将它完全拆开,我认为将它放在盒子里有助于阻挡从缝隙中来的光线,因此,我用一把工艺刀将它修改成 4 毫米高,然后将它重新安装。我折弯了 LED 的支脚以降低它的高度。最后,我切掉了安装麦克风的塑料管,因为我不想采集声音。

 title=

取下镜头以后,就可以看到裸露的 CCD 芯片了。圆柱形的塑料柱将镜头固定在合适的位置上,并阻挡 LED 光进入镜头破坏图像。CC BY-SA 4.0

网络摄像头有一个很长的带全尺寸插头的 USB 线缆,而树莓派 Zero 使用的是一个 Micro-USB 插座,因此,我需要一个 USB 转 Micro-USB 的适配器。但是,使用适配器插入,这个树莓派将放不进这个粉盒中,更不用说还有将近一米长的 USB 线缆。因此,我用刀将 Micro-USB 适配器削开,切掉了它的 USB 插座并去掉这些塑料,露出连接到 Micro-USB 插头上的金属材料。同时也把网络摄像头的 USB 电缆切到大约 6 厘米长,并剥掉裹在它外面的锡纸,露出它的四根电线。我把它们直接焊接到 Micro-USB 插头上。现在网络摄像头可以插入到树莓派 Zero 上了,并且电线也可以放到粉盒中了。

 title=

网络摄像头使用的 Micro-USB 插头已经剥掉了线,并直接焊接到触点上。这个插头现在插入到树莓派 Zero 后大约仅高出树莓派 1 厘米。CC BY-SA 4.0

最初,我认为到此为止,已经全部完成了电子设计部分,但是在测试之后,我意识到,如果摄像头没有捕获图像或者甚至没有加电我都不知道。我决定使用树莓派的 GPIO 针脚去驱动 LED 指示灯。一个黄色的 LED 表示网络摄像头控制软件已经运行,而一个绿色的 LED 表示网络摄像头正在捕获图像。我在 BCM 的 17 号和 18 号针脚上各自串接一个 300 欧姆的电阻,并将它们各自连接到 LED 的正极上,然后将 LED 的负极连接到一起并接入到公共地针脚上。

 title=

LED 使用一个 300 欧姆的电阻连接到 GPIO 的 BCM 17 号和 BCM 18 号针脚上,负极连接到公共地针脚。CC BY-SA 4.0.

接下来,该去修改粉盒了。首先,我去掉了卡在粉盒上的托盘以腾出更多的空间,并且用刀将连接处切开。我打算在一个便携式充电宝上运行树莓派 Zero,充电宝肯定是放不到这个盒子里面,因此,我挖了一个孔,这样就可以引出 USB 连接头。LED 的光需要能够从盒子外面看得见,因此,我在盖子上钻了两个 3 毫米的小孔。

然后,我使用一个 6 毫米的钻头在盖子的底部中间处钻了一个孔,并找了一个薄片盖在它上面,然后用针在它的中央扎了一个小孔。一定要确保针尖很细,因为如果插入整个针会使孔太大。我使用干/湿砂纸去打磨这个针孔,以让它更光滑,然后从另一面再次打孔,再强调一次仅使用针尖。使用针孔摄像头的目的是为了得到一个规则的、没有畸形或凸起的圆孔,并且勉强让光通过。孔越小,图像越锐利。

 title=

带针孔的盒子底部。CC BY-SA 4.0

剩下的工作就是将这些已经改造完成的设备封装起来。首先我使用蓝色腻子将摄像头的电路板固定在盒子中合适的位置,这样针孔就直接处于 CCD 之上了。使用蓝色腻子的好处是,如果我需要清理污渍(或者如果放错了位置)时,就可以很容易地重新安装 CCD 了。将树莓派 Zero 直接放在摄像头电路板上面。为防止这两个电路板之间可能出现的短路情况,我在树莓派的背面贴了几层防静电胶带。

树莓派 Zero 非常适合放到这个粉盒中,并且不需要任何固定,而从小孔中穿出去连接充电宝的 USB 电缆需要将它粘住固定。最后,我将 LED 塞进了前面在盒子上钻的孔中,并用胶水将它们固定住。我在 LED 的针脚之中放了一些防静电胶带,以防止盒子盖上时,它与树莓派电路板接触而发生短路。

 title=

树莓派 Zero 塞入到这个盒子中后,周围的空隙不到 1mm。从盒子中引出的连接到网络摄像头上的 Micro-USB 插头,接下来需要将它连接到充电宝上。CC BY-SA 4.0

软件

当然,计算机硬件离开控制它的软件是不能使用的。树莓派 Zero 同样可以运行全尺寸树莓派能够运行的软件,但是,因为树莓派 Zero 的 CPU 速度比较慢,让它去引导传统的 Raspbian OS 镜像非常耗时。打开摄像头都要花费差不多一分钟的时间,这样的速度在现实中是没有什么用处的。而且,一个完整的树莓派操作系统对我的这个摄像头项目来说也没有必要。甚至是,我禁用了引导时启动的所有可禁用的服务,启动仍然需要很长的时间。因此,我决定仅使用需要的软件,我将用一个 U-Boot 引导加载器和 Linux 内核。自定义 init 二进制文件从 microSD 卡上加载 root 文件系统、读入驱动网络摄像头所需要的内核模块,并将它放在 /dev 目录下,然后运行二进制的应用程序。

这个二进制的应用程序是另一个定制的 C 程序,它做的核心工作就是管理摄像头。首先,它等待内核驱动程序去初始化网络摄像头、打开它、以及通过低级的 v4l ioctl 调用去初始化它。GPIO 针配置用来通过 /dev/mem 寄存器去驱动 LED。

初始化完成之后,摄像头进入一个循环。每个图像捕获循环是摄像头使用缺省配置,以 JPEG 格式捕获一个单一的图像帧、保存这个图像帧到 SD 卡、然后休眠三秒。这个循环持续运行直到断电为止。这已经很完美地实现了我的最初目标,那就是用一个传统的模拟的针孔摄像头设计一个简单的数字摄像头。

定制的用户空间 代码 在遵守 GPLv3 或者更新版许可下自由使用。树莓派 Zero 需要 ARMv6 的二进制文件,因此,我使用了 QEMU ARM 模拟器在一台 x86\_64 主机上进行编译,它使用了 Pignus 发行版(一个针对 ARMv6 移植/重构建的 Fedora 23 版本)下的工具链,在 chroot 环境下进行编译。所有的二进制文件都静态链接了 glibc,因此,它们都是自包含的。我构建了一个定制的 RAMDisk 去包含这些二进制文件和所需的内核模块,并将它拷贝到 SD 卡,这样引导加载器就可以找到它们了。

 title=

最终完成的摄像机完全隐藏在这个粉盒中了。唯一露在外面的东西就是 USB 电缆。CC BY-SA 4.0

照像

软件和硬件已经完成了,是该去验证一下它能做什么了。每个人都熟悉用现代的数字摄像头拍摄的高质量图像,不论它是用专业的 DSLRs 还是移动电话拍的。但是,这个高清的 1280x1024 分辨率的网络摄像头(差不多是一百万像素),在这里可能会让你失望。这个 CCD 从一个光通量极小的针孔中努力捕获图像。网络摄像头自动提升增益和曝光时间来进行补偿,最后的结果是一幅噪点很高的图像。图像的动态范围也非常窄,从一个非常拥挤的柱状图就可以看出来,这可以通过后期处理来拉长它,以得到更真实的亮部和暗部。

在户外阳光充足时捕获的图像达到了最佳效果,因此在室内获得的图像大多数都是不可用的图像。它的 CCD 直径仅有大约 1cm,并且是从一个几毫米的针孔中来捕获图像的,它的视界相当窄。比如,在自拍时,手臂拿着相机尽可能伸长,所获得的图像也就是充满整个画面的人头。最后,图像都是失焦的,所有的针孔摄像机都是这样的。

 title=

在伦敦,大街上的屋顶。CC BY-SA 4.0

 title=

范堡罗机场的老航站楼。CC BY-SA 4.0

最初,我只是想使用摄像头去捕获一些静态图像。后面,我降低了循环的延迟时间,从三秒改为一秒,然后用它捕获一段时间内的一系列图像。我使用 GStreamer 将这些图像做成了延时视频。

以下是我创建视频的过程:

视频是我在某天下班之后,从银行沿着泰晤式河到滑铁卢的画面。以每分钟 40 帧捕获的 1200 帧图像被我制作成了每秒 20 帧的动画。


via: https://opensource.com/article/18/3/how-build-digital-pinhole-camera-raspberry-pi

作者:Daniel Berrange 选题:lujun9972 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出