1.环境准备
首先安装好要涉及到的python第三方库,并把安装的PyQt5的相关文件路径放到环境变量中去。
pip install python-opencv
pip install PyQt5
pip install PyQt5-tools
pip install threading
pip install PIL
#因为默认的官方源是国外的,如果没有配置源的话尽量使用-i参数来使用国内的源,不然会很慢
#常用国内源:
#阿里云 http://mirrors.aliyun.com/pypi/simple
#豆瓣 http://pypi.douban.com/simple
#清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
#中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple
#中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
#使用方式例如安装python-opencv:
pip install python-opencv -i http://pypi.douban.com/simple
了解如何获取和设置opencv播放属性,熟悉opencv基本属性
#opencv的基本属性可通过以下方式设置或获取:
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#获取属性
cap.get(要获取的属性)
#设置属性
cap.set(要设置的属性,设置的值)
#opencv基本属性如下:
CV_CAP_PROP_POS_MSEC #视频文件的当前位置(以毫秒为单位)或视频捕获时间戳。
CV_CAP_PROP_POS_FRAMES #接下来要解码/捕获的帧的基于0的索引。
CV_CAP_PROP_POS_AVI_RATIO #视频文件的相对位置:0 - 电影的开始,1 - 电影的结尾。
CV_CAP_PROP_FRAME_WIDTH #视频流中帧的宽度。
CV_CAP_PROP_FRAME_HEIGHT #视频流中帧的高度。
CV_CAP_PROP_FPS #帧速率。
CV_CAP_PROP_FOURCC #编解码器的4字符代码。
CV_CAP_PROP_FRAME_COUNT #视频文件中的帧数。
CV_CAP_PROP_FORMAT #返回的Mat对象的格式 retrieve() 。
CV_CAP_PROP_MODE #指示当前捕获模式的特定于后端的值。
CV_CAP_PROP_BRIGHTNESS #图像的亮度(仅适用于相机)。
CV_CAP_PROP_CONTRAST #图像对比度(仅适用于相机)。
CV_CAP_PROP_SATURATION #图像的饱和度(仅适用于相机)。
CV_CAP_PROP_HUE #图像的色调(仅适用于相机)。
CV_CAP_PROP_GAIN #图像的增益(仅适用于相机)。
CV_CAP_PROP_EXPOSURE #曝光(仅适用于相机)。
CV_CAP_PROP_CONVERT_RGB #布尔标志,指示是否应将图像转换为RGB。
CV_CAP_PROP_WHITE_BALANCE_U #白平衡设置的U值(注意:目前仅支持DC1394 v 2.x后端)
CV_CAP_PROP_WHITE_BALANCE_V #白平衡设置的V值(注意:目前仅支持DC1394 v 2.x后端)
CV_CAP_PROP_RECTIFICATION #立体摄像机的整流标志(注意:目前仅支持DC1394 v 2.x后端)
CV_CAP_PROP_ISO_SPEED #摄像机的ISO速度(注意:目前仅支持DC1394 v 2.x后端)
CV_CAP_PROP_BUFFERSIZE #存储在内部缓冲存储器中的帧数(注意:目前仅支持DC1394 v 2.x后端)
2.使用opencv来进行简单的打开摄像头或者播放视频操作
import cv2
cameraCapture = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#第一个参数表示打开的摄像头编号,当要播放本地视频的时候应该填视频路径;
#第二个参数可省略,但是会报警告,这是因为现在的新系统默认设置的是CAP_MSMF导致的
#读取视频或摄像头
success, frame = cameraCapture.read()
while success:
#读取键盘内容
key = cv2.waitKey(1) & 0xff
#当输入p的时候暂停播放,cv2.waitKey()内的参数为0时一直暂停直到输入其他字符;
# 当大于0时表示暂停多久
if key == ord("p"):
cv2.waitKey(0)
#当输入s时结束循环不再播放
if key== ord("s"):
break
#翻转图像,通常摄像头的图像都是反的通过翻转恢复正常,视频播放可以把这个删了
frame=cv2.flip(frame, 1)
#显示图像,第一个参数为CV2窗口标题,第二个为从摄像头或视频中读取到的图像
cv2.imshow('Test camera', frame)
#继续读取视频或摄像头
success, frame = cameraCapture.read()
#关闭窗口
cv2.destroyAllWindows()
#释放摄像头
cameraCapture.release()
3.PyQt5+opencv打开摄像头或播放视频
界面框架先用QTdesigner来把框架拉好,为方便演示,随便拉了个框,然后qt转py,文件名为test.py,放在主文件CAP.py同路径下,代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1277, 836)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(180, 90, 800, 600))
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(40, 110, 93, 28))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(40, 190, 93, 28))
self.pushButton_2.setObjectName("pushButton_2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1277, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "TextLabel"))
self.pushButton.setText(_translate("MainWindow", "start"))
self.pushButton_2.setText(_translate("MainWindow", "stop"))
将opencv获取到的图像在PyQt5的QLable中显示,并用QButton来控制视频的开始和暂停。文件名CAP.py
import cv2
import numpy as numpy
from PIL import *
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from threading import *
from test_ui import Ui_MainWindow
import time
class initvedio(QMainWindow,Ui_MainWindow):
def __init__(self,parent=None):
super(initvedio,self).__init__(parent)
self.setupUi(self)
self.thstop=True #令初始信号值为True表示视频未开始播放
# pix = QPixmap("ui/face_label_1.png")
# self.label.setPixmap(pix) #设置QLabel显示的初始图像
self.label.setScaledContents(True) #设置图像自适应QLabel大小
self.pushButton.clicked.connect(self.start) #按键连接开始播放函数
self.pushButton_2.clicked.connect(self.stop) #按键连接结束播放函数
self.show() #显示界面
def start(self):
'''
开一个线程控制视频开始播放
'''
self.thstop=False #改变信号
th=Thread(target=self.showcamre)
th.start()
def stop(self):
'''
开控制视频结束播放
'''
self.thstop=True #恢复未播放状态
time.sleep(1)
# pix = QPixmap("ui/face_label_1.png")
# self.label.setPixmap(pix)
def SetPic(self,img):
'''
设置QLabel内容
'''
self.label.setPixmap(QPixmap.fromImage(img))
def showcamre(self):
cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)
#设置显示分辨率和FPS
cap.set(cv2.CAP_PROP_FRAME_WIDTH,800)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,600)
cap.set (cv2.CAP_PROP_FPS,20)
#如果摄像头是打开状态则一直播放
while cap.isOpened():
#信号状态为True则结束播放
if self.thstop:
return
ret,frame=cap.read()
if ret==False:
continue
#水平翻转
frame=cv2.flip(frame,1)
#opencv 默认图像格式是rgb qimage要使用BRG,这里进行格式转换,不然会变色
frame=cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
#mat-->qimage
a=QImage(frame.data,frame.shape[1],frame.shape[0],QImage.Format_RGB888)
self.SetPic(a)
if __name__=="__main__":
app=QApplication(sys.argv)
ex=initvedio()
app.exec_()