前几次应用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()