Как я могу переместить вершины ROI в python и opencv? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь нарисовать контур в ROI. Но вершины ROI появляются на левой стороне изображения. Я хочу переместить ROI в место, указанное на фотографии, но я не знаю, как это сделать. Я новичок в OpenCV и Python, поэтому любая помощь очень ценится. Вот мой код.

enter image description here

# Object detected
            center_x = int(detection[0] * width)
            center_y = int(detection[1] * height)
            w = int(detection[2] * width)
            h = int(detection[3] * height)
            # Rectangle coordinates
            x = int(center_x - w / 2)
            y = int(center_y - h / 2)
            boxes.append([x, y, w, h])
            confidences.append(float(confidence))
            class_ids.append(class_id)

indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.4, 0.3)

for i in range(len(boxes)):
    if i in indexes:
        x, y, w, h = boxes[i]
        label = str(classes[class_ids[i]])
        confidence = confidences[i]
        color = colors[class_ids[i]]

        img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        ret, img_binary = cv2.threshold(img_gray, 15, 255, 0)
        roi = img_binary[y:y+h, x:x+w]
        contours, hierarchy = cv2.findContours(roi, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        cv2.drawContours(frame, contours, -1, (0,255,0), 3)
        print(roi.shape)
        print(x, y, w, h)

1 Ответ

0 голосов
/ 17 февраля 2020

Возвращенные координаты контуров относятся к области интереса, переданной в findContours. Т.е. координаты x контуров относятся к верхнему левому углу области интереса. То же самое для y.

Поскольку вы хотите отобразить контуры внутри исходного изображения, а не внутри области интереса, их необходимо сместить.

Существует два основных варианта:

  1. передача x и y вашей области интереса в findContours подобно

    contours, hierarchy = cv2.findContours(roi, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE, offset=(x,y))
    

    Возвращенные значения contours будут иметь координаты относительно исходного изображения.

  2. pass x и y to drawContours like

    cv2.drawContours(frame, contours, -1, (0,255,0), 3, offset=(x,y))
    

    Это оставит координаты вашего contours относительно ROI и просто отобразите их внутри исходного изображения.

Что имеет смысл для вас, зависит от вашего приложения.

Третий вариант - вручную сдвинуть контуры, просто добавив x в первое измерение и y во второе измерение. Выход будет таким же, как 1.

...