在Python OpenCV中访问IP Camera

Emp*_*yee 16 python opencv ip-camera

如何访问我的IP Camera流?

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

import numpy as np
import cv2

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()
Run Code Online (Sandbox Code Playgroud)

我如何使用IP Camera做同样的事情?

我的系统:

  • Python 2.7.14
  • OpenCV 2.4.9
  • Teledyne Dalsa Genie Nano XL相机

帮助将受到高度赞赏

sga*_*zvi 17

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

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

RTSP://192.168.1.64/1

它可以用OpenCV打开,如下所示:

capture = cv2.VideoCapture('rtsp://192.168.1.64/1')
Run Code Online (Sandbox Code Playgroud)

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

capture = cv2.VideoCapture('rtsp://username:password@192.168.1.64/1')
Run Code Online (Sandbox Code Playgroud)

  • @sqarizvi 如何找到相机的 URL?它安装在我的本地网络中,直接连接到路由器。有没有办法从Python代码扫描网络并找到URL? (2认同)

Gus*_*nes 7

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

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

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

但是要小心,对于我的相机(Intelbras S3020)它不起作用。正确的方法是询问您相机的公司,如果他们是一家好公司,他们会提供。

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

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

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

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

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

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

如果您有任何进一步的问题,请告诉我。


Emp*_*yee 7

我回答我自己的问题,报告因此似乎是在 Python OpenCV 中访问 IP 摄像机的最全面的整体程序。

给定一个 IP 摄像头:

  • 查找您的相机IP地址
  • 找到port访问IP地址的地方
  • 找到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()
Run Code Online (Sandbox Code Playgroud)

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


小智 7

这适用于我的IP摄像机:

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()
Run Code Online (Sandbox Code Playgroud)

我在相机的“设置”屏幕中找到了流URL: IP摄像机设置屏幕

请注意,我添加了摄像机的用户名(admin)和密码(123456),并在URL(admin:123456 @)的IP地址之前以@符号结尾。


Ven*_*agi 6

首先找出你的IP摄像机的流媒体网址,比如是否是RTSP/HTTP等.

代码更改如下:

cap = cv2.VideoCapture("ipcam_streaming_url")
Run Code Online (Sandbox Code Playgroud)

例如:

cap = cv2.VideoCapture("http://192.168.18.37:8090/test.mjpeg")
Run Code Online (Sandbox Code Playgroud)


小智 6

通过IP摄像机流视频的最简单方法!

我只是编辑您的示例。您必须替换IP并添加/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
Run Code Online (Sandbox Code Playgroud)


Din*_*nka 5

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

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()
Run Code Online (Sandbox Code Playgroud)