Windows控制手機同步拍照(IP Camera + opencv + Python)

本文針對的是下面的Windows控制手機同步拍照任務:

step1: 電腦(Win10,下同)完成事件A1,約耗時0.5s(下同);

           完成的同時手機(Android,下同)拍照並保存,記爲I1;

step2: 電腦完成事件A2;

           完成的同時手機拍照並保存,記爲I2;

... ...

step20000: 電腦完成事件A20000;

           完成的同時手機拍照並保存,記爲I20000;

要求:

  • Ai必須對應Ii, 即圖片採集須同步;
  • 因爲採集時間的要求,每張圖片的平均記錄時間越短越好,最長不超過2s;

 

實現方法:

Windows端: Python

Android端: IP Camera APP;

 

Windows端代碼如下:

#! /usr/bin/env python3
# -*- coding:utf-8 -*- 
 
from socket import *
import numpy as np
import cv2
import time
import screeninfo
import threading
import os
import struct

class myThread (threading.Thread):   #繼承父類threading.Thread
    def __init__(self, threadID, name, parameter1):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.parameter1 = parameter1
        # self.cap = cap
    def run(self):                   #把要執行的代碼寫到run函數裏面 線程在創建後會直接運行run函數 
        # print("Starting " + self.name)
        if self.threadID == 1:
            fullscreen(self.parameter1)


def norm(image_ori):
    ymax=255
    ymin=0
    xmax=np.max(piexl)
    xmin=np.min(piexl)
    xiugaihou_piexl=round((ymax-ymin)*(piexl_m-xmin)/(xmax-xmin)+ymin)
    return image_norm

def fullscreen(item):
    # cap.set(cv2.CAP_PROP_POS_MSEC, ImageIndex * 1000)
    # ret,image = cap.read()#捕獲一幀圖像
    filepath='H://folder1'
    filename = item
    # print('fullscreen',filename)
    filepathName = os.path.join(os.path.abspath(filepath),filename)
    # filepathName = '.\chaomo'+'/' + str(ImageIndex)+'.png'
    print(filepathName)
    print(os.path.exists(filepathName))
    image = cv2.imread(filepathName)
    # print(image)
    # image = cv2.resize(image, (256, 256), interpolation=cv2.INTER_NEAREST)
    screen_id = 0
    is_color = False
    # image = cv2.imread(fileName)
    # get the size of the screen
    screen = screeninfo.get_monitors()[screen_id]
    width, height = screen.width, screen.height
    
    window_name = 'projector'
    cv2.namedWindow(window_name, cv2.WND_PROP_FULLSCREEN)
    cv2.moveWindow(window_name, screen.x - 1, screen.y - 1)
    cv2.setWindowProperty(window_name, cv2.WND_PROP_FULLSCREEN,
                          cv2.WINDOW_FULLSCREEN)
    imageSave(image, item)
    cv2.imshow(window_name, image)
    print("shown")
    cv2.waitKey(50000)
    # for i in range(1000):
    #     print(i)
    #     time.sleep(1000)

def imageSave(image,item):
    image = cv2.resize(image,(256, 256),interpolation=cv2.INTER_NEAREST)
    # label = labels[ImageIndex]
    label = 0
    # print('label:',label)
    for i in range(1):
        ImageName = 'H://chaomo_ori/'+item
        cv2.imwrite(ImageName,image)
    # print('save',ImageName)


def main():
    cv2.namedWindow("camera",1)
    #開啓ip攝像頭
    video="http://192.168.31.181:8080/video"   #此處@後的ipv4 地址需要修改爲自己的地址
    cap =cv2.VideoCapture(video)
    FileNum = 0
    # cap = cv2.VideoCapture(0)
    # time.sleep(2)
    # ret, frame = cap.read()
    time.sleep(2)
    path = 'H://chaomo/'
    filelist = os.listdir(path)
    sum_len = len(filelist)
    number = 0
    for item in filelist:
        # if number > -2000:
            # number = number + 1
            # 顯示未鏡像的圖片
        label = 0
        print("start show image")
        try:
            thread1 = myThread(1, "ShowImage",item)    # 即電腦需要完成的任務
            thread1.start()
        except:
            print("Error: unable to start thread")
        time.sleep(0.8)
        print('camera done')
        cap =cv2.VideoCapture(video)    #  Very Important!!
        ret, frame = cap.read()
        frame = cv2.resize(frame,(1080,1080),interpolation=cv2.INTER_CUBIC)
        # for i in range(1):
            # time.sleep(0.1)
        ImageName = 'H://folder1/'+item
        # frame = cv2.resize(frame,(256, 256),interpolation=cv2.INTER_NEAREST)
        cv2.imwrite(ImageName,frame)
        time.sleep(0.5)
        print('destory',FileNum)
        cv2.destroyAllWindows()

    send_data = 'Finished'
 
if __name__ == "__main__":
    main()

其中,192.168.31.181:8080即爲手機上IP Camera相機在局域網內的IP地址和端口;電腦需要完成的事件是全屏顯示一張圖片,由Thread1控制,在手機拍照前開始,拍照後終止。

注:

for循環內的如下語句非常重要,即每次事件完成後都要重新Capture一次,否則無法完成同步。

cap =cv2.VideoCapture(video)    #  Very Important!!

 

Android端

安裝IP Camera APP,之後按照APP提示進行打開服務即可。

同一局域網內是可以成功的,公網能否成功尚未嘗試。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章