Делайте снимки, когда в изображении обнаружен шаблон с Android OpenCV - PullRequest
2 голосов
/ 14 февраля 2020

Привет сообщество stackoverflow Я хотел бы, чтобы кто-то мог немного подсказать мне относительно моего следующего вопроса, я хочу сделать приложение, которое делает снимок, когда он обнаруживает лист с 3 отметками (черные квадраты по углам), аналогично тому, что QR будет иметь. Я немного читал об opencv, который, как мне кажется, мог бы помочь мне больше, однако я еще не очень ясно.

Вот мой пример

Photo to capture with patterns

1 Ответ

2 голосов
/ 15 февраля 2020

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

Мы Порог Оцу , чтобы получить двоичное изображение с объектами для обнаружения в белом.

enter image description here

Отсюда мы находим контуры, используя cv2.findContours и фильтруем, используя приближение контуров cv2.approxPolyDP в дополнение к области контура cv2.contourArea.

Обнаруженные метки выделены чирком

enter image description here

Я реализовал это в Python но вы можете использовать тот же подход

код

import cv2

# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours and filter using contour approximation and contour area
marks = 0
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.04 * peri, True)
    if len(approx) == 4 and area > 250 and area < 400:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (200,255,12), 2)
        marks += 1

# Sheet has 3 marks
if marks == 3:
    print('Take photo')

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...