github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/gateway/Implementation/Gateway/PubImages/DownResPubImages.py (about) 1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 __author__ = 'YuJung Wang' 4 __date__ = '2020/04' 5 6 import os 7 import sys 8 import cv2 9 import time 10 import random 11 import subprocess 12 from datetime import datetime 13 import paho.mqtt.publish as publish 14 15 all_apps = ['yolo1', 'yolo2', 'yolo3', 'yolo4', 'yolo5', 'yolo6', 'yolo7', 'yolo8', 'yolo9', 'yolo10', 'yolo11', 'yolo12'] 16 RTSPURL = os.environ['RTSPURL'] 17 IMAGEHEAD = 'original_' 18 TIMEPERIOD = 2 19 RANDOMRANGE = 100000000 20 #POSTFIXRANGE = 1000 21 #MAXKNOB = 0.844 22 MAXKNOB = 1 23 #MINKNOB = 0.2 24 RATIO1 = 0.31 25 ZEROKNOB = 0.01 26 27 def readQosKnob(): 28 qos_knob_dict_list = [] 29 with open('../QoSknob.txt', 'r') as rf: 30 for l in rf.readlines(): 31 # QoSknob.txt is empty 32 if ', ' not in l: 33 print('QoSknob.txt is empty') 34 return {} 35 # QoSknob.txt is not empty 36 app, knob = l.strip().split(', ', 1) 37 knob = round(float(knob), 3) 38 if app[:4] == 'yolo': 39 if knob > 1: knob = 1 40 # knob minimum is 0.2 41 # Avoid knob become zero 42 elif knob <= 0: knob = 0.01 43 qos_knob_dict = {} 44 qos_knob_dict[app] = knob 45 qos_knob_dict_list.append(qos_knob_dict) 46 #print('app', 'knob') 47 #print(app, knob) 48 return qos_knob_dict_list 49 50 def download(random_number): 51 print(' Beginning downloading a image') 52 image_name = IMAGEHEAD + random_number + '.jpg' 53 #cmd = f'ffmpeg -i {RTSPURL} -f image2 -vf fps=1/{TIMEPERIOD} {image_name}' 54 cmd = f'ffmpeg -i {RTSPURL} -f image2 -vframes 1 {image_name}' 55 #print('CMD: ' + cmd) 56 output = subprocess.run(cmd, shell=True) 57 return image_name 58 59 def resize(imratio, img_name, saved_name): 60 np_img_ori = cv2.imread(img_name) 61 np_img_height, np_img_width, np_img_channels = np_img_ori.shape 62 #print(np_img_height, np_img_width) 63 imratio = imratio**(0.5) 64 np_resize = cv2.resize(np_img_ori, (int(np_img_width*imratio), int(np_img_height*imratio))) 65 cv2.imwrite(saved_name, np_resize) 66 np_img_height, np_img_width, np_img_channels = np_resize.shape 67 #print(np_img_height, np_img_width) 68 69 def PublishImages(image_name, image_number_str, app): 70 f = open(image_name, 'rb') 71 filecontent = f.read() 72 byteArr = bytes(filecontent) 73 publish.single("iot/iscc19/image/"+app+"/image_name", image_number_str, qos=1, hostname=os.environ['BROKER']) 74 publish.single("iot/iscc19/image/"+app+"/image", byteArr, qos=1, hostname=os.environ['BROKER']) 75 76 def RandomNumber(random_range): 77 random_number = random.randint(0, random_range-1) 78 diff = len(str(random_range)) - 1 - len(str(random_number)) 79 add_0 = '' 80 for i in range(diff): 81 add_0 += '0' 82 random_n_str = add_0 + str(random_number) 83 return random_n_str 84 85 if __name__ == '__main__': 86 if len(sys.argv) < 2: 87 date_time = datetime.now().strftime("%m%d_%H%M/") 88 image_folder = 'original/' + date_time 89 else: 90 image_folder = sys.argv[1] if sys.argv[1][-1] == '/' else sys.argv[1]+'/' 91 try: os.makedirs(image_folder) 92 except: pass 93 IMAGEHEAD = image_folder + IMAGEHEAD 94 #k = 0 95 while True: 96 tic = time.clock() 97 #if k > 0: break 98 # Read QoSknob.txt 99 qos_knob_list = readQosKnob() 100 101 # Download image from stream server 102 # Produce a random number 103 while True: 104 random_n_str = RandomNumber(RANDOMRANGE) 105 try: original_image = download(random_n_str) 106 except: continue 107 #else: break 108 109 #print('original_image: ' + original_image) 110 111 # Resize and Publish 112 # Resize knob = 1 113 image_1 = 'image_1.0' + '.jpg' 114 # 600x800 (55KB) to 186x248 (24KB), use ratio 0.31 115 try: resize(RATIO1, original_image, image_1) 116 except: continue 117 else: break 118 ## Resize knob = 0.844 119 #image_max = 'image_' + str(MAXKNOB) + '.jpg' 120 #resize(MAXKNOB, image_1, image_max) 121 # Resize knob = 0 122 image_zero = 'image_' + str(ZEROKNOB) +'.jpg' 123 resize(ZEROKNOB, image_1, image_zero) 124 125 # Resize images according to QoSknob.txt 126 resize_knobs = [ZEROKNOB, 1] 127 resize_apps = [] 128 for app in qos_knob_list: 129 app_name = list(app.keys())[0] 130 knob = app[app_name] 131 image_name = 'image_' + str(knob) + '.jpg' 132 if knob not in resize_knobs: 133 resize(knob, image_1, image_name) 134 resize_knobs.append(knob) 135 # Publish to the cloud server 136 # Produce random number for postfix 137 #postfix_n_str = RandomNumber(POSTFIXRANGE) 138 print('image_name: ' + image_name) 139 #print('image_number: ' + random_n_str+'_'+postfix_n_str) 140 print('image_number: ' + random_n_str) 141 print('app_name: ' + app_name) 142 #PublishImages(image_name, random_n_str+'_'+postfix_n_str, app_name) 143 PublishImages(image_name, random_n_str, app_name) 144 #if app_name not in resize_apps: resize_apps.append(app_name) 145 #print('resize_apps', resize_apps) 146 147 ''' 148 # Resize images for apps not in QoSknob.txt 149 for app in all_apps: 150 if app not in resize_apps: 151 # Publish to the cloud server 152 # Produce random number for postfix 153 postfix_n_str = RandomNumber(POSTFIXRANGE) 154 print('image_name: ' + image_zero) 155 print('image_number: ' + random_n_str+'_'+postfix_n_str) 156 print('app_name: ' + app) 157 PublishImages(image_zero, random_n_str+'_'+postfix_n_str, app) 158 ''' 159 160 toc = time.clock() 161 print('Used time:', toc-tic) 162 time.sleep(TIMEPERIOD) 163 #k += 1 164 #if k == 20: break