-3

I get the image information from Nao Robot's camera but the information is store in the string.My idea is to get the acsii of the characters and transform acsii into an instance of ndarray.But I failed. Is my idea wrong? Or did I make a mistake during the process of thransforming.The error is that source image must have 1, 3 or 4 channels in function cv.ConvertImage. Here is the code:

import sys  
import cv2 as cv  
from naoqi import ALProxy  
import vision_definitions  
from numpy import array

class OpenCVModule():  
    def __init__(self, IP, PORT, CameraID):  
        print CameraID
        self._videoProxy = None  
        self._cameraID = CameraID  
        self._resolution = vision_definitions.kQVGA  # 320 * 240  
        self._colorSpace = vision_definitions.kBGRColorSpace  
        self._fps = 20  
        self._imgClient = ""  
        self._imgData = None  
        cv.namedWindow("Camera_OpenCV", 0)  
        self._registerImageClient(IP, PORT)  

    def _registerImageClient(self, IP, PORT):  
        self._videoProxy = ALProxy("ALVideoDevice", IP, PORT)  
        self._imgClient = self._videoProxy.subscribeCamera("OpenC", 0, self._resolution, self._colorSpace,self._fps)
        print self._imgClient
    def _unregisterImageClient(self):  
        if self._imgClient != "":  
            self._videoProxy.unsubscribe(self._imgClient)  

    def showImage(self):  
        while True:  
            #try:  
            self._imgData = self._videoProxy.getImageRemote(self._imgClient)  
            one=[[[] for i in range(240)] for j in range(3)]
            o=0
            k=0
            j=0
             #self._img=array(self._imgData[6]).astype(int)
            for i in range(len(self._imgData[6])):
                one[o][k].append(ord(self._imgData[6][i]))
                j+=1
                if j==320:
                    j=0
                    k+=1
                    if k==240:
                        k=0
                        o+=1
            self._img=array(one).astype(int)          
            cv.imshow("Camera_OpenCV2", self._img)  
            #except KeyboardInterrupt:  
                #break  
            #except:  
                #pass  
            if cv.waitKey(20) == 27:
                break
        cv.DestroyAllWindows()  
        self._unregisterImageClient()  

if __name__ == '__main__':  
    IP = "192.168.1.105"   
    PORT = 9559  
    CameraID = 0  
    if len(sys.argv) > 1:  
        IP = sys.argv[1]  
    if len(sys.argv) > 2:  
        CameraID = int(sys.argv[2])  
    myWidget = OpenCVModule(IP, PORT, CameraID)  
    myWidget.showImage()  
lcq
  • 1
  • 5

1 Answers1

0

I found the solution to it. Image.frombytes is a effective method. Here is the comeplete code.

#!/usr/bin/env python  
# -*- coding: utf-8 -*-  
# This is a tiny example that shows how to show live images from Nao        using OpenCV.  
import sys  
import cv2 as cv  
from cv2 import COLOR_RGB2BGRA
from naoqi import ALProxy  
import vision_definitions  
from numpy import array
from PIL import Image
class OpenCVModule():  
    def __init__(self, IP, PORT, CameraID):  
        print CameraID
        self._videoProxy = None  
        self._cameraID = CameraID  
        self._resolution = vision_definitions.kVGA  # 320 * 240  
        self._colorSpace = vision_definitions.kBGRColorSpace  
        self._fps = 30  
        self._imgClient = ""  
        self._imgData = None  
        cv.namedWindow("Camera_OpenCV", 0)  
        self._registerImageClient(IP, PORT)  

    def _registerImageClient(self, IP, PORT):  
        self._videoProxy = ALProxy("ALVideoDevice", IP, PORT)  
        self._imgClient = self._videoProxy.subscribeCamera("OpenC", 0, self._resolution, self._colorSpace,self._fps)  
        print self._imgClient
    def _unregisterImageClient(self):  
        if self._imgClient != "":  
            self._videoProxy.unsubscribe(self._imgClient)  

    def showImage(self):  
        while True:  
            try:  
                self._imgData = self._videoProxy.getImageRemote(self._imgClient)  
                width=self._imgData[0]                                           
                height=self._imgData[1]
                ima_data=self._imgData[6]                            
                Nao_ima=Image.frombytes('RGB',(width,height),ima_data)           
                Nao_ima=cv.cvtColor(array(Nao_ima),COLOR_RGB2BGRA)
                cv.imshow("Camera_OpenCV2", Nao_ima)  
            except KeyboardInterrupt:  
                break  
            except:  
                pass  
            if cv.waitKey(5) == 27:                                             
            break
        cv.destroyAllWindows()  
        self._unregisterImageClient()  

if __name__ == '__main__':  
    IP = "192.168.1.104"   
    PORT = 9559  
    CameraID = 0  
    if len(sys.argv) > 1:  
        IP = sys.argv[1]  
    if len(sys.argv) > 2:  
        CameraID = int(sys.argv[2])  
    myWidget = OpenCVModule(IP, PORT, CameraID)  
    myWidget.showImage()
lcq
  • 1
  • 5