Python 使用PyQt捕获网络摄像头视频
给定以下PyQt代码,我可以完美地捕获网络摄像头的流式视频 现在,我想修改代码,因此添加了一个名为“捕获”按钮的按钮,一旦按下该按钮,将捕获流式视频并保存图像。我该怎么做 获取的小图像将用于查询对象识别服务器Python 使用PyQt捕获网络摄像头视频,python,qt,opencv,pyqt,webcam-capture,Python,Qt,Opencv,Pyqt,Webcam Capture,给定以下PyQt代码,我可以完美地捕获网络摄像头的流式视频 现在,我想修改代码,因此添加了一个名为“捕获”按钮的按钮,一旦按下该按钮,将捕获流式视频并保存图像。我该怎么做 获取的小图像将用于查询对象识别服务器 import sys from PyQt4 import QtGui, QtCore import cv2 class QtCapture(QtGui.QWidget): def __init__(self, *args): super(QtGui.QWidget
import sys
from PyQt4 import QtGui, QtCore
import cv2
class QtCapture(QtGui.QWidget):
def __init__(self, *args):
super(QtGui.QWidget, self).__init__()
self.fps = 24
self.cap = cv2.VideoCapture(*args)
self.video_frame = QtGui.QLabel()
lay = QtGui.QVBoxLayout()
lay.setMargin(0)
lay.addWidget(self.video_frame)
self.setLayout(lay)
def setFPS(self, fps):
self.fps = fps
def nextFrameSlot(self):
ret, frame = self.cap.read()
# My webcam yields frames in BGR format
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = QtGui.QImage(frame, frame.shape[1], frame.shape[0], QtGui.QImage.Format_RGB888)
pix = QtGui.QPixmap.fromImage(img)
self.video_frame.setPixmap(pix)
def start(self):
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.nextFrameSlot)
self.timer.start(1000./self.fps)
def stop(self):
self.timer.stop()
def deleteLater(self):
self.cap.release()
super(QtGui.QWidget, self).deleteLater()
class ControlWindow(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.capture = None
self.start_button = QtGui.QPushButton('Start')
self.start_button.clicked.connect(self.startCapture)
self.quit_button = QtGui.QPushButton('End')
self.quit_button.clicked.connect(self.endCapture)
self.end_button = QtGui.QPushButton('Stop')
vbox = QtGui.QVBoxLayout(self)
vbox.addWidget(self.start_button)
vbox.addWidget(self.end_button)
vbox.addWidget(self.quit_button)
self.setLayout(vbox)
self.setWindowTitle('Control Panel')
self.setGeometry(100,100,200,200)
self.show()
def startCapture(self):
if not self.capture:
self.capture = QtCapture(0)
self.end_button.clicked.connect(self.capture.stop)
# self.capture.setFPS(1)
self.capture.setParent(self)
self.capture.setWindowFlags(QtCore.Qt.Tool)
self.capture.start()
self.capture.show()
def endCapture(self):
self.capture.deleteLater()
self.capture = None
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = ControlWindow()
sys.exit(app.exec_())
我添加了“Capture”按钮,并在QtCapture
类的nextFrameSlot()
方法中放置了一个开关。希望它能像你期望的那样工作
import sys
from PyQt4 import QtGui, QtCore
import cv2
class QtCapture(QtGui.QWidget):
def __init__(self, *args):
super(QtGui.QWidget, self).__init__()
self.fps = 24
self.cap = cv2.VideoCapture(*args)
self.video_frame = QtGui.QLabel()
lay = QtGui.QVBoxLayout()
lay.setMargin(0)
lay.addWidget(self.video_frame)
self.setLayout(lay)
# ------ Modification ------ #
self.isCapturing = False
self.ith_frame = 1
# ------ Modification ------ #
def setFPS(self, fps):
self.fps = fps
def nextFrameSlot(self):
ret, frame = self.cap.read()
# ------ Modification ------ #
# Save images if isCapturing
if self.isCapturing:
cv2.imwrite('img_%05d.jpg'%self.ith_frame, frame)
self.ith_frame += 1
# ------ Modification ------ #
# My webcam yields frames in BGR format
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
img = QtGui.QImage(frame, frame.shape[1], frame.shape[0], QtGui.QImage.Format_RGB888)
pix = QtGui.QPixmap.fromImage(img)
self.video_frame.setPixmap(pix)
def start(self):
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.nextFrameSlot)
self.timer.start(1000./self.fps)
def stop(self):
self.timer.stop()
# ------ Modification ------ #
def capture(self):
if not self.isCapturing:
self.isCapturing = True
else:
self.isCapturing = False
# ------ Modification ------ #
def deleteLater(self):
self.cap.release()
super(QtGui.QWidget, self).deleteLater()
class ControlWindow(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.capture = None
self.start_button = QtGui.QPushButton('Start')
self.start_button.clicked.connect(self.startCapture)
self.quit_button = QtGui.QPushButton('End')
self.quit_button.clicked.connect(self.endCapture)
self.end_button = QtGui.QPushButton('Stop')
# ------ Modification ------ #
self.capture_button = QtGui.QPushButton('Capture')
self.capture_button.clicked.connect(self.saveCapture)
# ------ Modification ------ #
vbox = QtGui.QVBoxLayout(self)
vbox.addWidget(self.start_button)
vbox.addWidget(self.end_button)
vbox.addWidget(self.quit_button)
# ------ Modification ------ #
vbox.addWidget(self.capture_button)
# ------ Modification ------ #
self.setLayout(vbox)
self.setWindowTitle('Control Panel')
self.setGeometry(100,100,200,200)
self.show()
def startCapture(self):
if not self.capture:
self.capture = QtCapture(0)
self.end_button.clicked.connect(self.capture.stop)
# self.capture.setFPS(1)
self.capture.setParent(self)
self.capture.setWindowFlags(QtCore.Qt.Tool)
self.capture.start()
self.capture.show()
def endCapture(self):
self.capture.deleteLater()
self.capture = None
# ------ Modification ------ #
def saveCapture(self):
if self.capture:
self.capture.capture()
# ------ Modification ------ #
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = ControlWindow()
sys.exit(app.exec_())
我还需要将流式视频保存为单独的帧图像文件。我可以添加这个
qPixmap=pix.save('image.jpg')
。然而,这只保存在图像上,而不是图像序列。我不完全理解您试图实现的目标。正如您所说,pix.save('image.jpg')
保存图像,多次这样做,可以保存多个图像。你希望“图像序列”是什么格式?我一直试图永远理解为什么我的程序不工作,我没有计时器,我的程序严重滞后,非常感谢。