我今天用simplecv python接口包装了opencv。完成官方SimpleCV Cookbook后,我能够成功Load, Save和Manipulate张图片。因此,我知道正确加载了库。
然而,在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不兼容...
答案 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版本中(现在在主分支中)