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