DIY照相机

正如前面所提到的,我们可以通过guvcview截取摄像头的视频流并保存为一张图片,那么是否有可能做成一个简易的照相机呢?当然可以,而且非常简单!接下来就介绍如何DIY。

准备

  • 硬件

    • OpenCV computer vision kit
  • 软件

    • 预装了OpenCV的Ubuntu 14.04

步骤

1. 连接

为了使设计简单,我直接用一根杜邦线将GPIO0和GND端口相连。插入或者拔出来模拟一个按键的按下或者释放。

注意: 你需要了解如下的端口状态。

连接 状态 逻辑
拔出杜邦线,GPIO0空载 高电平 1
连接GND端口 低电平 0

2. 运行

$ git clone https://github.com/pcduino/pcduino8-uno-guide
$ cd pcduino8-uno-guide/demo/1.CameraDIY/
$ python camera.py

注意:如果使用了预案装OpenCV的系统镜像,可以在家目录下看到一个demo文件夹,该目录存放了相应的示例代码。

  • 打开的窗口实时显示视频流。
  • 把杜邦线从GND端口拔出,再重新插入。
  • 照片会保存在当前的目录下。
  • 查看图片。
    $ gpicview
    

3. 查看源码


import argparse
import datetime
import time
import cv2
import gpio

btn_pin = "gpio0"
gpio.pinMode(btn_pin, gpio.INPUT)
camera = cv2.VideoCapture(0)
time.sleep(0.25)

while True:
    #read the button status
    current_st = gpio.digitalRead(btn_pin)
    (grabbed, frame) = camera.read()

    if not grabbed:
        break

    cv2.putText(frame, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"),
        (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)

    cv2.imshow("video",frame)
    next_st = gpio.digitalRead(btn_pin)

    #check the button status has been changed
    # if yes, save as a image to local
    if current_st ^ next_st :
        name = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
        cv2.imwrite(name+".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY),100])

    key = cv2.waitKey(1)
    if key == ord("q"):
        break

camera.release()
cv2.destroyAllWindows()