用USB把 android 手機的畫面 real time 傳到電腦給 openCV

研究了一下可能的方法
1. IP cam or RTSP
不限iOS或 Android, 但都是透過 WiFi, 會有延遲
https://medium.com/beesightsoft/opencv-python-connect-to-android-camera-via-rstp-9eb78e2903d5

2. Droidcam 可 USB, 但要用他們的app
http://www.skipser.com/p/2/p/android-as-webcam.html
(網頁下面有教怎麼做)



這是目前唯試成功,可以把畫面導到OpenCV的方法

(1) 手機上要下載他們的 APP, 並且打開 Android 的開發人員模式, 至於怎麼打開, 要看各家手機。
(2) 電腦要裝client,
Client 端的設定:
https://stackoverflow.com/questions/54060907/how-do-i-use-my-droidcam-video-feed-via-usb-in-python-for-image-processing-usi
(3) 在電腦上先run一次它們的app,停掉,再用opencv跑才抓得到,直接用OpenCV沒有用。問題是,defaul的畫質較低,可手動改到HD,但最多好像就只支援到HD
(目前測試是覺得用Full HD比較能在較遠處就偵測到號碼布)


3. Apower Mirror
https://www.azofreeware.com/2018/07/apowermirror.html
一個大陸的軟件,支援iOS和Android,手機端和電腦端都要下載,我目前只能做到螢幕鏡像,還沒成功讓OpenCV抓到影像。這篇提到用電腦去抓a power mirror的三個方式比較,但沒有說詳細怎麼做。
https://www.jishuwen.com/d/2xNR/zh-tw

還有一個小問題是,電腦裝大陸軟件後都會怕怕的。



下面的Code是我用來把手機當成WebCam,再即時用OpenCV的人臉偵測做測試。重點是VideoCapture那一行要改,才能讓電腦抓到手機。
cap = cv2.VideoCapture('http://127.0.0.1:4747/mjpegfeed') #o: 內建 1:外接


====== 我是分隔線 =========

# -*- coding: utf-8 -*-
"""
DroidCam 即時偵測人臉
Created on Wed Jul  3 08:17:45 2019

@author: andre
來源: 許境恩
"""

import numpy as np
import cv2
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
faceCascade.load('D:/Files/opencv-4.1.0/data/haarcascades/haarcascade_frontalface_default.xml')
#faceCascade = cv2.CascadeClassifier('C:\Emgu\emgucv-windesktop 4.1.0.3420\opencv\data\haarcascades\haarcascade_frontalface_default.xml')


#cap = cv2.VideoCapture('vtest.avi')C:\Emgu\emgucv-windesktop 4.1.0.3420\opencv\data\haarcascades
cap = cv2.VideoCapture('http://127.0.0.1:4747/mjpegfeed') #o: 內建 1:外接
# 取得影像的尺寸大小
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
print("Image Size: %d x %d" % (width, height))
print("Frame rate: %d fps" % (fps))
# 設定影像的尺寸大小
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
cap.set(cv2.CAP_PROP_FPS, 30)

# 取得影像的尺寸大小
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
print("Image Size: %d x %d" % (width, height))
print("Frame rate: %d fps" % (fps))

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
#fourcc = cv2.VideoWriter_fourcc('M','P','4','V')
#out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
out = cv2.VideoWriter('test.avi',fourcc, 30.0, (1280,720))

while(cap.isOpened()):
   
    ret, frame = cap.read()
    if ret==True:
        #frame=cv2.flip(frame,1)
        #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces=faceCascade.detectMultiScale(frame)
        for (x,y,w,h) in faces:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
           
        #cv2.imshow('frame',gray)
        cv2.imshow('Streaming',frame)
        out.write(frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
out.release()
cv2.destroyAllWindows()

留言

熱門文章