我正在研究使用哈尔级联在视频中检测汽车的项目。它运转良好,但仍然有点不稳定,比如意外的物体不是汽车被检测到并在一秒钟或两秒钟内消失。所以我试图把被检测物体的坐标逻辑突然改变,这不是我们所期望的,但是如果它没有太大改变,那就是汽车。所以,我创建了下面的代码将列表中的参数中的值分配给新阵列
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' ...因为这些是两个不同的对象,请给它们不同的名称! –