我正在尝试制作一个将Haar Cascade Classification与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()
答案 0 :(得分:14)
此错误消息
错误:( - 1515)size.width&gt; 0&amp;&amp;函数imshow中的size.height&gt; 0
只是意味着imshow()没有从输入设备获取视频帧。 您可以尝试使用
cap = cv2.VideoCapture(1)
而不是
cap = cv2.VideoCapture(0)
&安培;看看问题是否仍然存在。
答案 1 :(得分:9)
我遇到同样的问题,修复了捕获视频中的视频
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()
答案 2 :(得分:3)
你必须延迟
示例代码:
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()
答案 3 :(得分:3)
我也遇到了这个问题,我通过更改图像的路径来解决它,因为如果路径包含(例如:\ n或\ t或\ a),它将导致损坏,因此只需更改每个反斜杠“ \ “加上反斜杠” /“,并且仅解决读取路径问题就不会出错
答案 4 :(得分:2)
我也遇到了这个问题。就我而言,图像路径错误,因此读取的img为NoneType
。校正图像路径后,可以毫无问题地显示它。
答案 5 :(得分:1)
在这两行中:
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)
我遇到了同样的问题,变量被空了
答案 6 :(得分:1)
该错误还会在视频正常播放时显示,并且脚本将完成,但始终会引发该错误,因为在消耗完所有帧后,imshow()将获得空帧。
如果正在播放短(几秒钟)的视频文件,而您没有注意到视频实际上是在后台(在代码编辑器后面)播放的,则脚本以该错误结束,尤其是这种情况。
答案 7 :(得分:0)
我也遇到了raspberry pi 3中的错误信息,但我的解决方案是在谷歌搜索后重新加载相机内核,希望它可以帮到你。
sudo modprobe bcm2835-v4l2
BTW,对于此错误,请检查您的相机和文件路径是否可行
答案 8 :(得分:0)
我在尝试打开包含空格和特殊字符的图像时遇到了同样的问题 像下面这样的字符´
因此,在修改图像名称并删除它们的空格和特殊字符后,一切正常。
答案 9 :(得分:0)
如果对负点进行切片并将其传递给数组,也会发生此错误。因此,请检查您是否
答案 10 :(得分:0)
尽管这是一个旧线程,但我也遇到了此错误,这里没有提及对我有用的解决方案。
简单地说,就我而言,当我看到LED灯亮着时,网络摄像头仍在背景中使用。我尚未能够重现该问题,因此我不确定简单的cv2.VideoCapture(0).release()
是否可以解决问题。如果发现该帖子,我将对其进行编辑。
对我来说,重新启动PC可以解决此问题,而无需更改代码。
答案 11 :(得分:0)
这是空间消耗或选择错误的相机的问题。 我的建议是重新启动内核并清除输出并再次运行它。 它适用。
答案 12 :(得分:0)
我使用ssh连接到远程服务器并使用python代码执行cv2.VideoCapture(0)来捕获远程网络摄像头,然后遇到此错误消息:
错误:( - 1515)size.width&gt; 0&amp;&amp;函数imshow中的size.height&gt; 0
最后,我必须使用我的用户帐户授予对/ dev / video0(这是我的网络摄像头设备)的访问权限,并且错误消息已消失。使用usermod将用户添加到群组视频
usermod -a -G video user
答案 13 :(得分:0)
cv2.circle
和cv2.lines
无效。掩码和帧都返回None
。这些函数(直线和圆)在opencv 3中,但在旧版本中没有。
答案 14 :(得分: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)
答案 15 :(得分:-1)
只需使用.jpeg
或.png
之类的图像扩展名即可。
答案 16 :(得分:-1)
检查python27根目录中是否有&#34; opencv_ffmpeg330.dll&#34; 或您正在使用的python版本。如果没有,你会在&#34; .... \ OpenCV \ opencv \ build \ bin&#34; 中找到它。
选择适当的版本并将dll复制到python安装的根目录并重新运行程序