目录
- 发现
- 分析
- 解决
- 总结
发现
环境
- ubuntu 16.04
- python 2.7 (anaconda 的环境)
- cv 版本 3.4
- 安装方式 pip install opencv-contrib-python
问题
最近在做一个项目,需要使用opencv 打开摄像头,然后录制视频,在默认的参数下,opencv打开摄像头都是非常流畅的,但是在高分辨率下,摄像头使用如下的代码的时候就非常的不流畅,而且很卡,比如如下的代码做演示就非常的卡
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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,尝试在代码中加入
1 2 |
cap.set(cv2.CAP_PROP_FPS, 30) |
将FPS设定在30帧,依然没有效果?难道是opencv的问题,尝试使用google 搜索关键字 opencv python set fps fake
得到答案
1 2 3 4 5 |
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应该是直装版本,没有经过编译的,那知道问题在哪,我们进行尝试
解决
安装依赖项
1 2 |
sudo apt-get install libv4l-dev |
下载opencv 源码
https://codeload.github.com/opencv/opencv/tar.gz/3.4.2 ,本次使用的3.4.2的版本
卸载之前的opencv
1 2 |
pip uninstall opencv-contrib-python |
编译opencv
进入opencv 目录
1 2 3 4 5 6 7 8 9 |
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环境 |
验证
这次使用的是录制视频并输出视频的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
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
博主您好,很欣慰看到您对此问题做出解答。我在使用WIFI传送的摄像头时,cv2.VideoCapture出现了很大的延迟。我使用set时,具体使用方法是 cap.set(cv2.CAP_PROP_BUFFERSIZE, 3),希望可以使缓冲区变小点,这样在保持实时的基础上,掉帧也没关系,但现在set函数也不管用,又用test程序测了cv2.CAP_PROP_FPS,设为25fps,发现确实不管用,所以猜测可能和你遇到的问题一样,但是我是windows系统,重新编译OpenCV库比较麻烦,想问下,你重新编译之前(cv2.CAP_PROP_BUFFERSIZE确实也不管用吗?如果是的话,那确实是这个原因无疑了。
希望可以得到博主的尽快回复,祝您身体健康,天天开开心心!
你好,我之前的安装版本相当于是默认版本的,因为很多参数都没有正常的设置,导致设置fps失效,我猜想很大程度上你自己编译,并且安装相关的依赖可以解决你的问题,我推荐你按照官方的版本把这些东西和依赖都安装一下,然后再试试。
另外,如果opencv你觉得编译麻烦的话,我推荐你使用ffmpeg ,这个也是满方便的工具,参数多而且功能强大
你好博主,我按照你的步骤走到cmake -D WITH_LIBV4L=ON ../ ,然后报错了:
CMake Error: Cannot open file for write: /home/pi/Downloads/opencv-3.4.2/build/CMakeCache.txt.tmp
CMake Error: : System Error: Permission denied
CMake Error: Unable to open cache file for save. /home/pi/Downloads/opencv-3.4.2/build/CMakeCache.txt
CMake Error: : System Error: Permission denied
希望能得到你的帮助,谢谢啦~~
是否为权限问题呢~~
你好,从报错的error来看,就是权限问题导致的,你那边可以尝试使用sudo 结果咋样呢?
博主您好,感谢您的博文,我顺利解决了我所遇到的问题,现在遇到在树莓派上使用OpenCV LBPH人脸识别器时卡顿(视频画面卡,只有在人脸出现时会卡;读入人脸数据trainer.yml时也卡,要好几十秒),希望能得到您的解答。万分感谢!
博主你好,请问下python3.7要怎么操作?因为3.7上已经没用cv2.so了,我尝试了拷贝cv2.cpython-37m-arm-linux-gnueabihf.so到/usr/local/lib/python3.7/dist-packages/cv2/python-3.7下面,但似乎没用,请帮忙解答一下,谢谢!
感谢博主,我找到问题原因了,是要设置一下FPS才能生效,不然就是默认的FPS状态,我这里HDMI采集卡输出默认的是640*480 30帧,当我拉伸到1920*1080之后,帧率降低为5帧,然后重新编译了库,还需要通过cap.set(cv2.CAP_PROP_FPS, 30.0)之后才能生效。
十分感谢!
我c++的,通过修改图片格式可以实现理想帧率的效果
将这个指令 capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
放在设置宽高的后面就可以了