У меня есть некоторый код, который предназначен для прямоугольника с определенной областью из обрезных изображений:
def start_trigger():
global start_globaltrig
start_globaltrig = 1
#print ("trigger!!!")
return True
def end_trigger():
global end_globaltrig
end_globaltrig = 1
#print ("trigger!!!")
return True
start_globaltrig = 0
end_globaltrig = 0
c = cv2.VideoCapture('test.mp4')
fps = int(c.get(cv2.CAP_PROP_FPS))
mem_start = 0
out_loop = 0
_,f = c.read()
avg2 = np.float32(f)
while(out_loop==0):
timer = Timer(10, start_trigger)
timer.start()
timer2 = Timer(40, end_trigger)
timer2.start()
_,f = c.read()
cv2.accumulateWeighted(f,avg2,0.005)
res2 = cv2.convertScaleAbs(avg2)
# convert the image to grayscale, blur it, and find edges
# in the image
gray = cv2.cvtColor(res2, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 11, 17, 17)
edged = cv2.Canny(gray, 30, 200)
_, contours, _= cv2.findContours(edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
vertices = cv2.boundingRect(cnt)
x,y,w,h = cv2.boundingRect(cnt)
area = cv2.contourArea(cnt)
if area > 1000 and area < 3000 and start_globaltrig == 1:
interest = vertices
point1 = (interest[0], interest[1])
point2 = (interest[0] + interest[2], interest[1] + interest[3])
cv2.rectangle(f, point1, point2, (255,0,0), 2)
crop_img = f[y:y+h, x:x+w]
cv2.imshow("logo", crop_img)
if mem_start == 0:
sx,sy,sw,sh = cv2.boundingRect(cnt)
mem_start = 1
if end_globaltrig == 1:
fx,fy,fw,fh = cv2.boundingRect(cnt)
##calculate % difference here
crop_final = f[fy:fy+fh, fx:fx+fw]
cv2.imshow("logo_FINAL", crop_final)
out_loop = 1
cv2.imshow('img',f)
cv2.imshow('avg2',edged)
cv2.destroyAllWindows()
c.release(
)
Я создал 2 триггера, предназначенных для сбора определенного ограничивающего прямоугольника, когда сработал 2 триггера, он сравнивает точки x-y-w-h и, если они находятся в толерантном режиме, обрезает изображение.
Моя последняя цель - обнаружить статический (в основном стабильный) прямоугольник, обнаруженный на протяжении всего видео сеанса.
Есть ли самый эффективный способ сделать это с рекурсивной функцией?
Thx