在 Python OpenCV 中访问网络摄像机

Access IP Camera in Python OpenCV

如何访问我的网络摄像机流?

显示标准网络摄像头流的代码是

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

如何使用 IP 摄像机做完全相同的事情?

我的系统:

您可以使用视频捕捉对象作为

camera = cv2.VideoCapture("IP:PORT/video")

先看看你的网络摄像头的流url,比如是不是RTSP/HTTP等等

代码改动如下:

cap = cv2.VideoCapture("ipcam_streaming_url")

例如:

cap = cv2.VideoCapture("http://192.168.18.37:8090/test.mjpeg")

通过在 cv2.VideoCapture.

的构造函数中提供摄像头的流 URL,可以在 opencv 中访问 IP 摄像头

通常,摄像机使用RTSP 或HTTP 协议来传输视频。 IP摄像头串流URL示例如下:

rtsp://192.168.1.64/1

用OpenCV可以这样打开:

capture = cv2.VideoCapture('rtsp://192.168.1.64/1')

大多数网络摄像机都有访问视频的用户名和密码。在这种情况下,必须在流 URL 中提供凭证,如下所示:

capture = cv2.VideoCapture('rtsp://username:password@192.168.1.64/1')

获取网络摄像机视频link:

  1. 在浏览器中使用给定的IPPORT打开网络摄像机
  2. 右键单击视频 select "copy image address"
  3. 使用该地址捕获视频

通过网络摄像机流式传输视频的最简单方法!

我刚刚编辑了您的示例。您必须更换您的 IP 并在您的 link 上添加 /video。继续你的项目

import cv2

cap = cv2.VideoCapture('http://192.168.18.37:8090/video')

while(True):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

要访问网络摄像头,首先,我建议您像安装标准应用程序一样安装它,无需任何代码,使用普通软件。

看完之后你要知道,对于不同的相机,我们有不同的代码。有一个网站,您可以在其中查看可以使用哪些代码来访问它们:

https://www.ispyconnect.com/sources.aspx

但要小心,我的相机 (Intelbras S3020) 它不工作。正确的方法是问你相机的公司,如果他们是好的公司,他们会提供。

当您知道自己的代码时,只需将其添加为:

cap = cv2.VideoCapture("http://LOGIN:PASSWORD@IP/cgi-bin/mjpg/video.cgi?&subtype=1")

您将输入您的登录名而不是 LOGIN,您将输入您的密码而不是 PASSWORD。

要找出摄像机的 IP 地址,您可以下载许多软件并提供 IP 地址给您。我使用 Intelbras 的软件,但我也推荐 EseeCloud,因为它们几乎适用于我购买的所有相机:

https://eseecloud.software.informer.com/1.2/

在这个例子中,它显示了访问Ip摄像头的协议http,但是你也可以使用rstp,这取决于摄像头,正如我所说的。

如果您还有任何问题,请告诉我。

我回答了我自己的问题,报告了在 Python OpenCV 中访问 IP 摄像机的 最全面的 整体过程。

给定一个网络摄像机:

  • 找到你的相机IP地址
  • 找到访问IP地址的port
  • 找到相机供应商指定的protocol(HTTP/RTSP等)

然后,如果您的相机受到保护,请继续查找:

  • 你的username
  • 你的password

然后将您的数据用于运行以下脚本:

"""Access IP Camera in Python OpenCV"""

import cv2

stream = cv2.VideoCapture('protocol://IP:port/1')

# Use the next line if your camera has a username and password
# stream = cv2.VideoCapture('protocol://username:password@IP:port/1')  

while True:

    r, f = stream.read()
    cv2.imshow('IP Camera stream',f)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

注意:在我最初的问题中,我指定使用 Teledyne Dalsa Genie Nano XL Camera。不幸的是,对于这种摄像机,这种访问 IP 摄像机视频流的正常方式不起作用,必须使用 Sapera SDK 才能从设备中抓取帧。

pycharm中,我编写了访问网络摄像机的代码,如:

import cv2

cap=VideoCapture("rtsp://user_name:password@IP_address:port_number")

ret, frame=cap.read()

您需要将 user_namepasswordIPport 替换为合适的值

您可以使用以下方法访问大多数网络摄像机。

import cv2 

# insert the HTTP(S)/RSTP feed from the camera
url = "http://username:password@your_ip:your_port/tmpfs/auto.jpg"

# open the feed
cap = cv2.VideoCapture(url)

while True:
    # read next frame
     ret, frame = cap.read()
    
    # show frame to user
     cv2.imshow('frame', frame)
    
    # if user presses q quit program
     if cv2.waitKey(1) & 0xFF == ord("q"):
        break

# close the connection and close all windows
cap.release()
cv2.destroyAllWindows()

这适用于我的网络摄像机:

import cv2

#print("Before URL")
cap = cv2.VideoCapture('rtsp://admin:123456@192.168.1.216/H264?ch=1&subtype=0')
#print("After URL")

while True:

    #print('About to start the Read command')
    ret, frame = cap.read()
    #print('About to show frame of Video.')
    cv2.imshow("Capturing",frame)
    #print('Running..')

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

我在相机的设置屏幕中找到了流 URL:

请注意,我添加了相机的用户名(admin)和密码(123456),并在URL(admin:123456@)[=12=中的IP地址前以@符号结尾。 ]

为您的相机找到正确的 URL 似乎才是真正的挑战! 我将我的工作 URL 放在这里,它可能会对某些人有所帮助。 相机 EZVIZ C1C,型号 cs-c1c-d0-1d2wf。工作 URL 是

rtsp://admin:SZGBZT@192.168.1.2/h264_stream

其中SZGBZT是在相机底部找到的验证码。 admin 始终是 admin,无论您有任何设置或用户。

最终代码将是

video_capture = cv2.VideoCapture('rtsp://admin:SZGBZT@192.168.1.2/h264_stream')

正如@Gustavo GeoDrones 上面提到的,您可以使用 https://www.ispyconnect.com/sources.aspx.

找到您的 Cam URL

进入网站,点击您的相机型号,将出现“Cam Video URL Generator”。输入您的 IP、用户名等,然后单击“生成”。

我的 Canon VB-H45 的 Cam URL 是(当然还有我的特定用户名、密码和 IP):

http://username:password@IP/-wvhttp-01-/video.cgi

最终代码:

cap = cv2.VideoCapture('http://username:password@IP/-wvhttp-01-/video.cgi')
import cv2
from threading import Thread
  
class Webcam:
  
    def __init__(self):
        # using video stream from IP Webcam for Android
        url = "http://your_ip:8080/video"
        self.video_capture = cv2.VideoCapture(url)
        self.current_frame = self.video_capture.read()[1]
          
    # create thread for capturing images
    def start(self):
        Thread(target=self._update_frame, args=()).start()
  
    def _update_frame(self):
        while(True):
            try:
                self.current_frame = self.video_capture.read()[1]
            except:
                pass
                  
    # get the current frame
    def get_current_frame(self):
        return self.current_frame

然后

from webcam import Webcam
# get image from webcam
image = self.webcam.get_current_frame()