解决使用opencv 高分辨率下的摄像头卡顿不流畅

栏目: 编程工具 · 发布时间: 5年前

内容简介:最近在做一个项目,需要使用opencv 打开摄像头,然后录制视频,在默认的参数下,opencv打开摄像头都是非常流畅的,但是在高分辨率下,摄像头使用如下的代码的时候就非常的不流畅,而且很卡,比如如下的代码做演示就非常的卡在代码中,我设定了视频的分辨率为1080p , 这个时候演示出来的视频画面就非常的卡,是摄像头本身就不支持吗?我看了自己的设备参数 ,标明设备是支持1080p的我打开ubuntu系统的自带camera

目录

  • 发现
  • 分析
  • 解决
  • 总结

发现

环境

  • ubuntu 16.04
  • python 2.7 (anaconda 的环境)
  • cv 版本 3.4
  • 安装方式 pip install opencv-contrib-python

问题

最近在做一个项目,需要使用opencv 打开摄像头,然后录制视频,在默认的参数下,opencv打开摄像头都是非常流畅的,但是在高分辨率下,摄像头使用如下的代码的时候就非常的不流畅,而且很卡,比如如下的代码做演示就非常的卡

import time
 
import numpy as np
import cv2
 
resv = (1920, 1080)
 
 
def show_video():
    cap = cv2.VideoCapture(1)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
 
    # cap.set(cv2.CAP_PROP_BUFFERSIZE,10)
 
    while (True):
        # Capture frame-by-frame
        ret, frame = cap.read()
        # Our operations on the frame come here
        # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
        # Display the resulting frame
        # print(frame.shape)
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
 
    # When everything done, release the capture
    cap.release()
    cv2.destroyAllWindows()
 
 

在代码中,我设定了视频的分辨率为1080p , 这个时候演示出来的视频画面就非常的卡,是摄像头本身就不支持吗?我看了自己的设备参数 ,标明设备是支持1080p的

分析

我打开ubuntu系统的自带camera cheese 工具,不论是录制,还是拍摄,都是1080p无卡顿现象,这就说明本身不是设备的问题,这个时候我在想,是否有参数可以设置FPS,尝试在代码中加入

cap.set(cv2.CAP_PROP_FPS, 30)
 

将FPS设定在30帧,依然没有效果?难道是opencv的问题,尝试使用google 搜索关键字 opencv python set fps fake 得到答案

CV_CAP_PROP_FPS is a NOT a fake. See cap_libv4l.cpp(1) in OpenCV github repo. The key is to make sure, you use libv4l over v4l while configuring OpenCV. For that, before running cmake, install libv4l-dev
 
sudo apt-get install libv4l-dev
Now while configuring OpenCV with cmake, enable option, WITH_LIBV4L. If all goes good, in configuration status, you will see some thing similar to below
 

从答案里面得知,我们需要使用libv4l库,并且,在使用opencv 编译版本的时候,要开启这个feature ,很明显 ,当前我使用的opencv应该是直装版本,没有经过编译的,那知道问题在哪,我们进行尝试

解决

安装依赖项

sudo apt-get install libv4l-dev
 

下载opencv 源码

https://codeload.github.com/opencv/opencv/tar.gz/3.4.2 ,本次使用的3.4.2的版本

卸载之前的opencv

pip uninstall opencv-contrib-python
 

编译opencv

进入opencv 目录

mkdir build
cd build
cmake -D WITH_LIBV4L=ON ../ 
make -j8 
make install 
ldconfig 
 
cp lib/cv2.so /home/bruce/miniconda2/lib/python2.7/site-packages # 注意,这里是当前使用的 python 环境
 

验证

这次使用的是录制视频并输出视频的代码

def simple_video(minutes=5):
    start = int(time.time())
    cap = cv2.VideoCapture(1)
 
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
    cap.set(cv2.CAP_PROP_FPS, 25)
    # cap.set(cv2.CV_CAP_PROP_BUFFERSIZE, 20)
 
    # Define the codec and create VideoWriter objectXVID
    # fourcc = cv2.VideoWriter_fourcc(*'XVID')
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('{}.avi'.format(str(start)), fourcc, 25.0, (1920, 1080))
 
    while (cap.isOpened()):
        step = int(time.time())
 
        ret, frame = cap.read()
        if ret == True:
            frame = cv2.flip(frame, 0)
 
            # img = cv2.resize(frame,(1920,1080))
            # write the flipped frame
            out.write(frame)
            cv2.imshow('frame', frame)
            if (cv2.waitKey(1) & 0xFF == ord('q')) or ((step - start) >= minutes * 60):
                print("enter to the time used")
                break
        else:
            break
 
    # Release everything if job is finished
    cap.release()
    out.release()
    cv2.destroyAllWindows()
 
 
if __name__ == '__main__':
    simple_video(1)
 
 

录制了1分钟的视频,看了一下结果,还不错,非常流畅,成功解决这个问题

总结

这次我们主要从,发现问题,假设问题,搜索问题的几个角度 来成功解决我们在工程上的一些问题,突破点就是验证自己的想法,使用正常的关键字去寻找问题的答案,OK,这次的分享就到这里

参考文档:

在ubunt下安装opencv


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

财富博客

财富博客

Robert Scoble、Shel Israel / 李宛蓉 / 重庆出版社 / 2008 / 38.00元

《财富博客》作者斯考伯(美国最多人阅读的企业博客作者)和谢尔•以色列(资深技术顾问)相信,博客已经开始改变企业的面貌。他们阐释说明了员工博客如何改变外界对微软的观感,敢说敢做的NBA球队老板如何运用博客和球迷连接,小企业和大公司又如何能从博客获益……另外,还有万一使用不当,博客又会招致怎样的灾难。斯考伯和以色列直言不讳,这是卓越博客的基本要件,因此他们在说完博客的好处之后,也以同样诚实的心态讨论博......一起来看看 《财富博客》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具