Как закодировать изображение из дротика, которое можно декодировать с помощью Python и наоборот - PullRequest
0 голосов
/ 18 января 2019

На самом деле я работаю над тем, чтобы связать мое приложение-флаттер с экземпляром виртуальной машины Google. Я установил сервер сокетов python (код ниже) в экземпляре vm, который может взять изображение, декодировать его и затем вызвать мою модель машинного обучения. Более того, после обработки он должен закодировать изображение и отправить его обратно в мое приложение для флаттера.

Ранее я проверил свой экземпляр vm, написав код клиента также на python, где я использовал модуль ** jsonpickle **, который очень хорошо кодирует и декодирует изображение (как будто мне просто нужно сделать код jsonpickle.decode (encoded_image) ) чтобы вернуть массивный массив изображений). Теперь я хочу, чтобы мое приложение-флаттер подключилось к экземпляру vm.

Скажите, пожалуйста, какой модуль dart следует использовать, который может кодировать мои изображения и может быть отправлен через модуль IOWebSocketChannel в dart, а при получении через сервер python в экземпляре vm его можно декодировать в массив numpy. Кроме того, я могу закодировать выходное изображение на сервере Python, которое при отправке на флаттер может быть декодировано в изображение.

Вот мой реализованный client.py (Моя программа, которая успешно отправляет изображения на сервер)

from autobahn.twisted.websocket import WebSocketClientProtocol, \
                                   WebSocketClientFactory
import main
import jsonpickle
import base64
import matplotlib.pyplot as plt
import time
class MyClientProtocol(WebSocketClientProtocol):



def onConnect(self, response):
  print("Server connected: {0}".format(response.peer))

def onOpen(self):
  print("WebSocket connection open.")

  def hello():

     # opening the image file and encoding in base64
     path = "/home/abdullah/Desktop /Clocktower_Panorama_20080622_20mb.jpg"
     image = main.load_image(path)
     encoded = jsonpickle.encode(image)
     # printing the size of the encoded image which is sent
     # print("Encoded size of the sent image: {0} bytes".format(len(encoded_string)))

     # sending the encoded image
     self.sendMessage(encoded.encode('utf-8'))

  hello()


 def onMessage(self, payload, isBinary):
  print("Output processed image received")
  output = main.image_post_process(payload)
  plt.imshow(output)
  plt.show()
  print("Done")
  reactor.stop()

    # plt.show()
   def onClose(self, wasClean, code, reason):
      print("WebSocket connection closed: {0}".format(reason))



 if __name__ == '__main__':
   time1 = time.time()

   import sys

   from twisted.python import log
   from twisted.internet import reactor

   # log.startLogging(sys.stdout)

   factory = WebSocketClientFactory()
   factory.protocol = MyClientProtocol

   reactor.connectTCP("34.73.158.146", 5903, factory)
   # reactor.connectTCP("localhost", 9933, factory)

   reactor.run()
   time2 = time.time()
   print("Total time is ", time2-time1)

Вот мой server.py, реализованный в экземпляре vm.

 rom autobahn.twisted.websocket import WebSocketServerProtocol, \
                                  WebSocketServerFactory

 # import the base64 module
 import base64
 import jsonpickle
 import time

 import main


 class MyServerProtocol(WebSocketServerProtocol):

   def onConnect(self, request):
      print("Client connecting: {0}".format(request.peer))

   def onOpen(self):
      print("WebSocket connection open.")

   def onMessage(self, payload, isBinary):
      print("Message received")
      time1_total = time.time()
      #output = main.main_function(payload)
      #time1 = time.time()
      #encoded = main.send_image_server(output)
      #time2 = time.time()

      #print("Total time to process image is ", time2-time1)


      # echo back message verbatim
      time1 = time.time()
      self.sendMessage(encoded)
      time2 = time.time()
      print("Total time taken to do everything is  ", time2-time1_total)
   def onClose(self, wasClean, code, reason):
      print("WebSocket connection closed: {0}".format(reason))



 if __name__ == '__main__':

   import sys

   from twisted.python import log
   from twisted.internet import reactor

   log.startLogging(sys.stdout)

   factory = WebSocketServerFactory()
   factory.protocol = MyServerProtocol

   reactor.listenTCP(5903, factory)
   reactor.run()

Вот то, что я пытаюсь в своем коде флаттера, чтобы отправить изображение через сокет, но соединение на сервере закрывается сразу после открытия:

File imageFile = new File(imageFilePath);
List<int> imageBytes = imageFile.readAsBytesSync();
String base64Image = BASE64.encode(imageBytes);

Пожалуйста, скажите мне, как я могу преодолеть это или есть ли способ, которым я могу использовать свой вышеупомянутый код client.py во флаттере, чтобы избежать сложностей.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...