前几次应用Python+Opencv,对网络摄像头,USB摄像头进行数据采集,根本流程曾经跑通,没什么大问题。最近我的项目中应用了一款120fps/s的USB摄像头,然而调试好代码运行后,问题来了。
遇到的问题
120fps,每次只能读取30多张图片或者最多也在40张以下。基本达不到要求。
开始应用的代码
增加链接形容
# -*- coding: cp936 -*-"""Author:NoamaNelsonDate:2019-11-19Discription:Read Camaro picture and save """import cv2,os,timeimport numpy as npclass CamaroCap(object): """ 关上视频流 """ def __init__(self): self.cap = cv2.VideoCapture(0) """ 图片信息打印 """ def get_image_info(self,image): print(type(image)) print(image.shape) print(image.size) print(image.dtype) pixel_data = np.array(image) print(pixel_data) """ 逐帧读取数据并保留图片到本地制订地位 """ def Camaro_image(self): i = 0 while(True): ret,frame = self.cap.read() #ret:True或者False,代表有没有读取到图片;frame:示意截取到一帧的图片 if ret == False: break self.get_image_info(frame) # print("打印图片信息") 留神:调试的时候能够关上,如果是始终运行程序,倡议把这行代码正文掉,防止影响内存占用 cv2.imshow('capture',frame) # 展现图片 cv2.imwrite(r"D:\image\\"+ str(i) + ".jpg",frame) # 保留图片 i = i + 1 if cv2.waitKey(1) & 0xFF == ord('q'): # breakif __name__ == '__main__': outmasages = CamaroCap() outmasages.Camaro_image() # 调用摄像头 outmasages.cap.release() # 开释对象和销毁窗口 cv2.destroyAllWindows()
问题剖析
- 笔者发现,每次在摄像头的控制软件上调参数,比方分辨率设置800600,然而运行代码后仍然是640480,why?why?
- 该摄像头在640*480分辨率下,反对120fps,笔者在代码中限度了下帧率为60fps,但还是每秒只能获取30多张图片,这又是Why?why?
self.cap.set(cv2.CAP_PROP_FPS, 60)
- 开始求助网络,从网上搜了很多,终于是看到了心愿
- 原来以上问题在于,博主链接
剖析论断
笔者应用的USB相机,同样反对视频编码格局为YUY2/MJPG,然而Opencv默认读取的是YUY2,而笔者在摄像头控制软件上查看了下,YUY2格局的各种分辨率下的帧率最大才40帧,那么这就对了,就晓得为啥始终是30-40张图片了。那么就须要在脚本中批改格局为MJPG,从以上博主的链接中能够看到:
<div class="table-box"><table align="center" border="1" cellpadding="1" cellspacing="1"><thead><tr><th scope="col" style="text-align:center;vertical-align:middle;">参数</th>
<th scope="col" style="text-align:center;vertical-align:middle;">值</th> <th scope="col" style="text-align:center;vertical-align:middle;width:514px;">性能/意义</th> </tr></thead><tbody><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_POS_MSEC</td> <td style="text-align:center;vertical-align:middle;">0</td> <td style="text-align:center;vertical-align:middle;width:514px;">视频文件的以后地位(以毫秒为单位)或视频捕捉工夫戳</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_POS_FRAMES</td> <td style="text-align:center;vertical-align:middle;">1</td> <td style="text-align:center;vertical-align:middle;width:514px;">基于0的索引将被解码/捕捉下一帧</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_POS_AVI_RATIO</td> <td style="text-align:center;vertical-align:middle;">2</td> <td style="text-align:center;vertical-align:middle;width:514px;">视频文件绝对地位:0 - 电影的开始,电影的1 - 完结</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_FRAME_WIDTH</td> <td style="text-align:center;vertical-align:middle;">3</td> <td style="text-align:center;vertical-align:middle;width:514px;">视频里每一帧的宽</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_FRAME_HEIGHT</td> <td style="text-align:center;vertical-align:middle;">4</td> <td style="text-align:center;vertical-align:middle;width:514px;">视频里每一帧的高</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_FPS</td> <td style="text-align:center;vertical-align:middle;">5</td> <td style="text-align:center;vertical-align:middle;width:514px;">视频的帧速</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_FOURCC</td> <td style="text-align:center;vertical-align:middle;">6</td> <td style="text-align:center;vertical-align:middle;width:514px;">4个字符示意的视频编码器格局</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_FRAME_COUNT</td> <td style="text-align:center;vertical-align:middle;">7</td> <td style="text-align:center;vertical-align:middle;width:514px;">视频的帧数</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_FORMAT</td> <td style="text-align:center;vertical-align:middle;">8</td> <td style="text-align:center;vertical-align:middle;width:514px;">byretrieve()返回的Mat对象的格局</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_MODE</td> <td style="text-align:center;vertical-align:middle;">9</td> <td style="text-align:center;vertical-align:middle;width:514px;">批示以后捕捉模式的后端特定值</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_BRIGHTNESS</td> <td style="text-align:center;vertical-align:middle;">10</td> <td style="text-align:center;vertical-align:middle;width:514px;">图像的亮度(仅实用于相机)</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_CONTRAST</td> <td style="text-align:center;vertical-align:middle;">11</td> <td style="text-align:center;vertical-align:middle;width:514px;">图像对比度(仅实用于相机)</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_SATURATION</td> <td style="text-align:center;vertical-align:middle;">12</td> <td style="text-align:center;vertical-align:middle;width:514px;">图像的饱和度(仅实用于相机)</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_HUE</td> <td style="text-align:center;vertical-align:middle;">13</td> <td style="text-align:center;vertical-align:middle;width:514px;">图像的色相(仅实用于相机)</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_GAIN</td> <td style="text-align:center;vertical-align:middle;">14</td> <td style="text-align:center;vertical-align:middle;width:514px;">图像的增益(仅实用于相机)</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_EXPOSURE</td> <td style="text-align:center;vertical-align:middle;">15</td> <td style="text-align:center;vertical-align:middle;width:514px;">曝光(仅实用于相机)</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_CONVERT_RGB</td> <td style="text-align:center;vertical-align:middle;">16</td> <td style="text-align:center;vertical-align:middle;width:514px;">示意图像是否应转换为RGB的布尔标记</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_WHITE_BALANCE</td> <td style="text-align:center;vertical-align:middle;">17</td> <td style="text-align:center;vertical-align:middle;width:514px;">目前不反对</td> </tr><tr><td style="text-align:center;vertical-align:middle;">CV_CAP_PROP_RECTIFICATION</td> <td style="text-align:center;vertical-align:middle;">18</td> <td style="text-align:center;vertical-align:middle;width:514px;">平面摄像机的整流标记(留神:只有以后反对DC1394 v 2.x后端)</td> </tr></tbody></table></div>
- 如果要批改分辨率就必须应用:
CAP_PROP_FRAME_WIDTH 和 CAP_PROP_FRAME_HEIGHT进行设置宽和高
- 要批改格局为MJPG编码必须应用:
CV_CAP_PROP_FOURCC
- 那么就须要在代码中退出:
#self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)#self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)#self.cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
批改后的代码
# -*- coding: cp936 -*-"""Author:zhangboDate:2019-11-07Discription:Read Camaro picture and save """import cv2,os,time,datetimeimport numpy as npclass CamaroCap(object): """ 关上视频流 """ def __init__(self): self.cap = cv2.VideoCapture(0) #self.cap.set(cv2.CAP_PROP_FPS, 120) 这个有时候失效,有时候不失效不晓得是什么起因 self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600) self.cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) """ 图片信息打印 """ def get_image_info(self,image): print(type(image)) print(image.shape) print(image.size) print(image.dtype) pixel_data = np.array(image) print(pixel_data) """ 逐帧读取数据并保留图片到本地制订地位 """ def Camaro_image(self): i = 0 while(True): ret,frame = self.cap.read() #ret:True或者False,代表有没有读取到图片;frame:示意截取到一帧的图片 if ret == False: break #self.get_image_info(frame) # print("打印图片信息") 留神:调试的时候能够关上,如果是始终运行程序,倡议把这行代码正文掉,防止影响内存占用 cv2.imshow('capture',frame) # 展现图片 mtime = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S') print(mtime) cv2.imwrite(r"D:\image\\" + str(i) + str("-") + mtime + ".jpg",frame) # 保留图片 i = i + 1 if cv2.waitKey(1) & 0xFF == ord('q'): break if __name__ == '__main__': outmasages = CamaroCap() outmasages.Camaro_image() # 调用摄像头 outmasages.cap.release() # 开释对象和销毁窗口 cv2.destroyAllWindows()