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