| ||
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()
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)
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
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()方法。
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、将捕获的流转化成网络流因为我们设置了一个比较长的曝光时间,如果这时移动摄像头,那么我们将会得到一个严重图像扭曲的照片。