如何将 Android 'IP Webcam' 应用程序与 Python 一起使用

How to Use the Android 'IP Webcam' App with Python

从事简单的 GUI 项目。我从网上获得了一些代码,并找到了如何连接 IP 网络摄像头应用程序,但问题是如何在我的 PyQt4 GUI 中使用此代码,以便在滚动区域中显示摄像头的视觉效果小部件。

这是我使用的代码:

import urllib
import cv2
import numpy as np

url='http://192.168.0.100:8080/shot.jpg'

while True:
    imgResp=urllib.urlopen(url)
    imgNp=np.array(bytearray(imgResp.read()),dtype=np.uint8)
    img=cv2.imdecode(imgNp,-1)

    # all the opencv processing is done here
    cv2.imshow('test',img)
    if ord('q')==cv2.waitKey(10):
        exit(0)

正如 @furas 指出的那样,一个可能的选择是使用 numpy 和 cv2 将其转换为 QPixmap 并将其显示在 QLabel 中,这样它看起来就像在 运行 中流式传输它循环。

但是不用把上面的都搞复杂,最简单的就是用QtNetwork获取字节,直接转换成QPixmap,通过信号发送:

from PyQt4 import QtCore, QtGui, QtNetwork


class IPWebcam(QtCore.QObject):
    pixmapChanged = QtCore.pyqtSignal(QtGui.QPixmap)

    def __init__(self, url, parent=None):
        super(IPWebcam, self).__init__(parent)
        self._url = url
        self.m_manager = QtNetwork.QNetworkAccessManager(self)
        self.m_manager.finished.connect(self._on_finished)

        self.m_stopped = True

    def start(self):
        self.m_stopped = False
        self._launch_request()

    def stop(self):
        self.m_stopped = True

    def _launch_request(self):
        request = QtNetwork.QNetworkRequest(QtCore.QUrl(self._url))
        self.m_manager.get(request)

    @QtCore.pyqtSlot(QtNetwork.QNetworkReply)
    def _on_finished(self, reply):
        ba = reply.readAll()
        pixmap = QtGui.QPixmap()
        if pixmap.loadFromData(ba):
            self.pixmapChanged.emit(pixmap)
        if not self.m_stopped:
            self._launch_request()


class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.m_label = QtGui.QLabel()
        self.m_button = QtGui.QPushButton(
            "Start", clicked=self.onClicked, checkable=True
        )

        lay = QtGui.QVBoxLayout(self)
        lay.addWidget(self.m_label)
        lay.addWidget(self.m_button)

        self.resize(640, 480)

        url = "http://192.168.0.100:8080/shot.jpg"

        self.m_webcam = IPWebcam(url, self)
        self.m_webcam.pixmapChanged.connect(self.m_label.setPixmap)

    @QtCore.pyqtSlot(bool)
    def onClicked(self, checked):
        if checked:
            self.m_button.setText("Stop")
            self.m_webcam.start()
        else:
            self.m_button.setText("Start")
            self.m_webcam.stop()


if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())