树莓派之picamera开发3 -- picamera基本方法

上一篇 / 下一篇  2017-09-23 13:09:38 / 天气: 晴朗 / 心情: 高兴 / 个人分类:树莓派

1、捕捉一个流
这个实例是通过capture()方法将捕获的一个图像转成一个以jpeg解码的流(bytes流)
import io
import time
import picamera

# 创建一个流
my_stream = io.BytesIO()
with picamera.PiCamera() as camera:
    camera.start_preview()
    # 摄像头预热
    time.sleep(2)
    camera.capture(my_stream, 'jpeg')
需要注意的是,这不像输出到一个文件,该流捕捉以后会自动关闭脚本,因为在这个实例中没有对流进行其他操作。若对象有flush方法的话,在捕捉完毕后,会调用对象的flush方法,如下:

import time
import picamera

# 打开一个扩展名为jpg的文件
my_file = open('my_image.jpg', 'wb')
with picamera.PiCamera() as camera:
    camera.start_preview()
    time.sleep(2)
    camera.capture(my_file)
# 在此时capture会调用my_file的flush方法,完成流封装。
# 但并未关闭文件,需要调用close进行关闭
my_file.close()

2、捕捉一个图像转化成PIL image对象
首先我们要捕捉一个图像流,然后通过流读取将图像的数据转换成PIL image对象。
import io
import time
import picamera
from PIL import Image

# 创建一个流
stream = io.BytesIO()
with picamera.PiCamera() as camera:
    camera.start_preview()
    time.sleep(2)
    camera.capture(stream, format='jpeg')
# 将指针指向流的开始
stream.seek(0)
image = Image.open(stream)

3、步骤一个图像转化成open cv对象
首先我们捕捉一个图像流,然后将图像数据转换为open cv对象:
import io
import time
import picamera
import cv2
import numpy as np

# 创建一个流
stream = io.BytesIO()
with picamera.PiCamera() as camera:
    camera.start_preview()
    time.sleep(2)
    camera.capture(stream, format='jpeg')
# 从流构建numpy
data = np.fromstring(stream.getvalue(), dtype=np.uint8)
# 通过opencv解码numpy
image = cv2.imdecode(data, 1)
# opencv解码后返回以RGB解码的图像数据
image = image[:, :, ::-1]

如果你不想使用有损JPEG编码,并希望加快这一解码过程的话,可以使用picamera自带的picamera.array模块。可以使用PiRGBArray类简单的捕获’brg’格式的数据。(假定RGB与BGR是分辨率相同的数据,只是具有相反的颜色)
import time
import picamera
import picamera.array
import cv2

with picamera.PiCamera() as camera:
    camera.start_preview()
    time.sleep(2)
    with picamera.array.PiRGBArray(camera) as stream:
        camera.capture(stream, format='bgr')
        # 此时就可以获取到bgr的数据流了
        image = stream.array

4、调整捕捉图像的分辨率
有时,我们需要将图片进行某种分析或处理,你希望尽可能的捕获比较小分辨率的图像,虽然这种分辨率的调整可以交给PIL或者opencv来完成,但是通过picamera可以更搞笑的完成这个操作:
import time
import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (1024, 768)
    camera.start_preview()
    # 摄像头预热
    time.sleep(2)
    camera.capture('foo.jpg', resize=(320, 240))
同时调整分辨率的参数也可以适用于捕获视频的start_recording()方法。

5、在光线较暗的环境下捕获图像
树莓派的摄像头可以在光线比较暗的环境下捕获图像,其主要的实现方式是通过设置捕获属性,给摄像头设置一个比较高的光线增益,以及增加曝光的时间以让摄像头接受尽可能多的光。
通过设置shutter_speed[设置曝光时间]与framerate[帧率]两个参数
首先我们要设置一个比较慢的帧率,然后将曝光时间设置为6s来捕获图像
import picamera
from time import sleep
from fractions import Fraction

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    # 设置帧率为1/6fps,然后将曝光时间设置为6秒
    # 最后将iso参数设置为800
    camera.framerate = Fraction(1, 6)
    camera.shutter_speed = 6000000
    camera.exposure_mode = 'off'
    camera.iso = 800
    # 给摄像头一个比较长的预热时间,让摄像头尽可能的适应周围的光线
    # 你也可以试试开启AWB【自动白平衡】来代替长时间的预热
    sleep(10)
    # 最后捕捉图像,因为我们将曝光时间设置为6秒,所以拍摄的时间比较长
    camera.capture('dark.jpg')

如果在一个光线不是特别暗的地方使用以上实例,则你会得到一个严重曝光以至于可能是全白的图像文件。

因为我们设置了一个比较长的曝光时间,如果这时移动摄像头,那么我们将会得到一个严重图像扭曲的照片。

6、将捕获的流转化成网络流


TAG: picamera pip raspberry

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2017-10-21  
1234567
891011121314
15161718192021
22232425262728
293031    

数据统计

  • 访问量: 420
  • 日志数: 5
  • 建立时间: 2016-03-23
  • 更新时间: 2017-10-12

RSS订阅

Open Toolbar