opencv getImage() 错误
今天我用简单的Python接口把opencv包裹了一下。看了官方的SimpleCV食谱后,我成功地加载、保存和处理了图片。所以我知道这个库加载得没问题。
不过,在使用摄像头、Kinect或虚拟摄像头的部分,我在运行一些命令时遇到了麻烦。特别是,mycam = Camera()
这行代码可以正常工作,但img = mycam.getImage()
却出现了以下错误:
In [35]: img = mycam.getImage().save()
OpenCV Error: Bad argument (Array should be CvMat or IplImage) in cvGetSize, file /home/jordan/OpenCV-2.2.0/modules/core/src/array.cpp, line 1237
---------------------------------------------------------------------------
error Traceback (most recent call last)
/home/simplecv/<ipython console> in <module>()
/usr/local/lib/python2.7/dist-packages/SimpleCV-1.1-py2.7.egg/SimpleCV/Camera.pyc in getImage(self)
332
333 frame = cv.RetrieveFrame(self.capture)
--> 334 newimg = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 3)
335 cv.Copy(frame, newimg)
336 return Image(newimg, self)
error: Array should be CvMat or IplImage
我在HP TX2500平板上运行Ubuntu Natty。它有一个内置的摄像头(好像是CyberLink Youcam?)。有没有人见过这个错误?今天我在网上找了很多解决办法,但似乎都没用。
更新 1: 我测试了cv.QueryFrame(capture),使用的是另一个Stack Overflow问题里的代码,结果是可以的;所以我基本上可以确定这是摄像头的问题。
更新 2: 事实上,我在一台根本没有摄像头的机器上也遇到了完全相同的错误!看起来TX2500可能不兼容...
5 个回答
我正在使用OpenCV获取摄像头。
from opencv import cv
from opencv import highgui
from opencv import adaptors
def get_image()
cam = highgui.cvCreateCameraCapture(0)
im = highgui.cvQueryFrame(cam)
# Add the line below if you need it (Ubuntu 8.04+)
#im = opencv.cvGetMat(im)
return im
因为错误是从SimpleCV的Camera.py文件中产生的,所以你需要调试一下getImage()这个方法。如果你能编辑这个方法:
def getImage(self):
if (not self.threaded):
cv.GrabFrame(self.capture)
frame = cv.RetrieveFrame(self.capture)
import pdb # <-- add this line
pdb.set_trace() # <-- add this line
newimg = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 3)
cv.Copy(frame, newimg)
return Image(newimg, self)
然后运行你的程序,它会在pdb.set_trace()的地方暂停,这时你可以检查一下frame的类型,试着找出如何获取frame的大小。
或者你可以在你的代码中进行捕捉,并检查frame对象:
mycam = Camera()
cv.GrabFrame(mycam.capture)
frame = cv.RetrieveFrame(mycam.capture)
我来回答我自己的问题...
今天我买了一个Logitech C210摄像头,问题就解决了。
现在我收到了这样的警告:
Corrupt JPEG data: X extraneous bytes before marker 0xYY
。
不过,我现在可以通过 JpegStreamer()
成功地把视频流推送到我的网页浏览器上。如果我不能解决这个错误,我会再开一个新帖子。
所以现在,我就把问题归咎于TX2500了。
如果以后有人找到解决办法,请分享一下。
感谢@HYRY的调查,真心谢谢。