объект на переднем плане с рассеянным светом и тенями - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужно обнаружить цилиндр, который появляется на изображении. Мне нужно с точностью получить его края (левый и правый края).

Поскольку камера всегда захватывает изображения, при удалении фонового изображения остается только объект, находящийся на переднем плане. Но проблема в том, что вычитание изображения не очень точное. А также, когда объект присутствует, я создаю тени на заднем плане и разницу в освещении, которое изменяет фоновое изображение. Также свет может меняться в течение дня.

фон Передний план с объектом (цилиндр)

Мне нужно сделать это на изображении или максимум 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 - оставьте только края цилиндра (большинство левых и правых линий)

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...