【问题标题】:OpenCV Error: (-215)size.width>0 && size.height>0 in function imshowOpenCV 错误:(-215)size.width>0 && size.height>0 in function imshow
【发布时间】:2015-03-13 05:37:40
【问题描述】:

我正在尝试制作一个将 Haar Cascade 分类与 Lucas Kanade 良好特征检测相结合的面部跟踪器。但是,我不断收到一个错误,我无法弄清楚这意味着什么,也无法解决它。

谁能帮帮我?

错误:

line 110, in <module>
cv2.imshow('frame',img)
error: /build/buildd/opencv-2.4.8+dfsg1/modules/highgui/src/window.cpp:269: 
error: (-215)size.width>0 && size.height>0 in function imshow

代码:

from matplotlib import pyplot as plt
import numpy as np

import cv2

face_classifier = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')


cap = cv2.VideoCapture(0)


# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 200,
                       qualityLevel = 0.01,
                       minDistance = 10,
                       blockSize = 7 )

# Parameters for lucas kanade optical flow
lk_params = dict( winSize  = (15,15),
                  maxLevel = 2,
                  criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

# Create some random colors
color = np.random.randint(0,255,(100,3))

# Take first frame and find corners in it
ret, old_frame = cap.read()



cv2.imshow('Old_Frame', old_frame)
cv2.waitKey(0)
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
restart = True
#while restart == True:
face = face_classifier.detectMultiScale(old_gray, 1.2, 4)

if len(face) == 0:
    print "This is empty"

for (x,y,w,h) in face:
    focused_face = old_frame[y: y+h, x: x+w]

cv2.imshow('Old_Frame', old_frame)

face_gray = cv2.cvtColor(old_frame,cv2.COLOR_BGR2GRAY)

gray = cv2.cvtColor(focused_face,cv2.COLOR_BGR2GRAY)

corners_t = cv2.goodFeaturesToTrack(gray, mask = None, **feature_params)
corners = np.int0(corners_t)

print corners

for i in corners:
    ix,iy = i.ravel()
    cv2.circle(focused_face,(ix,iy),3,255,-1)
    cv2.circle(old_frame,(x+ix,y+iy),3,255,-1)

plt.imshow(old_frame),plt.show()


# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)

while(1):
    ret,frame = cap.read()
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # calculate optical flow
    p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, corners_t, None, **lk_params)

    # Select good points
    good_new = p1[st==1]
    good_old = corners_t[st==1]

    # draw the tracks
    print "COLORING TIME!"
    for i,(new,old) in enumerate(zip(good_new,good_old)):
        print i
        print color[i]
        a,b = new.ravel()
        c,d = old.ravel()
        mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
        frame = cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
        if i == 99:
            break
    img = cv2.add(frame,mask)

    cv2.imshow('frame',img)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

    # Now update the previous frame and previous points
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1,1,2)

cv2.destroyAllWindows()
cap.release()

【问题讨论】:

  • 这一行:cv2.imshow('Old_Frame', old_frame_resized) old_frame_resized 定义在哪里?
  • 哦不好意思,其实是cv2.imshow('Old_Frame', old_frame)。这个错误仍然存​​在
  • 知道是哪个imshow 抛出了错误吗?该错误可能意味着图像为空。我建议检查 cap.read() 返回值,特别是 ret 的值为 False,表示捕获失败。
  • 我同意@cziemba。我在 opencv 文档(Getting Started with Videos) 中找到了以下内容: cap.read() 返回一个布尔值(真/假)。如果帧被正确读取,它将是 True。因此,您可以通过检查此返回值来检查视频的结尾。有时,cap 可能没有初始化捕获。在这种情况下,此代码显示错误。你可以通过cap.isOpened()方法检查它是否被初始化。如果是真的,好的。否则使用 cap.open() 打开它。
  • 我以前也遇到过一些问题,VideoCapture的前几帧可以是空的,都是空值。当然,从相机而不是视频中阅读时。

标签: python image opencv computer-vision opencv3.0


【解决方案1】:

我在尝试打开包含空格和特殊字符的图像时遇到了同样的问题 像下面这样的字符在他们的名字中

因此,在修改图像名称删除其空格和特殊字符后,一切正常。

【讨论】:

    【解决方案2】:

    我遇到了这个问题。

    解决方法:更新图片路径。

    如果路径包含(例如:\n or \t or \a),则会增加损坏。因此,将每个反斜杠“\”换成正斜杠“/”,这样不会产生错误,而是解决读取路径的问题。

    还要仔细检查文件路径/名称。名称或路径中的任何拼写错误也会产生相同的错误。

    【讨论】:

    • 谢谢,这也是我的 Windows 路径问题
    • 我遇到了同样的问题,发现文件名有错别字。感谢您的回答!
    【解决方案3】:

    如果您切片负点并将其传递给数组,也会发生此错误。所以检查你是否这样做了

    【讨论】:

      【解决方案4】:

      该错误还显示视频播放正常并且脚本将完成但该错误总是抛出,因为 imshow() 将在所有帧都被消耗后得到空帧。

      如果您正在播放一个短(几秒)的视频文件,而您没有注意到视频实际上是在后台(在您的代码编辑器后面)播放的,然后脚本以该错误结束,则尤其如此。

      【讨论】:

        【解决方案5】:

        只需使用像 .jpeg.png 这样的图片扩展名。

        【讨论】:

          【解决方案6】:

          虽然这是一个旧线程,但我也遇到了这个错误,这里没有提到对我有用的解决方案。

          简单地说,就我而言,网络摄像头仍在后台使用,因为我看到 LED 灯亮着。我还不能重现这个问题,所以我不确定一个简单的cv2.VideoCapture(0).release() 会解决它。如果我发现了这篇文章,我会编辑它。

          对我来说,重新启动我的电脑解决了这个问题,而无需对代码进行任何更改。

          【讨论】:

            【解决方案7】:

            我也遇到过这个问题。在我的情况下,图像路径是错误的,所以读取的 img 是NoneType。在我更正图像路径后,我可以毫无问题地显示它。

            【讨论】:

              【解决方案8】:

              这是空间消耗或选择错误相机的问题。 我的建议是重新启动内核并清除输出并再次运行它。 然后就可以了。

              【讨论】:

                【解决方案9】:

                我在树莓派 3 中也遇到了错误信息,但我的解决方法是在谷歌搜索后重新加载相机内核,希望对您有所帮助。

                sudo modprobe bcm2835-v4l2

                顺便说一句,对于这个错误,请检查您的相机和文件路径是否可行

                【讨论】:

                  【解决方案10】:

                  我使用 ssh 连接到远程服务器并让 python 代码执行 cv2.VideoCapture(0) 来捕获远程网络摄像头,然后遇到此错误消息:

                  错误:(-215)size.width>0 && size.height>0 in function imshow

                  最后,我必须使用我的用户帐户授予对 /dev/video0(这是我的网络摄像头设备)的访问权限,并且错误消息消失了。使用 usermod 将用户添加到组视频中

                  usermod -a -G video user
                  

                  【讨论】:

                    【解决方案11】:

                    你必须延迟

                    示例代码:

                    import cv2
                    import numpy as np
                    import time
                    
                    cam = cv2.VideoCapture(0)
                    time.sleep(2)
                    
                    while True:
                        ret,frame = cam.read()
                        cv2.imshow('webcam', frame)
                        if cv2.waitKey(1)&0xFF == ord('q'):
                            break
                    
                    cam.release()
                    cv2.destroyAllWindows()
                    

                    【讨论】:

                      【解决方案12】:

                      这个错误信息

                      错误:(-215)size.width>0 && size.height>0 in function imshow

                      仅仅意味着 imshow() 没有从输入设备获取视频帧。 您可以尝试使用

                      cap = cv2.VideoCapture(1) 
                      

                      而不是

                      cap = cv2.VideoCapture(0) 
                      

                      & 查看问题是否仍然存在。

                      【讨论】:

                      • 哈哈哈我很高兴这是一个如此简单的错误。非常感谢!!!
                      【解决方案13】:

                      检查您是否在python27根目录或您正在使用的python版本中有“opencv_ffmpeg330.dll”。如果没有,您将在 "....\OpenCV\opencv\build\bin" 中找到它。

                      选择合适的版本,将dll复制到你的python安装的根目录,然后重新运行程序

                      【讨论】:

                      • 不是解决问题的办法!
                      【解决方案14】:

                      我有同样的问题,修复捕获视频中的 ret

                      import numpy as np
                      import cv2
                      
                      # Capture video from file
                      cap = cv2.VideoCapture('video1.avi')
                      
                      while True:
                      
                          ret, frame = cap.read()
                      
                          if ret == True:
                      
                              gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                      
                              cv2.imshow('frame',gray)
                      
                      
                              if cv2.waitKey(30) & 0xFF == ord('q'):
                                  break
                      
                          else:
                              break
                      
                      cap.release()
                      cv2.destroyAllWindows()
                      

                      【讨论】:

                        【解决方案15】:

                        cv2.circlecv2.lines 不工作。掩码和框架都返回None。这些函数(线和圆)在 opencv 3 中,但在旧版本中没有。

                        【讨论】:

                          【解决方案16】:

                          这两行:

                          mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
                          
                          frame = cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
                          

                          试试吧:

                          cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
                          
                          cv2.circle(frame,(a, b),5,color[i].tolist(),-1)
                          

                          我遇到了同样的问题,变量返回为空

                          【讨论】:

                          • 这个解决方案在收到同样的错误后对我有用
                          【解决方案17】:
                          while(cap.isOpened()):
                          
                              ret, img = cap.read()
                              print img
                              if img==None:   #termino los frames?
                                  break   #si, entonces terminar programa
                              #gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                              cv2.imshow('img2',img)
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2020-09-03
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2019-10-18
                            相关资源
                            最近更新 更多