使用OpenCV Python从Android智能手机中捕获视频

15

我刚开始学习使用Python的OpenCV,第一篇教程介绍了如何使用内置或外置网络摄像头捕获视频。但我手头上却没有摄像头。所以我想知道是否能够使用我的Android智能手机相机,并通过IP地址捕获视频以供后续处理。

我的智能手机型号是:Moto E

操作系统是:Windows 7

编程语言是:Python

安卓应用程序是:IP Webcam

我已经在网上进行了广泛搜索,但仍然无法找到任何有效的解决方案,所以有没有人能够指导我如何使用IP Webcam从我的智能手机中捕获视频。

非常抱歉我没有提供代码,因为我对这个领域还完全不熟悉。

谢谢。


尝试使用录制的视频(最好是用智能手机拍摄)进行工作。功能相同,您可以继续学习。最好购买一个网络摄像头。 - Miki
如果这个方法失败了,@Miki会选择那个,但是希望能够尝试一下这个方法。谢谢。 - Mohit
7个回答

12

使用urllib和numpy将Android“IP Webcam”应用程序的视频流导入Python OpenCV;)

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

urllib不再可用。有什么替代方法吗? - Aashish Kumar
@Aashish 这不是吗? - Aniket Chowdhury
@AniketChowdhury urllib在Python 3.x中已不再可用。 - Aashish Kumar
1
@Aashish 我不认为是这样的。urllib2在Python3中不可用。https://docs.python.org/3/library/urllib.html - Aniket Chowdhury
1
@AniketChowdhury urlliburllib2 都不可用,可以使用 urllib.requests 包代替。 - Aashish Kumar
Python3 urllib教程:访问互联网 https://pythonprogramming.net/urllib-tutorial-python-3/ - Peter Lunk

9
这可能比你想象的要困难得多,原因有很多。首先是带宽问题。一个适度的视频流(每个通道640x480像素,8位,每秒30帧)需要约200mbps的带宽。虽然USB(2)轻松达到这些速度,但你很难找到可靠的无线连接来实现这一点。现在你可能会想:为什么我可以毫不费力地在手机上观看1080p的网络视频呢?实际上,几乎所有在网络上传输的视频都使用专门的算法进行压缩,例如MPEG4、H.264和VP8。这些算法大大降低了传输视频所需的带宽。那太好了!那么我只需将手机中的视频实时压缩并将其流式传输到计算机上即可。但不要太快!这样做存在两个主要问题。
首先,为了实现如此大幅度的视频数据减少,视频编码器(encoders)需要花费大量处理能力来压缩视频。你可能会发现你的手机没有足够的CPU能力(或专用硬件)来对可用于你的任务的分辨率和帧率进行视频编码。
如果你成功解决了这个问题并找到了一个能完成任务的应用程序,第二个问题是为了获得(已编码的)视频数据,你需要对其进行解码!你可以找到现成的软件来解码视频文件,但是对于解码视频的实时流,你需要编写软件以执行解码(最好使用库或OpenCV本身)。
此时,你会咒骂并后悔没有花15美元买个网络摄像头(但在这个过程中你会学到很多有趣的东西 :)

很有用的信息,感谢分享。但我有一个问题,我能够使用名为Ip Webcam的Android应用程序从手机流式传输视频到计算机,我希望有人能够使用opencv捕获它。 - Mohit
@Mohit,如果你愿意重新编译OpenCV,你可以访问此IP摄像头。 - loopbackbee
这是C++代码,我正在尝试用Python实现相同的功能 :) - Mohit
@Mohit,我找不到Python的示例,但C++和Python中(opencv)函数的名称通常非常相似,因此阅读文档应该很简单。难点可能是弄清楚如何编译OpenCV(我模糊地记得之前尝试过,浪费了许多时间后放弃了)。 - loopbackbee
这篇维基百科文章(https://en.wikipedia.org/wiki/IPhone_6)表明最近的WiFi版本可以支持200+ Mbps:“通过支持802.11ac规范,Wi-Fi性能得到了改善,提供高达433.0581 Mbit/s的速度-比802.11n快3倍[38],以及在可用时支持Wi-Fi呼叫。” 这篇文章有误吗?我想了解将视频数据流传输到智能手机的限制,感谢您的帮助! - Crashalot
@Crashalot,你提到了IEEE 802.11ac。请注意,这些只是理论数据速率 - 即:“高达”这个词很重要。我的建议是在实际位置上测试其实际性能,然后再考虑实施。 - loopbackbee

4

您可以直接使用 cv2 库中的 VideoCapture 方法,通过传入流媒体的url地址就可以访问IP Webcam应用程序如下所示的实例代码:

注意:在IP Webcam应用程序中需要在url后面添加 /video 后缀。我是通过检查浏览器中原始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

3

1
我同意上面的答案 - “这是一个非常复杂的任务”。因此,唯一有用的答案就是链接到一个存储库,其中有人编写了数百行代码来解决问题,并且有演示它正在工作。为什么要踩呢? - user2437016

3

这个帖子看起来有点旧,但我想要添加我的答案。这就是我如何在Python 3.5、OpenCV 3.2和Android应用程序“IP WEB CAM”中完成任务的方法。get函数中的urlhttp://192.168.0.103:8080是IP Web Cam应用程序提供的流地址。

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

0
下载Droidcam。它可以通过WiFi使用,然后在cv2.VideoCapture(n)中,n可以是1或2,对我来说是2,你可以在Python的open_cv2中使用移动摄像头。

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接