本文針對的是下面的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提示進行打開服務即可。
同一局域網內是可以成功的,公網能否成功尚未嘗試。