Ошибка выполнения convexHull в областях, обнаруженных MSER.

Я нашел пример MSER в Python OpenCV. Когда я пытаюсь запустить его, я получаю сообщение об ошибке, когда он пытается изменить форму list/numpy.array. Ошибка:

AttributeError: объект «список» не имеет атрибута «изменить форму»

Как я могу решить эту проблему? В приведенном ниже простом коде я прокомментировал, где возникает ошибка:

import cv2
import numpy as np

img = cv2.imread('../images/Capture2.JPG', 0);
vis = img.copy()
mser = cv2.MSER_create()
regions = mser.detectRegions(img)

hulls = []
for p in regions:
    # Error on below line: 'AttributeError: 'list' object has no attribute 'reshape''
    hulls.append( cv2.convexHull(p.reshape(-1, 1, 2)) )

    # Note a numpy array isn't working either: error: 'ValueError: cannot reshape array of size 2605 into shape (1,2)'
    p = np.array(p)
    hulls.append( cv2.convexHull(p.reshape(-1, 1, 2)) ) 

cv2.polylines(vis, hulls, 1, (0, 255, 0))
cv2.imshow('img', vis)
cv2.waitKey(0)
cv2.destroyAllWindows()

person sazr    schedule 10.07.2018    source источник


Ответы (1)


Я думаю, что mser.detectRegions(img) немного эволюционировал в различных версиях выпуска. В моем случае у меня есть версия OpenCV:

import cv2
print cv2.__version__
>>> 3.3.0

И mser.detectRegions(img) возвращает tupe с двумя значениями вместо одного возвращаемого значения. Вы можете исправить это, игнорируя второе значение кортежа:

regions, _ = mser.detectRegions(img)

Я поднял вопрос о версии, потому что во многих доступных онлайн-примерах используется regions = mser.detectRegions(img). Что может привести к путанице.

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

person ZdaR    schedule 10.07.2018