簡體   English   中英

使用 OpenCV Python 從 Android 智能手機捕獲視頻

[英]Capturing Video from Android Smartphone using OpenCV Python

我剛剛開始使用 Python 學習 OpenCV,第一個教程從使用內置筆記本電腦網絡攝像頭或外部網絡攝像頭捕獲視頻開始。 正如它會發生的那樣,我兩者都沒有。 所以我想是否可以使用我的 Android 智能手機的攝像頭,然后使用 IP 捕獲該視頻以進行進一步處理。

我的智能手機:Moto E

操作系統:Windows 7

語言:Python

Android 應用程序:IP 網絡攝像頭

我已經在網上廣泛搜索,但找不到任何可行的解決方案,所以任何人都可以指導我如何使用 IP 網絡攝像頭從我的智能手機捕獲視頻。

很抱歉沒有發布代碼,因為我只是傾向於這個領域,所以我完全一無所知。

謝謝。

使用 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

由於各種原因,這可能比您預期的要困難得多。

首先是帶寬。 適度的原始視頻流(640x480 像素,每通道 8 位,每秒 30 幀)需要大約 200mbps 的帶寬。 雖然 USB (2) 很容易達到這些速度,但您很難找到可靠的無線連接。

現在你可能在想

為什么我可以毫無問題地在手機上觀看 1080p 網絡視頻?

幾乎所有通過網絡傳輸的視頻都使用專門的算法進行壓縮,例如 MPEG4、H.264 和 VP8。 這些算法大大減少了傳輸視頻所需的帶寬。

偉大的! 然后我可以將手機中的視頻實時壓縮並將其流式傳輸到我的計算機

沒那么快! 這樣做有兩個主要問題。

首先,為了大幅減少視頻數據量,視頻壓縮器(編碼器)需要花費大量的處理能力來處理視頻。 您可能會發現您的手機沒有足夠的 CPU 能力(或專用硬件)來以可用於您的任務的分辨率和幀速率對視頻進行編碼。

如果你設法解決了這個問題找到了一個可以完成這項工作的應用程序,那么第二個問題是,為了在 OpenCV 中獲取(編碼的)視頻數據,你需要對其進行解碼! 您可以找到現成的軟件來解碼視頻文件,但要解碼實時視頻流,您需要對軟件進行編程以執行解碼(最好使用庫或OpenCV 本身)。

在這一點上,你會詛咒並后悔你沒有在網絡攝像頭上花 15 美元(但你會在這個過程中學到很多有趣的東西 :)

您可以簡單地使用cv2VideoCapture方法,通過將流 url 傳遞給它,如 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

該線程接縫很舊,但只想添加我的答案。 所以這就是我在 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

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

下載 Droidcam。 它可以被wifi使用,之后在 cv2.VideoCapture(n) 中 n 可以是 1 或 2 對我來說它的 2 你可以在 python open_cv2 中使用移動攝像頭

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM