如何用树莓派制作数码针孔相机

了解如何使用树莓派 Zero、高清网络摄像头和一个空的化妆粉饼盒制作一个简单的相机。
538 位读者喜欢这篇文章。
raspberry pi inside a makeup compact

Opensource.com。CC BY-SA 4.0

在 2015 年末,树莓派基金会发布了小巧的 树莓派 Zero,让世界感到惊喜。更重要的是,他们在 MagPi 杂志的封面上 免费赠送了它。我立即冲出去,在附近的几家报刊亭搜寻,直到找到该地区最后两本。我不确定我会用它们做什么,但我知道它们的小尺寸将使我能够完成全尺寸树莓派无法满足的有趣项目。

Raspberry Pi Zero

opensource.com

由于我对天文摄影的兴趣,我之前改装了一个微软 LifeCam Cinema 高清网络摄像头,剥去了它的外壳、镜头和红外截止滤光片,露出了裸露的 CCD 芯片。我把它与一个定制的外壳一起使用,代替我的星特朗望远镜中的目镜进行天文摄影。它捕捉到了令人难以置信的木星景象、月球陨石坑的特写以及太阳上的太阳黑子(使用适当的巴德安全膜保护)。

甚至在那之前,我就把我的胶片单反相机变成了一个 针孔相机,方法是在机身盖(保护相机内部工作部件的盖子,当没有镜头连接时)上钻一个孔,并用一个从苏打罐上剪下来的薄片覆盖它,用针刺穿形成一个针孔。非常偶然的是,有一天这个针孔机身盖放在我的桌子上,旁边是改装过的天文摄影网络摄像头。我想知道网络摄像头的低光性能是否足够好,可以从针孔机身盖后面捕捉图像。只花了一分钟时间使用 GNOME Cheese 应用程序来验证针孔网络摄像头确实是一个可行的想法。

从这个想法的萌芽开始,我找到了使用我的树莓派 Zero 的方法!人们制作的针孔相机通常是极简主义的,除了曝光时间和胶片的 ISO 感光度之外,没有其他控制。相比之下,数码相机有 20 多个按钮和数百个隐藏在菜单中的设置。我对数码针孔网络摄像头的目标是忠实于针孔摄影的传统,并制造一个完全没有控制的极简主义设备,甚至没有曝光时间控制。

这款数码针孔相机,由树莓派 Zero、高清网络摄像头和空粉饼盒制成,是 第一个项目,也是我构建的 正在进行的系列 针孔相机之一。以下是我如何制作它的。

硬件

既然我已经有了树莓派 Zero,我就需要一个网络摄像头来用于这个项目。考虑到树莓派 Zero 在英国的零售价为 4 英镑,我希望该项目的其他部件价格也类似。花 30 英镑买一个摄像头与 4 英镑的计算机板一起使用感觉很不平衡。显而易见的答案是去一个著名的互联网拍卖网站竞拍一些二手网络摄像头。很快,我就以区区 1 英镑加上运费的价格购买了一个通用高清分辨率网络摄像头。在快速测试以确保它在 Fedora 上正常运行后,我开始剥去外壳以检查电子元件的尺寸。

Hercules DualPix HD webcam

opensource.com

接下来,我需要一个外壳来容纳摄像头。树莓派 Zero 电路板只有 65 毫米 x 30 毫米 x 5 毫米。网络摄像头的电路板甚至更小,尽管它在 CCD 芯片周围有一个塑料支架,用于固定镜头。我在房子周围寻找一个可以容纳两个微型电路板的容器。我发现我妻子的粉饼盒宽度正好可以容纳树莓派 Zero 电路板。稍微摆弄一下,看起来我也可以把网络摄像头板挤进去。

Powder compact

opensource.com

我开始剥去网络摄像头的外壳,拧下一些微小的螺丝,以便接触到内部结构。网络摄像头外壳的尺寸几乎无法说明内部电路板的尺寸或 CCD 的位置。我很幸运,这款网络摄像头很小,布局也很方便。由于我要制作针孔相机,我必须移除镜头以露出裸露的 CCD 芯片。

塑料支架大约有 1 厘米高,这对于放入粉饼盒来说太高了。我可以拧下电路板背面的几个螺丝将其完全移除,但我认为保留它来阻挡从外壳缝隙中透过的光线会很有用,所以我用美工刀将其修剪到 4 毫米高,然后重新安装。我弯曲了 LED 上的引脚以降低其高度。最后,我切掉了安装在麦克风上方的第二个塑料管,该塑料管用于引导声音,因为我不打算捕捉音频。

Bare CCD chip

opensource.com

网络摄像头有一根带全尺寸插头的长 USB 电缆,而树莓派 Zero 使用 Micro-USB 插座,所以我需要一个 USB 转 Micro-USB 适配器。但是,插入适配器后,树莓派就无法放入粉饼盒中,1 米长的 USB 电缆也无法放入。所以我用锋利的刀切掉了 Micro-USB 适配器,完全切掉了它的 USB 插座,并剥去塑料以露出通往 Micro-USB 插头的金属走线。我还将网络摄像头的 USB 电缆剪短到大约 6 厘米,并去除了其外层护套和箔纸包裹层,以露出四根单独的电缆线。我将它们直接焊接到 Micro-USB 插头上的走线上。现在网络摄像头可以插入树莓派 Zero,并且这对组合仍然可以放入粉饼盒外壳中。

Modified USB plugs

opensource.com

最初我以为这将是我电子设计的结束,但在测试后,我意识到我无法判断相机是否正在捕捉图像,甚至无法判断是否已开机。我决定使用树莓派的 GPIO 引脚来驱动指示 LED。当相机控制软件运行时,黄色 LED 会亮起,当网络摄像头正在捕捉图像时,绿色 LED 会亮起。我通过 300 欧姆限流电阻将 BCM 引脚 17 和 18 连接到 LED 的正极引脚,然后将两个负极引脚连接到公共接地引脚。

LEDs

opensource.com

接下来,是时候改造粉饼盒了。首先,我移除了固定粉饼的内托盘,通过用刀在铰链处将其切掉来释放外壳内部的空间。我计划使用便携式 USB 移动电源为树莓派 Zero 供电,但它无法放入外壳中,因此我在外壳侧面开了一个孔用于 USB 电缆连接器。LED 需要在外壳外部可见,因此我使用 3 毫米钻头在盖子上钻了两个孔。

然后我使用 6 毫米钻头在外壳底部的中心钻了一个孔,我用一块薄金属片覆盖了这个孔,并用缝纫针在其中心刺了一个针孔。我确保只有针尖穿过,因为插入整个针头会使孔变得太大。我使用细砂纸打磨针孔,然后从另一侧重新刺穿它,再次只使用针尖。针孔相机的目标是获得一个干净、圆形的孔,没有变形或脊,并且只能勉强让光线通过。孔越小,图像越清晰。

Bottom of the case with the pinhole aperture

opensource.com

剩下的就是组装完成的设备。首先,我将网络摄像头电路板固定在外壳中,使用蓝色腻子将其固定到位,以便 CCD 直接位于针孔上方。使用腻子使我可以轻松地重新定位 CCD,以便在我需要清洁灰尘点时(以及以防我将其放在错误的位置时)进行调整。我将树莓派 Zero 板直接放在网络摄像头板的顶部。为了防止两个板之间发生电气短路,我在树莓派的背面覆盖了几层电工胶带。

树莓派 Zero 非常适合粉饼盒,除了用于电池的 USB 电缆从外壳上的孔中伸出外,不需要任何其他东西来固定它。最后,我将 LED 戳过先前钻好的孔,并将它们粘到位。我在 LED 的引脚上添加了更多电工胶带,以防止盖子关闭时与树莓派 Zero 板发生短路。

Raspberry Pi Zero slotted into the case

opensource.com

软件

当然,没有软件控制,计算机硬件是无用的。树莓派 Zero 可以运行与全尺寸树莓派相同的软件,但是由于 Zero 的 CPU 速度较慢,启动传统的 Raspbian OS 镜像是一个非常耗时的过程。一台开机时间超过一分钟的相机是一台不会在现实世界中得到太多使用的相机。此外,全 Raspbian OS 运行的几乎所有东西对于这款相机来说都没有用。即使我禁用了启动时启动的所有冗余服务,启动仍然需要不合理的时间。我决定我将使用的唯一库存软件是 U-Boot 引导加载程序和 Linux 内核。一个自定义编写的 init 二进制文件从 microSD 卡挂载根文件系统,加载驱动网络摄像头所需的内核模块,填充 /dev,并运行应用程序二进制文件。

应用程序二进制文件是另一个自定义 C 程序,它执行控制相机的核心工作。首先,它等待内核驱动程序初始化网络摄像头,打开它,并通过低级 v4l ioctl 调用对其进行初始化。GPIO 引脚被配置为通过 /dev/mem 访问寄存器来驱动 LED。

完成初始化后,相机进入一个循环。每次迭代都使用默认曝光设置从网络摄像头捕捉单帧 JPEG 格式的图像,将图像直接保存到 SD 卡,然后休眠三秒钟。这个循环永远运行,直到电池被拔下。这很好地实现了最初的目标,即创建一个与典型的模拟针孔相机一样简单的数码相机。

代码 可以在 GPLv3 或任何更高版本下获得。树莓派 Zero 需要 ARMv6 二进制文件,因此我使用 QEMU ARM 模拟器从 x86_64 主机构建它,以运行来自填充了 Pignus 发行版(Fedora 23 为 ARMv6 移植/重建)工具链的 chroot 的编译器。这两个二进制文件都与 glibc 静态链接,因此它们是独立的。我构建了一个自定义 RAMDisk,其中包含二进制文件和一些必需的内核模块,并将其复制到 SD 卡,引导加载程序可以在其中找到它们。

Completed camera

opensource.com

拍照

硬件和软件都完成后,是时候看看这款相机的能力了。每个人都熟悉现代数码相机(无论是专业数码单反相机还是手机)产生的出色图像质量。重要的是在这里将期望重置到一个更现实的水平。高清网络摄像头捕捉 1280x1024 分辨率(约 1 百万像素)。CCD 难以从针孔允许通过的微弱光线中捕捉图像。网络摄像头自动增加增益和曝光时间来补偿,这会导致图像噪点非常多。图像还具有非常窄的动态范围,从压缩的直方图可以看出这一点,必须在后期处理中拉伸直方图才能获得真正的黑色和白色。

最佳效果是通过在白天在室外拍摄图像来实现的,因为大多数室内光线不足以记录任何可用的图像。CCD 的直径只有大约 1 厘米,并且距离针孔只有几毫米远,这会产生相对较窄的视野。例如,在手臂伸直自拍时,人的头部会充满整个画面。最后,图像的焦点非常柔和,这是所有针孔相机的决定性特征。

Picture of houses taken with pinhole webcam

opensource.com

Airport photo

opensource.com

最初,我只是使用相机捕捉少量静止图像。后来,我将循环延迟从三秒减少到一秒,并使用相机在几分钟内捕捉图像序列。我使用 GStreamer 将图像渲染成延时视频。

这是我用这个过程创建的视频

从 Bank 到 Waterloo 沿泰晤士河散步以放松一天工作后的视频。以每分钟 40 帧的速度捕捉 1200 帧,以每秒 20 帧的速度动画化。

User profile image.
Daniel 在 Red Hat 编写开源软件已有 16 年,担任 libvirt 项目的首席架构师,并参与了虚拟化管理堆栈的各个层面。Daniel 还开发了 Entangle 应用程序,用于从 Linux 桌面控制数码单反相机。

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.