48

我正在尝试制作一个将 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()
4

17 回答 17

24

此错误消息

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

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

cap = cv2.VideoCapture(1) 

代替

cap = cv2.VideoCapture(0) 

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

于 2015-11-20T06:02:23.947 回答
17

我有同样的问题,修复捕获视频中的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()
于 2017-01-16T08:18:37.730 回答
9

我有这个问题。

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

如果路径包含(例如:)\n or \t or \a它会增加损坏。因此,将每个反斜杠“\”更改为正斜杠“/”,不会产生错误,但可以解决读取路径的问题。

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

于 2018-07-13T19:11:09.987 回答
6

你必须延迟

示例代码:

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()
于 2016-08-04T16:59:32.667 回答
4

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

于 2018-12-17T09:22:54.187 回答
2

在这两行中:

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)

我有同样的问题,变量被返回为空

于 2016-08-29T13:11:49.970 回答
1

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

须藤 modprobe bcm2835-v4l2

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

于 2018-01-24T07:20:52.167 回答
1

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

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

于 2019-10-18T12:57:27.580 回答
0

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

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

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

于 2019-03-13T10:10:50.350 回答
0
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)
于 2015-12-22T07:50:20.953 回答
0

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

于 2020-01-02T17:09:57.820 回答
0

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

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

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

usermod -a -G video user
于 2017-11-15T13:34:41.940 回答
0

我在尝试打开包含空格和特殊字符的图像时遇到了同样的问题,例如名称中的以下 '

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

于 2021-02-02T14:16:14.687 回答
0

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

于 2018-04-23T09:55:19.547 回答
0

cv2.circle并且cv2.lines不工作。面具和框架都回来了None。这些函数(线和圆)在 opencv 3 中,但不在旧版本中。

于 2016-11-11T10:44:36.557 回答
-1

只需使用图像扩展名.jpeg.png.

于 2019-03-23T14:20:45.090 回答
-1

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

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

于 2017-08-18T18:39:00.040 回答