【发布时间】:2017-08-04 08:18:55
【问题描述】:
我正在开展一个项目,以使用 haar 级联检测视频中的汽车。它工作正常,但仍然有点不稳定,例如检测到不是汽车的意外物体并在一两秒内消失。所以我试着把检测到的物体的坐标突然变化的逻辑,这不是我们所期望的,但如果它没有太大变化,那就是汽车。所以我创建了以下代码
import cv2
cap = cv2.VideoCapture('C:\\Users\\john\\Desktop\\bbd3.avi')
car_cascade = cv2.CascadeClassifier('C:\\Users\\john\\Desktop\\cars.xml')
i=0
x = [None] * 10000000
y = [None] * 10000000
while (cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
roi_gray = gray[0:480, 100:300]
roi_color = frame[0:480, 100:300]
# roi_gray defines area in the video that we will apply haar cascade detection
# we add roi_color with same area to draw rectangle on the color frame axis
cars = car_cascade.detectMultiScale(roi_gray, 1.05, 5, minSize=(30,30) )
# we can specify the value of certain parameter by mentioned name of that parameter before that value. parameter is image, scalefactor, minneigbors, minsize.
for (x,y,w,h) in cars:
x[i]=x
y[i]=y
if i>= 1:
if abs(x[i]-x[i-1]) < 10 and abs(y[i]-y[i-1]) < 10 :
cv2.rectangle(roi_color, (x,y), (x+w,y+h), (255,0,0),2)
cv2.imshow('frame', frame)
i=i+1
if cv2.waitKey(1) == 27:
break
cv2.destroyAllWindows()
此处detectmultiscale返回检测到的对象所在的矩形列表。它基本上是创建一个空数组并将左下坐标分配给数组并在连续帧之间进行比较。但是它一直在返回
TypeError: 'numpy.int32' object does not support item assignment
那么我能知道为什么会发生这种情况以及如何解决它吗?提前致谢。
*另外,对于之前没有处理过opencv的人,detectmultiscale会返回矩形列表,但是根据视频中检测到的对象数量,可以返回多个矩形。例如,如果在第一帧中检测到一辆车,则仅返回一个矩形,但如果在第二帧中检测到三辆汽车,则返回三个矩形。我认为这是这里的主要问题。将多个值分配给一个参数 x[i]。但是,如果我不知道一帧中将给出多少数据,如何将值分配给固定数组?
【问题讨论】:
-
请发布错误的完整回溯。
-
您首先创建一个名为
x的列表,然后在您的for循环中命名其他名称x...因为这是两个不同的对象,所以给它们不同的名称!