4

我今天用 simplecv python 接口包装了 opencv。在浏览了官方的SimpleCV Cookbook之后,我能够成功地加载、保存操作图像。因此,我知道库正在正确加载。

但是,在使用相机、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。它有一个内置的网络摄像头(Cyber​​Link Youcam?)以前有人见过这个错误吗?我今天一直在网上寻找解决方案,但似乎没有任何效果。

更新 1 :我使用在一个单独的 Stack Overflow 问题中找到的代码测试了 cv.QueryFrame(capture)并且它有效;所以我几乎把它归结为网络摄像头问题。

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

4

5 回答 5

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)
于 2011-08-09T03:15:05.383 回答
0

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

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

Corrupt JPEG data: X extraneous bytes before marker 0xYY.

但是,我可以通过JpegStreamer(). 如果我无法解决此错误,我将打开一个新线程。

因此,现在,我将责怪 TX2500。如果有人在将来找到修复程序,请发布。

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

于 2011-08-09T20:42:56.133 回答
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
于 2011-08-09T23:13:34.107 回答
0

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

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

所以你想做:

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

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

于 2011-10-10T19:02:28.727 回答
0

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

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

于 2011-10-18T15:31:28.813 回答