【问题标题】:How to transform the string containing image information to numpy.ndarray?如何将包含图像信息的字符串转换为numpy.ndarray?
【发布时间】:2018-01-30 14:14:05
【问题描述】:

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

【问题讨论】:

  • 我想我在方法 showImage 中组织数据的方式是错误的。

标签: python numpy nao-robot


【解决方案1】:

我找到了解决方案。 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()

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 2019-08-31
    • 2015-07-21
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多