Получить координаты для создания ограничительной рамки из выходного изображения OpenCV - PullRequest
0 голосов
/ 09 февраля 2019

Я использую алгоритм OpenCV GrabCut, как описано здесь (https://opencv -python-tutroals.readthedocs.io / en / latest / py_tutorials / py_imgproc / py_grabcut / py_grabcut.html # grabcut ), чтобы извлечьпередний план в изображении.

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('messi5.jpg')
mask = np.zeros(img.shape[:2],np.uint8)

bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)

rect = (50,50,450,290)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]

Теперь я могу сохранить это изображение, полученное с помощью cv.imwrite('filename', img), и выходное изображение содержит только передний план с затемненным фоном.

Я хотелчтобы получить координаты ограничительной рамки для переднего плана как (LowerXcoordinate, LowerYcoordinate) и (UpperXcoordinate, UpperYcoordinate).

Один из способов, которые я могу себе представить, - рассмотреть изображение как 2D-матрицу пикселей, чтобы получить верхний Y-координата начинается со строки 1, и строка за строкой проверяет, является ли значение цвета всех пикселей черным.Первая строка с не черным пикселем будет там, где начинается передний план.Точно так же, начиная с последнего ряда и работая вверх, я мог получить нижнюю Y-координату.И просто повторите процедуру со столбцами, чтобы получить координаты X.

Прямо сейчас единственный наивный способ, который я знаю, - это вручную писать циклы для проверки этого.

Есть ли какой-нибудь более простой метод, использующий библиотечные функции для достижения этой цели?

1 Ответ

0 голосов
/ 09 февраля 2019

Это действительно намного проще, чем это!Просто найдите контуры вашей маски (документы) , а затем найдите ограничивающий прямоугольник (документы) контура.

_, contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
bounding_boxes = [cv2.boundingRect(contour) for contour in contours]

Обратите внимание, что ограничивающие рамкибудет представлен четырьмя элементами (x, y, w, h), где x, y - верхний левый угол, а w, h - ширина и высота соответственно.В маске будет ограничительная рамка для каждого шарика.

Кроме того, важное (раздражающее) примечание.Более старые версии OpenCV (я полагаю, до 3.0) имели два значения возврата из findContours();только контуры и иерархия.Затем в OpenCV 3 это было изменено и возвращено три значения: входное изображение, контуры и иерархия.В OpenCV 4 это было изменено обратно на два.Поэтому удалите этот первый _, если вы не используете OpenCV 3.

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