我刚刚开始使用Python学习OpenCV,第一个教程开始使用内置笔记本电脑网络摄像头或外部网络摄像头捕获视频。碰巧的是,我两个都没有。所以我想是否可以使用我的安卓智能手机的摄像头,然后使用IP捕获视频进行进一步处理。
我的手机:Moto E
操作系统:Windows 7
Python语言:
Android Application: IP Webcam
我已经广泛地搜索了网络,但无法找到任何有效的解决方案,所以有人可以指导我如何使用IP网络摄像头从我的智能手机捕捉视频吗?
很抱歉没有发布代码,因为我刚刚进入这个领域,所以我完全没有头绪。
谢谢。
Android 'IP Webcam'应用视频流导入到Python OpenCV使用urllib和numpy;)
import urllib
import cv2
import numpy as np
import time
# Replace the URL with your own IPwebcam shot.jpg IP:port
url='http://192.168.2.35:8080/shot.jpg'
while True:
# Use urllib to get the image and convert into a cv2 usable format
imgResp=urllib.urlopen(url)
imgNp=np.array(bytearray(imgResp.read()),dtype=np.uint8)
img=cv2.imdecode(imgNp,-1)
# put the image on screen
cv2.imshow('IPWebcam',img)
#To give the processor some less stress
#time.sleep(0.1)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
由于各种原因,这可能比您预期的要困难得多。
第一个是带宽。一般的原始视频流(640x480像素,每通道8位,每秒30帧)需要大约200mbps的带宽。虽然USB(2)很容易达到这些速度,但你很难找到一个可靠的无线连接。
现在你可能在想
为什么我在手机上看1080p的网络视频没有任何问题呢?
几乎所有通过网络传输的视频都使用专门的算法进行压缩,如MPEG4、H.264和VP8。这些算法大大减少了传输视频所需的带宽。
很棒!然后我就可以把手机上的直播视频压缩到我的电脑上
别那么快!这里有两个主要问题。
首先,为了实现视频数据量的大幅减少,视频压缩器(编码器)需要花费大量的处理能力来处理视频。你可能会发现你的手机没有足够的CPU功率(或专用硬件)来编码视频的分辨率和帧率可用的任务。如果你设法解决和找到一个应用程序做这项工作,第二个问题是,为了在OpenCV中获得(编码)视频数据,你需要解码它!您可以找到现成的软件来解码视频文件,但要解码实时视频流,您需要对软件进行编程来执行解码(最好使用库或OpenCV本身)。
在这一点上,你会诅咒和后悔你没有花15美元买一个网络摄像头(但你会学到很多有趣的东西在这个过程中:)您可以简单地使用cv2
的VideoCapture
方法,通过传递流url,如IP网络摄像头应用程序所示。下面是示例代码:
注意:
/video
后缀到url的情况下,IP摄像头应用程序是必需的。我已经发现了这一点,通过检查在浏览器中的原始url页面。
import cv2
url = "http://192.168.43.1:8080" # Your url might be different, check the app
vs = cv2.VideoCapture(url+"/video")
while True:
ret, frame = vs.read()
if not ret:
continue
# Processing of image and other stuff here
cv2.imshow('Frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
这是一个Android视频直播的repo:
这个线程看起来很旧,但只是想添加我的答案。所以这就是我如何能够在python 3.5, OpenCV 3.2和android应用程序"IP WEB CAM"中实现任务。get函数中的url (http://192.168.0.103:8080)是ip摄像头应用提供的流媒体地址。
import requests
import numpy as np
import cv2
while True:
img_res = requests.get("http://192.168.0.103:8080/shot.jpg")
img_arr = np.array(bytearray(img_res.content), dtype = np.uint8)
img = cv2.imdecode(img_arr,-1)
cv2.imshow('frame', img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
下载Droidcam。它可以通过wifi使用,之后在cv2. videoccapture (n)其中n可以是1或2对我来说它的2你可以在python中使用移动摄像头open_cv2
在2020年使用IP网络摄像头和OpenCV
import requests
import cv2
import numpy as np
URL = "http://192.168.68.126:8080/shot.jpg"
while True:
img_resp = requests.get(URL)
img_arr = np.array(bytearray(img_resp.content), dtype=np.uint8)
img = cv2.imdecode(img_arr, -1)
cv2.imshow('IPWebcam', img)
height, width, channels = img.shape
print(height, width, channels)
if cv2.waitKey(1) == 27:
break
这里如果你需要捕获视频流
import requests
import cv2
import numpy as np
URL = "http://192.168.68.126:8080/video"
cam = cv2.VideoCapture(URL)
while True:
check, img = cam.read()
cv2.imshow('IPWebcam', img)
height, width, channels = img.shape
print(height, width, channels)
if cv2.waitKey(1) == 27:
break