【问题标题】:opencv getImage() erroropencv getImage() 错误
【发布时间】:2011-08-09 02:21:12
【问题描述】:

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

更新 1:我使用此处的代码 in a separate Stack Overflow question 测试了 cv.QueryFrame(capture) 并且它有效;所以我几乎将其归结为网络摄像头问题。

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

【问题讨论】:

    标签: python opencv simplecv


    【解决方案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)
    

    【讨论】:

    • 感谢 HYRY。我运行了两个测试,它们都提供了frame=='None' 的证据,这确实不是 IplImage 或 CvMat。我的网络摄像头绝对可以与 Skype 配合使用,我还在 testmycam.com 上对其进行了测试……我注意到 getImage(self) 定义中包含一条评论:“如果您遇到来自相机硬件缓冲区的陈旧帧问题,请增加在检索之前刷新缓存号以使多个帧出队” ...您会怀疑这是一个问题吗?如果是这样,我将在哪里修改此参数?再次感谢。
    【解决方案2】:

    回答我自己的问题...

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        所以你想这样做:

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

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

        【讨论】:

          【解决方案5】:

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

          这个修复也将在 SimpleCV 的 1.2 版本中(现在在 master 分支中)

          【讨论】:

            猜你喜欢
            • 2021-02-28
            • 1970-01-01
            • 2012-07-14
            • 2012-12-27
            • 2011-10-11
            • 2012-03-16
            • 2018-08-06
            • 2013-02-24
            • 2013-05-03
            相关资源
            最近更新 更多