opencv getImage() 错误

4 投票
5 回答
3069 浏览
提问于 2025-04-16 23:10

今天我用简单的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 个回答

0

我正在使用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
1

因为错误是从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)
0

我来回答我自己的问题...

今天我买了一个Logitech C210摄像头,问题就解决了。

现在我收到了这样的警告:

Corrupt JPEG data: X extraneous bytes before marker 0xYY

不过,我现在可以通过 JpegStreamer() 成功地把视频流推送到我的网页浏览器上。如果我不能解决这个错误,我会再开一个新帖子。

所以现在,我就把问题归咎于TX2500了。

如果以后有人找到解决办法,请分享一下。

感谢@HYRY的调查,真心谢谢。

撰写回答