LINUX.ORG.RU

Как найти контуры в определенной области изображения с помощью opencv и Python?

 ,


0

1
while(True):

    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    a, b = 0, 0

    height, width, layers = frame.shape
    start_height = height - height
    left_x = width - 500

    #right_area = frame[y:y+height, x:x+300]
    #left_area = frame[y:y+height,]

    black_min = np.array([0, 0, 0], np.uint8)
    black_max = np.array([179, 255, 70], np.uint8)

    red_min = np.array([0, 70, 50], np.uint8)
    red_max = np.array([20, 255, 255], np.uint8)

    red1 = np.array([170, 70, 50], np.uint8)
    red2 = np.array([180, 255, 255], np.uint8)

    red_mask = cv2.inRange(hsv, red1, red2)
    red_mask2 = cv2.inRange(hsv, red_min, red_max)
    kernel = np.ones((7, 7), "uint8")

    red_mask = cv2.dilate(red_mask, kernel)
    res_red = cv2.bitwise_and(frame, frame, mask=red_mask)
    red_mask2 = cv2.dilate(red_mask2, kernel)
    res_red2 = cv2.bitwise_and(frame, frame, mask=red_mask2)

    area1 = frame[a:a + height, b:b + 300]
    area2 = frame[a:a + height, left_x:left_x + 500]

    cnts, _ = cv2.findContours(red_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


    for pic, c in enumerate(cnts):

        area = cv2.contourArea(c)
        if (700 > area > 350):
            x,y,w,h = cv2.boundingRect(c)
            cv2.rectangle(frame, (x, y),(x + w, y + h),(0, 0, 255), 2)
            cv2.putText(frame, "Red detected", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255))


    cv2.imshow("Video from camera", frame)
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

для с++ решение выглядит примерно так:

findContours(Mask(cv::Rect(x,y,width,height)), contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, 
Point(0,0) );

Как я могу поменять эту строку чтобы получить желаемый результат?

cnts, _ = cv2.findContours(red_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE), #вот эта область меня интересует frame[a:a + height, b:b + 300]

Заранее спасибо!

Изофоты обычно ищут при помощи "шагающих квадратов", почитай у меня в ЖЖ. Одна из моих реализаций (но она неправильная, т.к. медленная). Для ускорения лучше использовать логические операции над бинаризованными изображениями (тогда можно как минимум 32 бита за один присест обрабатывать, если у тебя используются uint32_t, но даже uint8_t приличное ускорение дадут).

Вот, например — морфологические операции. Раньше я для них использовал лептонику, но все удивлялся: а чего оно так тормозит. Как глянул исходники лептоники, все понял. И написал свое. Теперь вот нужно попробовать, насколько шустрей будет, если бинарное изображение хранить не в uint8_t, а в uint32_t (или даже uint64_t).

anonymous ()
Ответ на: комментарий от anonymous

почитай у меня в ЖЖ

А есть, вариант статьи с картинками? А то без картинок неинтересно читать.

anonymous ()

cv2.findContours(...)

Спроси у ребят из WillowGarage или из IT-Seez, наверняка, у них e-mail на сайте есть.

pacify ★★★★★ ()

Угадал автора по заголовку.

hobbit ★★★★★ ()

Товарищи модераторы, а что случилось с темой? Где моя переписка с Эдиком?

anonymous ()
Ответ на: комментарий от anonymous

Видимо, приперся Шома или менструозница и потерли.

anonymous ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.