Guest User

Untitled

a guest
Jun 24th, 2018
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.18 KB | None | 0 0
  1. #! /usr/bin/env python
  2. # -*- encoding: UTF-8 -*-
  3.  
  4. """Example: Shows how to show live images from Nao using PyQt"""
  5.  
  6. import qi
  7. import argparse
  8. import sys
  9. from PyQt4.QtGui import QWidget, QImage, QApplication, QPainter
  10. from PyQt4 import QtGui, QtCore
  11. from PIL import Image
  12. from PIL import ImageFont
  13. from PIL import ImageDraw
  14. import vision_definitions
  15. import numpy as np
  16.  
  17.  
  18. def main(session, robot_ip, port):
  19.     """
  20.    This is a tiny example that shows how to show live images from Nao using PyQt.
  21.    You must have python-qt4 installed on your system.
  22.    """
  23.     CameraID = 2
  24.  
  25.     # Get the service ALVideoDevice.
  26.  
  27.  
  28.     video_service = session.service("ALVideoDevice")
  29.     app = QApplication([robot_ip, port])
  30.     myWidget = ImageWidget(video_service, CameraID)
  31.     myWidget.show()
  32.     sys.exit(app.exec_())
  33.  
  34.  
  35.  
  36. class ImageWidget(QWidget):
  37.     """
  38.    Tiny widget to display camera images from Naoqi.
  39.    """
  40.     def __init__(self, video_service, CameraID, parent=None):
  41.         """
  42.        Initialization.
  43.        """
  44.         QWidget.__init__(self, parent)
  45.         self.video_service = video_service
  46.         self._image = QImage()
  47.         self.setWindowTitle('Robot')
  48.  
  49.         self._imgWidth = 320
  50.         self._imgHeight = 240
  51.         self._cameraID = CameraID
  52.         self.setFixedSize(self._imgWidth, self._imgHeight)
  53.         # Our video module name.
  54.         self._imgClient = ""
  55.  
  56.         # This will contain this alImage we get from Nao.
  57.         self._alImage = None
  58.  
  59.         self._registerImageClient()
  60.  
  61.         # Trigget 'timerEvent' every 100 ms.
  62.         self.startTimer(100)
  63.  
  64.     def _registerImageClient(self):
  65.         """
  66.        Register our video module to the robot.
  67.        """
  68.         resolution = vision_definitions.kQQQVGA  # 80*60 px
  69.         colorSpace = vision_definitions.kDepthColorSpace
  70.         self._imgClient = self.video_service.subscribe("_client", resolution, colorSpace, 5)
  71.        
  72.  
  73.         # Select camera.
  74.         self.video_service.setParam(vision_definitions.kCameraSelectID, self._cameraID)
  75.  
  76.  
  77.     def _unregisterImageClient(self):
  78.         """
  79.        Unregister our naoqi video module.
  80.        """
  81.         if self._imgClient != "":
  82.             self.video_service.unsubscribe(self._imgClient)
  83.  
  84.  
  85.     def paintEvent(self, event):
  86.         """
  87.        Draw the QImage on screen.
  88.        """
  89.         painter = QPainter(self)
  90.         painter.drawImage(painter.viewport(), self._image)
  91.  
  92.  
  93.     def _updateImage(self):
  94.         """
  95.        Retrieve a new image from Nao.
  96.        """
  97.  
  98.         self._alImage = self.video_service.getImageRemote(self._imgClient)
  99.  
  100.         #lets measure depth of this rectangle on image: (30,25) upper left corner
  101.         # and (40,35) lower right corner
  102.         #assume depth is the same on rectangle
  103.         print self.getDepht(self.get3DImageFromAlValue(self._alImage), [(30,25),(40,35)])
  104.  
  105.         self._image = QImage(self._alImage[6],           # Pixel array.
  106.                              self._alImage[0],           # Width.
  107.                              self._alImage[1],           # Height.
  108.                              QImage.Format_RGB888)
  109.  
  110.     def get3DImageFromAlValue(self, alImage):
  111.         width = alImage[0]
  112.         height = alImage[1]
  113.         pixels = alImage[6]
  114.         im = np.zeros((height, width, 1), dtype=np.uint8)
  115.         index = 0
  116.         for y in range(height):
  117.             for x in range(width):
  118.                 depth = np.zeros(1, dtype=np.uint8)
  119.                 depth[0] = pixels[index]
  120.                 im[y][x] = depth
  121.                 index += 1
  122.         return im
  123.  
  124.     def getDepht(self, im3d, bbox):
  125.         x1 = int(bbox[0][0])
  126.         y1 = int(bbox[0][1])
  127.         x2 = int(bbox[1][0])
  128.         y2 = int(bbox[1][1])
  129.         average = 0.0
  130.         strIm = ""
  131.         num = 0
  132.         for y in range(y1,y2+1):
  133.             strIm += "|"
  134.             for x in range(x1,x2+1):
  135.                 d = im3d[y][x][0]
  136.                 strIm += "{:>3}|".format(d)
  137.                 average += 1.0*d
  138.                 num += 1
  139.             strIm += "\n"
  140.         print strIm
  141.         return average/num
  142.  
  143.     def timerEvent(self, event):
  144.         """
  145.        Called periodically. Retrieve a nao image, and update the widget.
  146.        """
  147.         self._updateImage()
  148.         self.update()
  149.  
  150.  
  151.     def __del__(self):
  152.         """
  153.        When the widget is deleted, we unregister our naoqi video module.
  154.        """
  155.         self._unregisterImageClient()
  156.  
  157.  
  158. if __name__ == "__main__":
  159.     parser = argparse.ArgumentParser()
  160.     parser.add_argument("--ip", type=str, default="127.0.0.1",
  161.                         help="Robot IP address. On robot or Local Naoqi: use '127.0.0.1'.")
  162.     parser.add_argument("--port", type=int, default=9559,
  163.                         help="Naoqi port number")
  164.  
  165.     args = parser.parse_args()
  166.     session = qi.Session()
  167.     try:
  168.         session.connect("tcp://" + args.ip + ":" + str(args.port))
  169.     except RuntimeError:
  170.         print ("Can't connect to Naoqi at ip \"" + args.ip + "\" on port " + str(args.port) +".\n"
  171.                "Please check your script arguments. Run with -h option for help.")
  172.         sys.exit(1)
  173.     main(session, args.ip, args.port)
Add Comment
Please, Sign In to add comment