Как найти прямоугольник на фотографии с помощью iphone? - PullRequest
6 голосов
/ 26 мая 2011

Мне нужно будет идентифицировать, повернуть и обрезать прямоугольник (визитку) по фотографии, снятой с iphone. Я считаю, что это можно сделать с помощью OpenCV, но я не использовал его раньше. Кто-нибудь может дать несколько советов по этому поводу?

Ответы [ 6 ]

14 голосов
/ 26 сентября 2014

С iOS 8 , теперь вы можете использовать новый детектор CIDetectorTypeRectangle , который возвращает CIRectangleFeature .Вы можете добавить опции:

  • Точность: низкая / высота
  • Соотношение сторон: 1,0, если вы хотите найти только квадраты, например

    CIImage *image = // your image
    NSDictionary *options = @{CIDetectorAccuracy: CIDetectorAccuracyHigh, CIDetectorAspectRatio: @(1.0)};
    CIDetector *rectangleDetector = [CIDetector detectorOfType:CIDetectorTypeRectangle context:nil options:options];
    
    NSArray *rectangleFeatures = [rectangleDetector featuresInImage:image];
    
    for (CIRectangleFeature *rectangleFeature in rectangleFeatures) {
        CGPoint topLeft = rectangleFeature.topLeft;
        CGPoint topRight = rectangleFeature.topRight;
        CGPoint bottomLeft = rectangleFeature.bottomLeft;
        CGPoint bottomRight = rectangleFeature.bottomRight;
    }
    

Дополнительная информация в WWDC 2014 Достижения в базовом образе , сессия 514.

Пример с shinobicontrols.com

8 голосов
/ 26 мая 2011

См. Пример кода opencv OpenCV2.2\samples\cpp\squares.cpp. Они делают следующее:

  • Обнаружение краев с помощью Canny

  • Извлечение контуров по findContours

  • Для каждого контура

    • приблизительный контур с использованием approxPolyDP для уменьшения количества вершин

    • если контур имеет 4 вершины и каждый угол составляет ~ 90 градусов, то получается прямоугольник

2 голосов
/ 12 февраля 2012

Если вы знаете приблизительную высоту и ширину прямоугольника, то вы можете сделать следующие шаги:

  • Обнаружение объекта: маркировка компонента с использованием трассировки контура.
  • После всех объектовбыли помечены, а затем отфильтровать обнаруженные компоненты путем расчета периметра прямоугольника.P = 2 * (H + W) Любой компонент, имеющий размер меньше или больше P, игнорируется, сохраняются только компоненты, более близкие к размеру P.
  • Найти угловые точки прямоугольника из контураpoints.
  • Извлеките прямоугольник из исходного изображения.

Все вышеперечисленные шаги можно выполнить с помощью OpenCV или Aforge.Net, я лично сделал это с помощью Aforge.Net.

2 голосов
/ 26 мая 2011

Чтобы начать, вы должны взглянуть на функцию обнаружения API OpenCV.Особенно

  • cv::Canny (для обнаружения краев),
  • возможно cv::cornerHarris (для обнаружения углов),
  • и cv::HoughLines (для поиска прямых линийна краю изображения).

HTH

1 голос
/ 28 июня 2011

Я думаю, goodFeaturesToTrack() легче использовать для обнаружения Harris-Corner. CornerHarris() необходимо установить изображение для определенного типа.

1 голос
/ 26 мая 2011

В зависимости от точки зрения, карта может оказаться не прямоугольником, а скорее трапецией.Вы можете использовать HoughLines2 в OpenCV, чтобы идентифицировать края на изображении и попытаться определить 4 края, которые, скорее всего, являются краями визитной карточки.

...