这是加载pyqt gui表单的主要代码,它有2个按钮,用于
启动网络摄像头,第二个用于从帧中捕获照片。
我写了第一个按钮,但我不能写捕获按钮。
import sys
import cv2
import numpy as np
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QImage,QPixmap
from PyQt5.QtWidgets import QApplication , QDialog
from PyQt5.uic import loadUi
img_counter = 0
class video (QDialog):
def __init__(self):
super(video, self).__init__()
loadUi('video.ui',self)
self.image=None
self.startButton.clicked.connect(self.start_webcam)
self.capture.clicked.connect(self.keyPressEvent)
def start_webcam(self):
self.capture =cv2.VideoCapture(0)
self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
self.capture.set(cv2.CAP_PROP_FRAME_WIDTH,640)
self.timer=QTimer(self)
self.timer.timeout.connect(self.update_frame)
self.timer.start(5)
def update_frame(self):
ret,self.image=self.capture.read()
self.image=cv2.flip(self.image,1)
self.displayImage(self.image,1)
def keyPressEvent(self):
flag, frame= self.capture.read()
path = 'J:\Face'
cv2.imwrite(os.path.join(path,'wakka.jpg'), frame)
def displayImage(self,img,window=1):
qformat=QImage.Format_Indexed8
if len(img.shape)==3 :
if img.shape[2]==4:
qformat=QImage.Format_RGBA8888
else:
qformat=QImage.Format_RGB888
outImage=QImage(img,img.shape[1],img.shape[0],img.strides[0],qformat)
outImage=outImage.rgbSwapped()
if window==1:
self.imgLabel.setPixmap(QPixmap.fromImage(outImage))
self.imgLabel.setScaledContents(True)
if __name__=='__main__':
app=QApplication(sys.argv)
window=video()
window.setWindowTitle('main code')
window.show()
sys.exit(app.exec_())
我想从相框中捕获照片并将其保存在文件夹中。
[self.capture.clicked.connect(self.keyPressEvent)用于单击按钮时。
我应该在keyPressEvent def中编写函数
用于单击按钮的捕获。
有人可以帮我解决这个问题吗?
编辑说明:
if flag:
QtWidgets.QApplication.beep(i)
img_name = "opencv_frame_{}.png".format()
cv2.imwrite(os.path.join(path,img_name), frame)
我想要循环的条件,以便我可以用计数器保存img_name格式,但计数器必须是单击次数
keyPressEvent是一种方法,它使您可以在小部件具有焦点的情况下捕获键,并且在您的情况下没有必要,解决方案是简单地更改其名称,另一方面,我改进了您的代码。
import os
import cv2
import numpy as np
from PyQt5 import QtCore, QtGui, QtWidgets, uic
class video (QtWidgets.QDialog):
def __init__(self):
super(video, self).__init__()
uic.loadUi('video.ui',self)
self.startButton.clicked.connect(self.start_webcam)
self.capture.clicked.connect(self.capture_image)
self.imgLabel.setScaledContents(True)
self.capture = None
self.timer = QtCore.QTimer(self, interval=5)
self.timer.timeout.connect(self.update_frame)
self._image_counter = 0
@QtCore.pyqtSlot()
def start_webcam(self):
if self.capture is None:
self.capture =cv2.VideoCapture(0)
self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
self.timer.start()
@QtCore.pyqtSlot()
def update_frame(self):
ret, image=self.capture.read()
simage = cv2.flip(image, 1)
self.displayImage(image, True)
@QtCore.pyqtSlot()
def capture_image(self):
flag, frame= self.capture.read()
path = r'J:\Face'
if flag:
QtWidgets.QApplication.beep()
name = "opencv_frame_{}.png".format(self._image_counter)
cv2.imwrite(os.path.join(path, name), frame)
self._image_counter += 1
def displayImage(self, img, window=True):
qformat = QtGui.QImage.Format_Indexed8
if len(img.shape)==3 :
if img.shape[2]==4:
qformat = QtGui.QImage.Format_RGBA8888
else:
qformat = QtGui.QImage.Format_RGB888
outImage = QtGui.QImage(img, img.shape[1], img.shape[0], img.strides[0], qformat)
outImage = outImage.rgbSwapped()
if window:
self.imgLabel.setPixmap(QtGui.QPixmap.fromImage(outImage))
if __name__=='__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = video()
window.setWindowTitle('main code')
window.show()
sys.exit(app.exec_())