Мне нужно обнаружить цилиндр, который появляется на изображении. Мне нужно с точностью получить его края (левый и правый края).
Поскольку камера всегда захватывает изображения, при удалении фонового изображения остается только объект, находящийся на переднем плане. Но проблема в том, что вычитание изображения не очень точное. А также, когда объект присутствует, я создаю тени на заднем плане и разницу в освещении, которое изменяет фоновое изображение. Также свет может меняться в течение дня.
фон Передний план с объектом (цилиндр)
Мне нужно сделать это на изображении или максимум 5 (MOG не будет работать, я думай как нужно видео). Мне нужна техническая обработка для кадра за кадром.
Это подход, который я использовал, используя библиотеку, найденную в inte rnet для вычитания фона на изображениях (PlantCV):
def detection(foreground,background) :
foreground = cv2.cvtColor(foreground, cv2.COLOR_BGR2GRAY)
background = cv2.cvtColor(background, cv2.COLOR_BGR2GRAY)
bkg_sub_img = pcv.image_subtract(foreground,background)
bkg_sub_thres_img, masked_img = pcv.threshold.custom_range(rgb_img=bkg_sub_img, lower_thresh=[0],
upper_thresh=[150], channel='gray')
lp_img = pcv.laplace_filter(gray_img=masked_img, ksize=1, scale=1)
bkg_sub_img = pcv.image_subtract(foreground,lp_img)
cannyed = auto_canny(bkg_sub_img)
lines = cv2.HoughLinesP(
cannyed,
cv2.HOUGH_PROBABILISTIC,
theta=np.pi / 180,
threshold=20,
lines=np.array([]),
minLineLength=200,
maxLineGap=50,
)
if lines is None:
result = None
err = "No pipe detected"
elif len(lines) < 2:
result = None
err = "Only one edge of the pipe is detected"
left_edge=[[5000,0,0,0]]
righ_edge=[[0,0,0,0]]
if lines is not None:
for l in lines:
x0 = l[0][0]
y0 = l[0][1]
x1 = l[0][2]
y1 = l[0][3]
angle = math.degrees(math.atan2(y0 - y1, x0 - x1))
if 85<np.abs(angle) < 95 :
if x0 < left_edge[0][0] :
left_edge=l
if x0 > righ_edge[0][0] :
righ_edge=l
Рабочий процесс прост: 1 - вычитание фона использование PlantCV 2 - обнаружение острых краев 3 - обнаружение грубых линий 4 - оставьте только края цилиндра (большинство левых и правых линий)
Спасибо