python - 使用 OpenCV cv2.VideoCapture 在 Python 中从 IP 摄像机流式传输视频

标签 python opencv computer-vision video-streaming rtsp

我正在尝试从 IP 摄像机获取 python 中的视频流,但出现错误。我正在使用 Pycharm IDE。

import cv2
scheme = '192.168.100.23'


host = scheme
cap = cv2.VideoCapture('http://admin:Ebmacs8485867@'+host+':81/web/admin.html')

while True:
    ret, frame = cap.read()

    # Place options to overlay on the video here.
    # I'll go over that later.

    cv2.imshow('Camera', frame)

    k = cv2.waitKey(0) & 0xFF
    if k == 27:  # esc key ends process
        cap.release()
        break
cv2.destroyAllWindows()
Error:
"E:\Digital Image Processing\python\ReadingAndDisplayingImages\venv\Scripts\python.exe" "E:/Digital Image Processing/python/ReadingAndDisplayingImages/ReadandDisplay.py"
Traceback (most recent call last):
  File "E:/Digital Image Processing/python/ReadingAndDisplayingImages/ReadandDisplay.py", line 14, in <module>
    cv2.imshow('Camera', frame)
cv2.error: OpenCV(4.0.1) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:352: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

warning: Error opening file (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:901)
warning: http://admin:Ebmacs8485867@192.168.100.23:81/web/admin.html (/build/opencv/modules/videoio/src/cap_ffmpeg_impl.hpp:902)

最佳答案

由于流链接无效,您很可能会收到该错误。将您的流媒体链接插入 VLC 播放器以确认它正在运行。这是一个使用 OpenCV 和 cv2.VideoCapture.read() 的 IP 摄像机视频流小部件。由于 read() 是阻塞操作,因此此实现使用线程在不同的线程中获取帧。通过将此操作放入一个单独的操作中,只专注于获取帧,它可以通过减少 I/O 延迟来提高性能。我使用了自己的 IP 摄像机 RTSP 流链接。将 stream_link 更改为您自己的网络摄像机链接。

enter image description here

根据您的 IP 摄像机,您的 RTSP 流链接会有所不同,这是我的示例:

rtsp://username:password@192.168.1.49:554/cam/realmonitor?channel=1&subtype=0
rtsp://username:password@192.168.1.45/axis-media/media.amp

代码

from threading import Thread
import cv2

class VideoStreamWidget(object):
    def __init__(self, src=0):
        # Create a VideoCapture object
        self.capture = cv2.VideoCapture(src)

        # Start the thread to read frames from the video stream
        self.thread = Thread(target=self.update, args=())
        self.thread.daemon = True
        self.thread.start()

    def update(self):
        # Read the next frame from the stream in a different thread
        while True:
            if self.capture.isOpened():
                (self.status, self.frame) = self.capture.read()

    def show_frame(self):
        # Display frames in main program
        if self.status:
            self.frame = self.maintain_aspect_ratio_resize(self.frame, width=600)
            cv2.imshow('IP Camera Video Streaming', self.frame)

        # Press Q on keyboard to stop recording
        key = cv2.waitKey(1)
        if key == ord('q'):
            self.capture.release()
            cv2.destroyAllWindows()
            exit(1)

    # Resizes a image and maintains aspect ratio
    def maintain_aspect_ratio_resize(self, image, width=None, height=None, inter=cv2.INTER_AREA):
        # Grab the image size and initialize dimensions
        dim = None
        (h, w) = image.shape[:2]

        # Return original image if no need to resize
        if width is None and height is None:
            return image

        # We are resizing height if width is none
        if width is None:
            # Calculate the ratio of the height and construct the dimensions
            r = height / float(h)
            dim = (int(w * r), height)
        # We are resizing width if height is none
        else:
            # Calculate the ratio of the 0idth and construct the dimensions
            r = width / float(w)
            dim = (width, int(h * r))

        # Return the resized image
        return cv2.resize(image, dim, interpolation=inter)

if __name__ == '__main__':
    stream_link = 'your stream link!'
    video_stream_widget = VideoStreamWidget(stream_link)
    while True:
        try:
            video_stream_widget.show_frame()
        except AttributeError:
            pass

相关相机/IP/RTSP、FPS、视频、线程和多处理帖子

  1. Python OpenCV streaming from camera - multithreading, timestamps

  2. Video Streaming from IP Camera in Python Using OpenCV cv2.VideoCapture

  3. How to capture multiple camera streams with OpenCV?

  4. OpenCV real time streaming video capture is slow. How to drop frames or get synced with real time?

  5. Storing RTSP stream as video file with OpenCV VideoWriter

  6. OpenCV video saving

  7. Python OpenCV multiprocessing cv2.VideoCapture mp4

关于python - 使用 OpenCV cv2.VideoCapture 在 Python 中从 IP 摄像机流式传输视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55828451/

相关文章:

python - 如何安全地计算 python 中的字典键

python - 将 seaborn lineplot 与分组变量一起使用

python - OpenCv - cv2.VideoWriter对象没有属性释放

c++ - 如何使用opencv setOpenGlDrawCallback函数?

python - TensorFlow Sigmoid 交叉熵与一维数据的 Logits

python - 引用 Python 函数以便稍后应用

python - 读取 CSV 并按列分隔

c++ - 二值图像的特征提取

matlab - 使用 Matlab 和 opencv 进行基本矩阵估计

c++ - 如何使用 vlfeat 和 opencv 在 C++ 中确定图像的 PHOW 特征?