如何将包含图像信息的字符串转换为numpy.ndarray



我从Nao Robot的相机获取图像信息,但信息存储在字符串中。我的想法是获取字符的 acsii 并将 acsii 转换为 ndarray 的实例。但我失败了。我的想法错了吗?还是我在王座成型的过程中犯了错误。错误是源图像在函数 cv.ConvertImage 中必须有 1、3 或 4 个通道。这是代码:

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()  

我找到了解决方案。 Image.frombytes 是一种有效的方法。这是完整的代码。

#!/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()

最新更新