OpenCV 查找矩形数并写入视频
OpenCV finding number of rectangles and writing to video
我有一个代码可以使用 haar 级联汽车模型检测汽车,在检测到的汽车周围绘制矩形,并生成一个视频文件。我正在尝试更新代码以显示每帧中检测到的汽车数量。
cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, (450,250))
while True:
ret, img = cap.read()
if ret is False:
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cars = car_cascade.detectMultiScale(gray, 1.1, 2)
cnt=0
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
cv2.putText(img, str(cnt), (10,200), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 2, cv2.LINE_AA)
cnt += 1
cv2_imshow(img)
img=cv2.resize(img,(450,250))
video.write(img)
video.release()
cap.release()
当我执行此操作时,某些帧的数字相互重叠。我只想在每一帧上写一个计数。
不确定为什么会这样,但我尝试设置延迟计时器并调整视频写入帧速度,但没有成功。我不知道这种使用 cnt 来计算汽车的方法是否准确,但是如果有人知道如何解决数字覆盖问题或提出更好的方法来计算每帧中已识别的汽车总数,那就太好了。
我认为您遇到的问题是,对于每辆检测到的汽车,您都会调用函数 cv2.putText(img, str(cnt), (10,200), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 2, cv2.LINE_AA)
,它会为每辆汽车绘制不同的编号。而不是这样做,你应该把这一行放在 for 循环之外。
cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, (450,250))
while True:
ret, img = cap.read()
if ret is False:
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cars = car_cascade.detectMultiScale(gray, 1.1, 2)
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
cv2_imshow(img)
cv2.putText(img, str(len(cars)), (10,200), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 2, cv2.LINE_AA)
img=cv2.resize(img,(450,250))
video.write(img)
video.release()
cap.release()
我有一个代码可以使用 haar 级联汽车模型检测汽车,在检测到的汽车周围绘制矩形,并生成一个视频文件。我正在尝试更新代码以显示每帧中检测到的汽车数量。
cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, (450,250))
while True:
ret, img = cap.read()
if ret is False:
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cars = car_cascade.detectMultiScale(gray, 1.1, 2)
cnt=0
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
cv2.putText(img, str(cnt), (10,200), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 2, cv2.LINE_AA)
cnt += 1
cv2_imshow(img)
img=cv2.resize(img,(450,250))
video.write(img)
video.release()
cap.release()
当我执行此操作时,某些帧的数字相互重叠。我只想在每一帧上写一个计数。
不确定为什么会这样,但我尝试设置延迟计时器并调整视频写入帧速度,但没有成功。我不知道这种使用 cnt 来计算汽车的方法是否准确,但是如果有人知道如何解决数字覆盖问题或提出更好的方法来计算每帧中已识别的汽车总数,那就太好了。
我认为您遇到的问题是,对于每辆检测到的汽车,您都会调用函数 cv2.putText(img, str(cnt), (10,200), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 2, cv2.LINE_AA)
,它会为每辆汽车绘制不同的编号。而不是这样做,你应该把这一行放在 for 循环之外。
cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, (450,250))
while True:
ret, img = cap.read()
if ret is False:
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cars = car_cascade.detectMultiScale(gray, 1.1, 2)
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
cv2_imshow(img)
cv2.putText(img, str(len(cars)), (10,200), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 2, cv2.LINE_AA)
img=cv2.resize(img,(450,250))
video.write(img)
video.release()
cap.release()