OpenCV и iOS, извлечение / обрезка изображения в соответствующие части - PullRequest
0 голосов
/ 17 мая 2018

Я изо всех сил пытался найти решение этой проблемы, и это может быть проще, чем я думаю.

В настоящее время я создаю приложение, которое должно анализировать изображение с помощью TensorFlow.Эта часть, в которой я смог встать и работать без проблем (подумайте о приложении «не горячая собака»).

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

TLDR ;Лучший способ объяснить, что я обучил модель для анализа отдельного яйца.Теперь я делаю снимок коробки для яиц (несколько симметрично и упорядоченно, но может быть под разными углами / освещением и т.Другой ключевой момент заключается в том, что мне нужно, чтобы они были упорядочены (сверху вниз или снизу вверх, НЕ по наилучшему совпадению, если, например, используется метод OpenCV matchTemplate)

IЯ хотел бы поделиться кодом, но пока все это было исследование, которое привело меня к OpenCV, и до сих пор я добавил его только как зависимость от библиотеки.Я смотрел на подбор шаблонов, заливку и т.д. Я просто не могу связать все это вместе, чтобы иметь возможность «разрезать» изображение на отдельные части.

Надеюсь, этого достаточно, чтобы пойтиот, но, пожалуйста, дайте мне знать, и я могу попытаться добавить больше деталей.

В качестве справки я прочитал эти примеры:

https://samwize.com/2013/06/09/using-opencv-to-match-template-multiple-times/

https://www.toptal.com/machine-learning/real-time-object-detection-using-mser-in-ios ... и многие другие, эти, казалось, просто наиболее соответствовали тому, что я пытаюсь выполнить.

EDIT В качестве примера я нашел это изображение, котороеобеспечивает хорошее сравнение с тем, с чем я буду работать.Учитывая это изображение блоков lego, как бы я экспортировал отдельные части?Я не слишком обеспокоен дополнительными данными (то есть не нужно точно их обрезать, просто нужно разделить фрагменты). Другая ключевая вещь заключается в том, что мне нужно, чтобы они были упорядочены сверху вниз (на изображении примера синий блок будет # 1, красный # 2 и т. Д.)

enter image description here

1 Ответ

0 голосов
/ 17 мая 2018

Не имея образца изображения для тестирования, я могу просто дать вам теоретический способ действий.

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

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

На этом изображении, вы можете использовать cv::findContours, чтобы извлечь границы каждого отдельного яйца.

Теперь на каждой границе вы можете использовать cv::minAreaRect, чтобы найти ограничивающую рамкукаждого яйца.

Отфильтруйте, используя порог в области ограничивающего прямоугольника, ложные срабатывания.

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

Вот скетч в python ("image.png" - это изображение вашего блока lego):

import cv2
import numpy as np

def main():
    img = cv2.imread("image.png", 0)
    threshold, binary = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

    cv2.imshow("bin",binary)

    im2, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    draw = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
    #cv2.drawContours(img, contours, 0, (255,0, 0), 2)

    boxes = []
    for contour in contours:
        #cv2.drawContours(img, [contour], 0, (0,255,0), 2)
        area = cv2.contourArea(contour)
        # heuristic: ignore small objects and noise
        if area < 50:
            continue
        box = cv2.boundingRect(contour)
        boxes.append(box)


    feed_to_tensorflow = []
    for box in boxes:
        #extract roi
        x, y, width, height = box
        roi = img[y:y+height, x:x+width]
        feed_to_tensorflow.append(roi)
        cv2.imshow("box", feed_to_tensorflow[-1])
        cv2.waitKey()


    cv2.imshow("img", img)
    cv2.waitKey()


if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...