Обнаружить карты / прямоугольники на белом столе с OpenCV в Python? - PullRequest
0 голосов
/ 27 марта 2012

Я пытался выяснить, как обнаружить карты на столе, а затем извлечь изображения только карт. После некоторого чтения, я решил, что лучше использовать cv.Canny для обнаружения краев, так как карты будут единственными вещами на белом столе. Затем получите изображение карты из прямоугольного выреза изображения в соответствии с обнаруженными краями.

Но я не уверен, как получить информацию о краях (координаты) из информации о Канни. Я могу получить информацию о Canny и сохранить ее в IplImage, но я не уверен, как получить информацию, необходимую для создания прямоугольника вокруг карты и вырезания изображения.

import cv

cam = cv.CaptureFromCAM(0)

while True:
    capture = cv.QueryFrame(cam)

    #apply mask to block out white background
    grey = cv.CreateImage(cv.GetSize(capture), 8, 1)
    masked_image = cv.CreateImage(cv.GetSize(capture), 8, 3)
    cv.CvtColor(capture, grey, cv.CV_BGR2GRAY)
    cv.Threshold(grey, grey, 100, 255, cv.CV_THRESH_BINARY)
    cv.Zero(masked_image)
    cv.Not(grey, grey)
    cv.Copy(capture, masked_image, grey)

    #detect corners
    corners = cv.CreateImage(cv.GetSize(masked_image), 8, 1)
    #cv.CornerHarris(masked_image, corners, ?)
    cv.Canny(grey, corners, 900, 890)
    cv.ShowImage('b_window', corners)
    cv.WaitKey(2)

Ответы [ 3 ]

1 голос
/ 20 июня 2013
1 голос
/ 24 января 2015

Предполагая, что края карты / прямоугольника становятся заметными после операции Canny, вы можете найти внешние контуры, используя findContours с CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, чтобы получить прямоугольный контур, закодированный с 4 точками. Обратите внимание, что искажение перспективы не имеет значения, поскольку оно закодирует 4 внешние точки независимо от перспективы.

Проверка контуров (выпуклые с углами в диапазоне). karlphillip сделал хороший пример этого: https://stackoverflow.com/a/8863060/3475075

Если обнаружены другие контуры на изображении, получить самый большой прямоугольник (контур с самой большой областью) с помощью contourArea ()

Если вам нужно узнать, какая точка находится слева вверху, справа и т. Д., Простой способ определить это вычисление суммы и разности значений x и y:

  • в верхнем левом углу наименьшая сумма
  • справа внизу самая большая сумма
  • верхняя правая точка имеет наименьшую разницу
  • внизу слева имеет наибольшую разницу
0 голосов
/ 27 марта 2012

Вы должны опубликовать более подробную информацию, чтобы помочь сузить совет. Например, изображение перегружено или будут проекционные искажения? Есть ли равномерное освещение? Сколько там карт? Карты перекрываются? В общем, детектор контуров - это всего лишь маленький первый шаг в обнаружении объектов.

Однако, если ваша проблема сильно ограничена, вы можете установить пороговое значение, отфильтровать подключенные компоненты, использовать преобразование Хафа или использовать информацию о цвете.

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