OpenCV и Python: анализ связанных компонентов - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть работающий код анализа связанных компонентов, работающий на C. На самом деле это копия из книги "Изучение Opencv".

Теперь я переписываю весь этот код на Python и не могу найти некоторые из этих функцийв API-интерфейсе Python, например cvStartFindContours.

Мне интересно, есть ли у кого-то базовая функция анализа связанных компонентов, реализованная в Python.Я знаю, что есть некоторые библиотеки, но я ищу что-то более простое, просто функцию или фрагмент кода.

Мне не нужно ничего «большого», потому что у меня есть простое черное изображение с 2 или 3белые кружки, и я хочу найти число окружностей и их центр.

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

РЕДАКТИРОВАТЬ: Iрешил это следующим образом.

def find_connected_components(img):
    """Find the connected components in img being a binary image.
    it approximates by rectangles and returns its centers
    """

    storage = cv.CreateMemStorage(0)
    contour = cv.FindContours(img, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
    centers = []

    while contour:
        # Approximates rectangles
        bound_rect = cv.BoundingRect(list(contour))

        centers.append(bound_rect[0] + bound_rect[2] / 2, bound_rect[1] + bound_rect[3] / 2)

        contour = contour.h_next()

Ответы [ 6 ]

6 голосов
/ 17 февраля 2012

Существует код подключенных компонентов лицензии BSD (в Cython) как часть scikit-образа:

https://github.com/scikit-image/scikit-image/blob/master/skimage/measure/_ccomp.pyx

Если у вас установлен пакет, он так же прост, как

from skimage import measure
import numpy as np

L = measure.label(image)
print "Number of components:", np.max(L)
5 голосов
/ 07 апреля 2012

немного от ответа, но есть также этот патч: http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch

должна быть одной из самых быстрых реализаций, и при этом ее легко вызывать.должен быть интегрирован в mainline когда-нибудь в будущем ...

edit: он был в mainline некоторое время в ожидании релиза 3.0.Не спрашивайте меня, почему они не выпустили его раньше!

отказ от ответственности - я автор: -)

2 голосов
/ 20 февраля 2015

OpenCV 3.0.0-dev имеет connectedComponents функцию, но в документе сказано, что это только для C ++.

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

Вы должны взглянуть на документацию.Начиная с OpenCV 2.2 появился новый интерфейс для Python, который охватывает все функции C / C ++:)

cv.FindContours должно работать для вас:)

1 голос
/ 22 сентября 2013

В дополнение к ответу Стефана ван дер Уолта, вот немного более длинный пример маркировки лыжного мага:

from skimage import morphology
import cv2
import numpy as np
import sys


def get_image():
    size = (w, h) = (100, 100)
    img = np.zeros(size, np.uint8)
    cv2.rectangle(img, (10, 10), (19, 19), (128), -1)
    cv2.rectangle(img, (30, 20), (39, 39), (128), -1)
    cv2.rectangle(img, (40, 30), (49, 49), (128), -1)
    cv2.rectangle(img, (50, 70), (89, 79), (128), -1)
    return img


def show_image(img):
    cv2.imshow('result', img), cv2.waitKey(0)


if __name__ == '__main__':
    img = get_image()
    show_image(img)

    labels = morphology.label(img, background=0)
    label_number = 0
    while True:
        temp = np.uint8(labels==label_number) * 255
        if not cv2.countNonZero(temp):
            break
        show_image(temp)
        label_number += 1

    cv2.destroyAllWindows()
0 голосов
/ 05 сентября 2016

Существует также функция connectedComponents в OpenCV 3.0.0 - python.

opencv python function list

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