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

Posted

技术标签:

【中文标题】使用 OpenCV Python 从 Android 智能手机捕获视频【英文标题】:Capturing Video from Android Smartphone using OpenCV Python 【发布时间】:2015-10-07 07:28:27 【问题描述】:

我刚刚开始使用 Python 学习 OpenCV,第一个教程从使用内置笔记本电脑网络摄像头或外部网络摄像头捕获视频开始。正如它会发生的那样,我两者都没有。所以我想是否可以使用我的 android 智能手机的摄像头,然后使用 IP 捕获该视频以进行进一步处理。

我的智能手机:Moto E

操作系统:Windows 7

语言:Python

Android 应用程序:IP 网络摄像头

我已经在网上广泛搜索,但找不到任何可行的解决方案,所以请谁能指导我如何使用 IP 网络摄像头从我的智能手机捕获视频。

很抱歉没有发布代码,因为我只是进入这个领域,所以完全一无所知。

谢谢。

【问题讨论】:

尝试处理录制的视频(最终用您的智能手机拍摄)。功能相同,您可以继续学习。最终购买一个网络摄像头 @Miki 会选择如果失败,但希望尽可能尝试一下。谢谢。 【参考方案1】:

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', ing)
    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', ing)
    height, width, channels = img.shape
    print(height, width, channels)
    if cv2.waitKey(1) == 27:
      break

【讨论】:

【参考方案2】:

您可以简单地使用cv2VideoCapture 方法,将流式网址传递给它,如IP 网络摄像头应用程序所示。 这是示例代码:

注意:如果是 IP 网络摄像头应用程序,则 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】:

这个线程接缝很旧,但只是想添加我的答案。所以这就是我在 python 3.5、OpenCV 3.2 和 android 应用程序“IP WEB CAM”中实现任务的方式。 get函数中的url(http://192.168.0.103:8080)是ip web cam app提供的流媒体地址。

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

【讨论】:

【参考方案4】:

使用 urllib 和 numpy 将 Android 'IP Webcam' App 视频流导入 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 不是吗? @AniketChowdhury urllib 在 Python 3.x 中不再可用 @Aashish 我认为情况并非如此。 urllib2 在 Python3 中不可用。 docs.python.org/3/library/urllib.html @AniketChowdhury urllib & urllib2 两者都不可用,您可以使用 urllib.requests 包代替。【参考方案5】:

由于各种原因,这可能比您预期的要困难得多。

首先是带宽。 原始视频流(640x480 像素,每通道 8 位,每秒 30 帧)需要大约 200mbps 的带宽。虽然 USB (2) 很容易达到这些速度,但您很难找到可靠的无线连接。

现在你可能在想

那我怎么能在手机上看1080p的网络视频毫无问题呢?

几乎所有通过网络传输的视频都使用专门的算法进行压缩,例如 MPEG4、H.264 和 VP8。这些算法大大减少了传输视频所需的带宽。

太棒了!然后我可以直接压缩手机中的视频并将其流式传输到我的电脑

没那么快!这样做有两个主要问题。

首先,为了大幅减少视频数据量,视频压缩器(编码器)需要花费大量的处理能力来处理视频。您可能会发现您的手机没有足够的 CPU 能力(或专用硬件)来以适合您的任务的分辨率和帧速率对视频进行编码。

如果你设法解决了这个问题并且找到了一个可以完成这项工作的应用程序,第二个问题是,为了在 OpenCV 中获取(编码的)视频数据,你需要解码它!您可以找到现成的软件来解码视频文件,但要解码实时视频流,您需要对软件进行编程以执行解码(最好使用库或OpenCV itself)。

此时,您会诅咒并后悔自己没有在网络摄像头上花费 15 美元(但您会在此过程中学到很多有趣的东西 :)

【讨论】:

很高兴知道,感谢分享。但我有一个问题,我可以使用名为 Ip Webcam 的 Android 应用将视频从手机流式传输到计算机,我希望有人能够使用 opencv 捕获它。 @Mohit 你可以,if you're happy recompiling OpenCV 它在 c++ 中我试图在 python 中做同样的事情:) @Mohit 找不到python的例子,但是C++和python中的(opencv)函数名一般都非常相似,所以阅读文档应该很简单。困难的部分可能是弄清楚如何编译 OpenCV(我隐约记得以前尝试过这样做,但在浪费了数小时的努力后放弃了) 这篇 Wikipedia 文章 (en.wikipedia.org/wiki/IPhone_6) 表明最新版本的 WiFi 可以支持 200+ Mbps:“通过支持 802.11ac 规范,Wi-Fi 性能得到了改进,提供高达 433.0581 Mbit/s 的速度— 比 802.11n 快 3 倍,[38] 以及可用的 Wi-Fi 呼叫支持。”这篇文章有错吗?试图了解将视频数据流式传输到智能手机的限制,感谢您的帮助!【参考方案6】:

Here's a repo that does live broadcast of Android Video:

【讨论】:

我同意上面的答案——“这是一项非常复杂的任务”。因此,唯一有用的答案是链接到有人写了数百行来解决问题的存储库。并有一个演示它的工作。为什么要投反对票?

以上是关于使用 OpenCV Python 从 Android 智能手机捕获视频的主要内容,如果未能解决你的问题,请参考以下文章

使用Opencv从python中的图片中删除小边缘

使用 python/opencv/深度学习从图像中删除给定位置的徽标/水印

在 Python 中使用 Opencv 从图像中减去背景

Python从图像opencv中提取多个对象

从 Python 访问 OpenCV CUDA 函数(无 PyCUDA)

在 Python 中使用 OpenCV 从随机数组中创建 RGB 图片