Python 如何使用opencv拍照并同时可视化网络摄像头

Python 如何使用opencv拍照并同时可视化网络摄像头,python,python-3.x,opencv,Python,Python 3.x,Opencv,在下面的代码中,我在QLabel中显示了pc的网络摄像头。 但是,当尝试使用self.boton1按钮拍照时,他不会拍照。 Self.boton1连接到def-take()功能,这是我用来拍照的功能 但它不起作用我希望你能帮助我: 尝试将self.boton1.clicked.connect(self.take(self.capture))放在setup\u camera()函数中,将捕获的数据作为参数传递给take()函数。捕获但它不起作用 from PyQt5.QtWidgets impor

在下面的代码中,我在
QLabel
中显示了pc的网络摄像头。 但是,当尝试使用
self.boton1
按钮拍照时,他不会拍照。
Self.boton1
连接到
def-take()
功能,这是我用来拍照的功能

但它不起作用我希望你能帮助我:

尝试将
self.boton1.clicked.connect(self.take(self.capture))
放在
setup\u camera()
函数中,将捕获的数据作为参数传递给
take()
函数。捕获但它不起作用

from PyQt5.QtWidgets import QMainWindow,QApplication
import cv2
from PyQt5 import QtCore
import numpy as np
from PyQt5 import QtGui
from PyQt5 import uic


class Main(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        uic.loadUi("f.ui",self)

        self.boton1.clicked.connect(self.take)
        self.video_size = QtCore.QSize(320,240)
        self.setup_camera()


        uic.loadUi("f.ui",self)
    def setup_camera(self):
        self.capture = cv2.VideoCapture(0)
        self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 160)
        self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT,self.video_size.height())
        #self.Bfoto.clicked.connect(lambda:self.take(self.capture))

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.display_video_stream)
        self.timer.start(30)

    def display_video_stream(self):
        _,frame  =self.capture.read()
        frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
        frame = cv2.flip(frame,1)
        image = QtGui.QImage(frame,frame.shape[1],frame.shape[0],frame.strides[0],QtGui.QImage.Format_RGB888)
        self.label.setPixmap(QtGui.QPixmap.fromImage(image))

    def take(self):
        print("value")
        cap = videoCapture(0)
        leido,frame = cap.read()

        if leido ==True:
            cv2.imwrite("photo.png",frame)
            print("ok")
        else:
            print("error")
        cap.release()
app = QApplication([])
m = Main()
m.show()
app.exec_()
f、 用户界面


主窗口
0
0
671
519
主窗口
530
400
75
23
福托
100
30
481
311
文本标签
0
0
671
21
我希望通过按下
self.boton
按钮,可以触发
def take()
功能并拍照

问题

python代码主要有两个问题。 1.您在init()块中加载了两次f.ui

因此,在第二个uic.loadUi()中,上一次的初始化被清除,这就是为什么按钮单击事件不起作用的原因

二,

在此块中,您可以使用上一个self.capture对象,这样您就可以只处理一个对象,这使它变得简单。由于该对象只应在退出该程序时释放,因此不需要在此处使用cap.release()

解决方案

  • 从代码中删除第二行uic.loadui()

    def初始化(自身): QMainWindow.init(自) uic.loadUi(“f.ui”,self)

  • take()块应该是这样的

    打印(“值”) cap=自我捕获 leido,frame=cap.read()

  • 问题

    python代码主要有两个问题。 1.您在init()块中加载了两次f.ui

    因此,在第二个uic.loadUi()中,上一次的初始化被清除,这就是为什么按钮单击事件不起作用的原因

    二,

    在此块中,您可以使用上一个self.capture对象,这样您就可以只处理一个对象,这使它变得简单。由于该对象只应在退出该程序时释放,因此不需要在此处使用cap.release()

    解决方案

  • 从代码中删除第二行uic.loadui()

    def初始化(自身): QMainWindow.init(自) uic.loadUi(“f.ui”,self)

  • take()块应该是这样的

    打印(“值”) cap=自我捕获 leido,frame=cap.read()


  • 米特拉。新错误:
    文件“C:\Users\Angel\Desktop\s.py”,第30行,在display\u video\u stream frame=cv2.cvtColor(frame,cv2.COLOR\u BGR2RGB)cv2.error:OpenCV(4.0.0)C:\projects\OpenCV python\OpenCV\modules\imgproc\src\COLOR.cpp:181:错误:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
    @kousikMiltra新错误:
    C:\projects\opencv python\opencv\modules\imgproc\src\color.cpp:181:错误:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
    您使用的是哪个版本的opencv?你能把“显示视频流”的代码块发给我吗?米特拉。新错误:
    文件“C:\Users\Angel\Desktop\s.py”,第30行,在display\u video\u stream frame=cv2.cvtColor(frame,cv2.COLOR\u BGR2RGB)cv2.error:OpenCV(4.0.0)C:\projects\OpenCV python\OpenCV\modules\imgproc\src\COLOR.cpp:181:错误:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
    @kousikMiltra新错误:
    C:\projects\opencv python\opencv\modules\imgproc\src\color.cpp:181:错误:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
    您使用的是哪个版本的opencv?你能把“显示视频流”的代码块发给我吗?
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>671</width>
        <height>519</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <widget class="QPushButton" name="boton1">
        <property name="geometry">
         <rect>
          <x>530</x>
          <y>400</y>
          <width>75</width>
          <height>23</height>
         </rect>
        </property>
        <property name="text">
         <string>foto</string>
        </property>
       </widget>
       <widget class="QLabel" name="label">
        <property name="geometry">
         <rect>
          <x>100</x>
          <y>30</y>
          <width>481</width>
          <height>311</height>
         </rect>
        </property>
        <property name="text">
         <string>TextLabel</string>
        </property>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menubar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>671</width>
         <height>21</height>
        </rect>
       </property>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
     </widget>
     <resources/>
     <connections/>
    </ui>
    
    def __init__(self):
        QMainWindow.__init__(self)
        uic.loadUi("f.ui",self)
    
        self.boton1.clicked.connect(self.take)
        self.video_size = QtCore.QSize(320,240)
        self.setup_camera()
    
    
        uic.loadUi("f.ui",self)
    
    def take(self):
        print("value")
        cap = videoCapture(0)
        leido,frame = cap.read()
    
        if leido ==True:
            cv2.imwrite("photo.png",frame)
            print("ok")
        else:
            print("error")
        cap.release()
    
    self.boton1.clicked.connect(self.take)
    self.video_size = QtCore.QSize(320,240)
    self.setup_camera()
    #uic.loadUi("f.ui",self)
    
    if leido ==True:
        cv2.imwrite("photo.png",frame)
        print("ok")
    else:
        print("error")
        cap.release()