opencv getImage()错误

时间:2011-08-09 02:21:12

标签: python opencv simplecv

我今天用simplecv python接口包装了opencv。完成官方SimpleCV Cookbook后,我能够成功Load, SaveManipulate张图片。因此,我知道正确加载了库。

然而,在Using a Camera, Kinect, or Virtual Camera标题下,我没有成功运行某些命令。特别是,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。它有一个内置的网络摄像头,(讯连科技Youcam?)有没有人见过这个错误?我今天一直在网上寻找解决方案,但似乎没有什么可以做的。

更新1 :我使用此处in a separate Stack Overflow question中的代码测试了cv.QueryFrame(捕获)并且它有效;所以我几乎把它钉在网络摄像头问题上。

更新2 :事实上,我在没有网络摄像头的机器上得到了完全相同的错误!它看起来像TX2500不兼容...

5 个答案:

答案 0 :(得分: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(),在这里你可以检查框架的类型,并试着弄清楚如何获得框架的大小。

或者您可以在代码中执行捕获,并检查框架对象:

mycam = Camera()
cv.GrabFrame(mycam.capture)
frame = cv.RetrieveFrame(mycam.capture)

答案 1 :(得分:0)

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

我今天买了罗技C210,问题就消失了。 我现在收到警告:

Corrupt JPEG data: X extraneous bytes before marker 0xYY

但是,我可以通过JpegStreamer()成功将视频流推送到我的网络浏览器。如果我无法解决此错误,我将打开一个新线程。

因此,现在,我会责怪TX2500。 如果有人在将来发现修复,请发帖。

支持@HYRY进行调查。感谢。

答案 2 :(得分: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

答案 3 :(得分:0)

Anthony,这里的SimpleCV开发人员之一。

此函数不是使用image.save(),而是将文件/视频写入磁盘,而您可能希望使用image.show()。你可以保存,但你需要指定一个文件路径,如image.save(“/ tmp / blah.png”)

所以你想做:

img = mycam.getImage()
img.show()

对于那种型号的相机,我不确定它是否有效。我应该注意到,我们还包装不同的相机类,而不仅仅是OpenCV,这是因为OpenCV的网络摄像头超过640x480,我们现在可以做高分辨率相机。

答案 4 :(得分:0)

另外我应该提一下,我没有意识到,在Ubuntu 11.04及更高版本上,网络摄像头的OpenCV低于2.3。我之前没有意识到这一点,因为我之前运行的是Ubuntu 10.10,你输出的外观你正在使用python 2.7,这让我觉得你在Ubuntu 11.04或更高版本。无论如何,我们已经解决了这个问题。它现在被推送到主人,它基本上检查OpenCV是否正常工作,如果没有,它将回退到pygame。

此修复程序也将出现在SimpleCV的1.2版本中(现在在主分支中)