曦玄的个人空间 https://blog.eetop.cn/1143350 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

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

已有 7199 次阅读| 2017-9-23 13:09 |个人分类:树莓派|系统分类:嵌入式

天气: 晴朗
心情: 高兴
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、将捕获的流转化成网络流


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 6

    关注
  • 5

    粉丝
  • 16

    好友
  • 0

    获赞
  • 6

    评论
  • 1918

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 07:05 , Processed in 0.022642 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部