Как разделить контуры, обнаруженные в OpenCV? - PullRequest
0 голосов
/ 18 июня 2019

В настоящее время я пытаюсь найти контуры зерен в образце отображения после применения к нему порога. На рисунке вы можете видеть, что, если эти зерна расположены очень близко друг к другу, они обнаруживаются как единый контур. Поэтому я пытаюсь разделить контуры в их самом тонком сечении. Однако моя главная проблема заключается в том, что я не знаю, как работать с массивом numpy, чтобы фактически разделить контур так, чтобы в результате получилось два массива. (Я не могу включить изображения из-за репутации, я новый пользователь)

https://imgur.com/1dtI2BV

Я попытался сделать функцию, чтобы я мог передавать контуры, найденные с помощью cv2.findContours (), чтобы разделить их, используя некоторые критерии. Я сравниваю расстояния друг с другом и немного фильтрую их двумя факторами. В основном я получаю два индекса двух точек, где должно произойти разделение (a и b). Теперь я хочу переместить точки между ними в новый контур (массив?) И удалить эти точки из старого. Затем добавьте оба в новый список или массив, равный cv2.findContour () в результате. Я предполагаю, что моя проблема в основном не в понимании концепции типа numpy (массив).

def split(contours, ki = 0.25, ks = 0.25):
contours_new = []
for contour in contours:
    dists = []
    count = len(contour)
    for i in range(0,count-1,1):
        for j in range(i+1,count-1,1):
            idist = j - i  # "index-distance", to exclude neighboring points
            if idist > ki*count:
                p1 = contour[i][0]
                p2 = contour[j][0]
                d = dist(p1,p2) #calculates the distance between two points using simple pythagoras
                if d <= fit_size(contour)*ks:
                    dists.append([d, i, j])
                    #print('{}-{}: {}'.format(i,j,d))
    #print(dists)
    if len(dists) > 0:
        dists = sorted(dists, key=lambda a: a[0])
        a = dists[0][1] #first point
        b = dists[0][2] # second point, split bewteen these!
        old = contour
        new = old[a:b] # ????????????
        old = np.delete(old,range(a,b,1)) # ????????????
        # i = 0
        # new = []
        # while a < (b - i):
        #     new.append(old.pop(a))
        #     i = i + 1
        contours_new.append(old)
        contours_new.append(new)
    else:
        contours_new.append(contour)

print('OLD: {} - NEW: {}'.format(len(contours),len(contours_new)))
return contours_new

Передача результата моей функции рисования (которая отлично рисует контуры, найденные cv2.findContours ()), приводит к ошибке:

ошибка: (-215: утверждение не выполнено) npoints> 0 в функции 'cv :: drawContours'

1 Ответ

0 голосов
/ 18 июня 2019

Я изменил свой код, и теперь он работает:

    if len(dists) > 0:
        dists = sorted(dists, key=lambda a: a[0])
        a = dists[0][1]
        b = dists[0][2]
        old = contour.copy()
        new = old[a:b]
        old1 = old[0:a]
        old2 = old[b:len(old)]
        old = np.concatenate((old1,old2))
        contours_new.append(old)
        contours_new.append(new)
    else:
        contours_new.append(contour)

Я избавился от функции numpy.delete, которая у меня не работала.

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