使用树莓派的摄像头,将树莓派自身提供的picamera的API数据转换为Python Oencv可用图像数据:

  1. # import the necessary packages
  2. from picamera.array import PiRGBArray
  3. from picamera import PiCamera
  4. import time
  5. import cv2
  6. # initialize the camera and grab a reference to the raw camera capture
  7. camera = PiCamera()
  8. camera.resolution = (640, 480)
  9. camera.framerate = 32
  10. camera.hflip = True
  11. camera.vflip = True
  12. rawCapture = PiRGBArray(camera, size=(640, 480))
  13. # allow the camera to warmup
  14. time.sleep(0.1)
  15. # capture frames from the camera
  16. for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
  17. # grab the raw NumPy array representing the image, then initialize the timestamp
  18. # and occupied/unoccupied text
  19. image = frame.array
  20. # show the frame
  21. cv2.imshow("Frame", image)
  22. key = cv2.waitKey(1) & 0xFF
  23. # clear the stream in preparation for the next frame
  24. rawCapture.truncate(0)
  25. # if the `q` key was pressed, break from the loop
  26. if key == ord("q"):
  27. break

这里简单的讲一下picamera对象的相关内容:

1、首先使用picamera模块当中的PiCamera方法创建返回一个camera的对象:

  1. camera = PiCamera()

2、初始化camera对象当中的相关参数(可设置也可以读取):

  1. camera.saturation = 80 # 设置图像视频的饱和度
  2. camera.brightness = 50 # 设置图像的亮度(50表示白平衡的状态)
  3. camera.shutter_speed = 6000000 # 相机快门速度
  4. camera.iso = 800 # ISO标准实际上就是来自胶片工业的标准称谓,ISO是衡量胶片对光线敏感程度的标准。如50 ISO, 64 ISO, 100 ISO表示在曝光感应速度上要比高数值的来得慢,高数值ISO是指超过200以上的标准,如200 ISO, 400 ISO
  5. camera.sharpness = 0 #设置图像的锐度值,默认是0,取值范围是-100~100之间
  6. camera.framrate = 32 #这里可能用的Fraction是一个分数模块来存储分数1/6,保证分数运算的精度(记得调用模块:from fractions import Fraction)
  7. camera.hflip = Ture # 是否进行水平翻转
  8. camera.vflip = False #是否进行垂直翻转
  9. camera.rotation = 0 #是否对图像进行旋转
  10. camera.resolution = (280,160) #设置图像的width和height
  11. a_gain = camera.analog_gain #这个值表示摄像头传感器件到数字装换之前的模拟信号的增益,格式是Fraction的格式 一般似乎也用不上
  12. d_gain = camera.digital_gain #这个值表示摄像头的数字增益大小 一般似乎也用不上
  13. camera.led = False #值为False那么led为关灯的状态,True为开灯的状态

注:camera.led这个参数在Raspberry 3代上已经不能使用了!原因是说已经将摄像头led的控制GPIO重定向到了外部扩展接口上......所以你修改/boot/config.txt文件的内容也是没用的,当然对于pi3这一代树莓派修改这个文件也是无济于事。无奈啊~

ISO参数介绍:

感光度,英文名称为 International Organization for Standardization (ISO),说到相机中的ISO参数不得不提一下胶片速度(Film Speed)。胶片速度是感光胶片对光敏感度的度量。相对而言灵敏度差的胶片,对应一个低速的索引值,这样就会需要对光进行更长的曝光来达到高灵敏胶片的效果,因此称之为低速胶片,高灵敏的胶片称之为高速胶片,设置的范围ISO100到ISO28000。

ISO调节的实验结果(测试条件:Frame_Rate=32 快门速度shutter_speed=6000000 饱和度saturation = 100 图像亮度brightness = 50)

Shutter参数介绍:

快门,英文名称为Shutter,快门是相机上控制感光片有效曝光时间的一种装置。快门的工作原理是这样的,为了保护相机内的感光器件,不至于曝光,快门总是关闭的;拍摄时,调整好快门速度后,只要按住照相机的快门释放钮(也就是拍照的按钮),在快门开启与闭合的间隙间,让通过摄影镜头的光线,使照相机内的感光片获得正确的曝光,光穿过快门进入感光器件,写入记忆卡。快门速度一般的表示方法是1/100s、1/30s、2s。

Shutter调节的实验结果(测试条件:Frame_Rate=32 ISO感光度=800 饱和度saturation = 100图像亮度brightness = 50)

Saturation参数介绍:

所谓的饱和度,指的其实是色彩的纯度,纯度越高,表现越鲜明,纯度较低,表现则较黯淡,色饱和度表示光线的彩色深浅度或鲜艳度,取决于彩色中的白色光含量,白光含量越高,即彩色光含量就越低,色彩饱和度即越低,反之亦然。saturation的取值范围是 0-100之间。

Saturation调节的实验结果(测试条件:Frame_Rate=32 快门速度shutter_speed=6000000 ISO感光度=800 图像亮度brightness = 50)

Brightness亮度参数介绍:

色彩亮度(“Color Brightness”)的新标准将用来测量色彩的光输出情况,评价摄像机的色彩表现,用户可根据此标准的规格来更好地了解产品性能。 设置的范围是0-100之间,50表示的是白平衡状态。

Brightness调节的实验结果(测试条件:Frame_Rate=32 快门速度shutter_speed=6000000 ISO感光度=800 饱和度saturation = 100)

Sharpness锐度参数介绍:

Sharpness决定了图像对细节的表达程度,图像的锐度越高表示图像对物体的边缘和细节的描述越好,从下面的测试结果却是能够看到细节的相关变化却是比较明显。

Sharpness调节的实验结果(测试条件:Frame_Rate=32 ISO感光度=800 饱和度saturation = 0 图像亮度brightness = 50)

光圈参数介绍:(树莓派相机的参数中似乎光圈的大小是固定的,不可以调节,这里列出来记录,方便后面的使用和理解)

光圈英文名称为Aperture,光圈是一个用来控制光线透过镜头,进入机身内感光面的光量的装置,它通常是在镜头内,光在通过镜头某个位置的多片金属叶片(收拢之后)则能在镜头上就控制光线进入的量。我们平时所说的光圈值 F2.8、F8、F16等是光圈“系数”,是相对光圈,并非光圈的物理孔径,与光圈的物理孔径及镜头到感光器件(胶片或CCD或CMOS)的距离有关。

简单相机的结构图:

相关参数的设置技巧:

1、ISO感光度的设置技巧

  • 一般白天光线充足的情况ISO是100到200。
  • 在黑暗的条件下(如下雨天),ISO调到300-400,比较暗调到800,灯光非常暗(太阳下山后),调到1000以上,拍夜景(如夜间庆典、演唱会)调到1600以上。
  • ISO调到越高,拍出来的照片噪点就越多,所以ISO不是越高越好,只是在光线不足的情况下使用,并且尽可能调低ISO数值。

2、快门速度的设置技巧

  • 一般情况下,正常快门速度是在60分之一秒到80分之一秒。
  • 拍摄行人、阴天或者日落时候的运动对象快门速度1/125秒。
  • 拍摄高速运动的物体或画面,快门速度360/1秒~600/1秒,如拍打篮球的画面。
  • 拍摄下落的水滴需要1/1000秒。
  • 拍绸缎感的流水,或者夜景汽车灯河用慢速快门。
  • 拍运动定格用快速快门。
  • 室外光线条件好,则快门可以较快,光线暗则要放慢快门速度。
  • 快门数一般是没用常用的,你要是想设置为默认快门,那么就是用A档或是自动挡吧!只有这两个档位是默认快门数。像S档和M档都是可以设置快门速度的。

3、使用camera对象当中的相关函数API:

图像拍照+实时视频

  1. camera.capture('test.jpg', use_video_port = False) # 拍摄一张图片,图片的名称为test.jpg use_video_port用来指定是通过视频接口来使用还是普通的接口,详解如下
  2. camera.capture_continuous(rawCapture, format="bgr", use_video_port=True) # 连续的拍摄一组视频帧,将每一帧都存储在rawCapture这个变量当中,存储的格式是bgr的格式,使用了摄像头的接口

capture(outputformat=Noneuse_video_port=Falseresize=Nonesplitter_port=0bayer=False**options)  从摄像头中获得一张图像,将这张图像存储在output当中.

capture_continuous(outputformat=Noneuse_video_port=Falseresize=Nonesplitter_port=0burst=Falsebayer=False**options) 从摄像头上获取连续的视频流,相关的参数和上面的函数相似

参数output是一个用来保存图像数据的区域:

  • output为字符串string的时候,表示将得到的数据写入到文件名是string文件当中
  • output是一个可以写入的对象时,就相当于将图像的数据追加append到对象的后面
  • output也可以是一个具有buffer protocal数据类型的数据(要保证足够大的写入空间来保存图像)

参数format是表示文件的类型,主要有下面的文件类型:

  • 'jpeg' - Write a JPEG file
  • 'png' - Write a PNG file
  • 'gif' - Write a GIF file
  • 'bmp' - Write a Windows bitmap file
  • 'yuv' - Write the raw image data to a file in YUV420 format
  • 'rgb' - Write the raw image data to a file in 24-bit RGB format
  • 'bgr' - Write the raw image data to a file in 24-bit BGR format

参数use_video_port用来表示获取图像的端口:

  • True 表示从视频端口获取图像,这个时候为了保证视频的帧速,画质就会降低
  • False 表示从标准的端口获取图像,图像的质量较高,获取的时间较长

下面是Camera拍照的结果对比(注意,这里的相机参数我都没有设置全是默认的参数):

conclusion:  这里我们明显能够看到,当use_video_port的参数为True和False的图像参数质量的不同之处,所以说在拍照的时候就要记得采用False参数!

视频录像

  1. camera.start_recording('Video.mjpeg',format = 'mjpeg') # 开始进行录制视频的参数设置,param1是录制视频的文件名 param2是设置录制文件的格式 param3是录制视频的尺寸大小,详细如下解释
  2. camera.wait_recording(20) # 启动开始录制,等待总共录制的时间为20s 主要单位是s秒
  3. camera.stop_recording() # 停止视频的录制功能

实验录制结果如下:

 不过看起来效果似乎变暗了,不知道是不是灯光的问题。。。

上面的测试文件为Test_Camera.py 具体的代码我上传到了我博客的文件空间中,大家可以下载使用(总共有三个Section,每调用一个Section的时候去掉注释即可)。

备注:使用摄像头的过程中如果遇到如下的错误说明已经有进程调用了Raspberry的摄像头了,硬件已经被占用,所以不能启动摄像头。

这个时候你只需要关闭对应调用摄像头的进程,释放摄像头的资源就可以继续使用了。

                                               完~

Raspiberry Camera详解+picamera库+Opencv控制的更多相关文章

  1. Raspberry Camera详解+picamera库+Opencv控制

    使用树莓派的摄像头,将树莓派自身提供的picamera的API数据转换为Python Oencv可用图像数据: # import the necessary packages from picamer ...

  2. Python正则表达式详解——re库

    一.简介 1.1.相关链接 官方文档: Python2:https://docs.python.org/2/library/re.html Python3:https://docs.python.or ...

  3. 【python】详解numpy库与pandas库axis=0,axis= 1轴的用法

    对数据进行操作时,经常需要在横轴方向或者数轴方向对数据进行操作,这时需要设定参数axis的值: axis = 0 代表对横轴操作,也就是第0轴: axis = 1 代表对纵轴操作,也就是第1轴: nu ...

  4. 详解树莓派Model B+控制蜂鸣器演奏乐曲

    步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...

  5. (四)、 nodejs中Async详解之一:流程控制

    为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种 ...

  6. Async详解之一:流程控制

    为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种 ...

  7. Android 自带 camera 详解

    在本文中 需要考虑的问题 概述 Manifest声明 使用内置的摄像头应用程序 捕获图像的intent 捕获视频的intent 接收摄像头intent的结果 创建摄像头应用程序 检测摄像头硬件 访问摄 ...

  8. nodejs中Async详解之一:流程控制

    为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种 ...

  9. 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)

    一.boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源.关于RAII的讨论可以参考前面的文章.在使 ...

随机推荐

  1. Java温故而知新-空心菱形

    空心菱形 今天做题练手,题目是空心菱形,一开始没什么思路,去网上找了找,发现很难找到讲的通透的,自己现在独立做出来了,记录一下,以备后用. * * * * * * * * * * * * * * * ...

  2. JSP慕课网之Session

    会话保存在服务器的内存里. sessionId可以通过进入http://localhost:8888/进入Tomcat的Manager App进行查看,点击项目的sessions可以看到session ...

  3. web安全普及:通俗易懂,如何让网站变得更安全?以实例来讲述网站入侵原理及防护。

    本篇以我自己的网站[http://www.1996v.com]为例来通俗易懂的讲述如何防止网站被入侵,如何让网站更安全. 要想足够安全,首先得知道其中的道理. 本文例子通俗易懂,从"破解网站 ...

  4. MySQL(一)之MySQL简介与安装

    大家可能都在用MySQL,其实我也是在用MySQL的,但是你知道吗?大部分人都是在windows中使用,这里将介绍一下在windows中的安装分为安装包安装与MSI包安装,以及在linux中的在线安装 ...

  5. java并发之原子性

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp17 1.原子性操作: 不能被线程调度机制中断的操作:--对原子性变量的赋值 ...

  6. poj 3177-3352边双联通

    买一送一啊  3177和3352的区别在于3177数据有重边!但是我先做3177的  那么就直接ctrl+c+v搞3352了~. 题意:给一个无向图,要令每个点之间至少有两条不重合的路,需要至少加多少 ...

  7. NHibernate教程(12)--延迟加载

    本节内容 引入 延迟加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过前面文章的分析,我们知道了如何使用NHibernate,比如CRUD操作.事务.一对多.多对多映射等问题,这 ...

  8. grep&正则表达式

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  9. kickstart部署及使用

    Linux运维:kickstart : 矮哥linux运维群:93324526 1.环境检查 [root@m01 ~]# cat /etc/redhat-release CentOS release ...

  10. 自制VTP实验总结

    (packet tracer模拟器) 6.1)实验拓扑 //绿色:通:橙色:不通 //sw0是根桥:全通 Pc0:ip 192.168.1.1 Pc1: ip 192.168.1.2 Pc2:ip 1 ...