opencv: как найти контуры на одном изображении глубины? - PullRequest
0 голосов
/ 13 марта 2020

При попытке найти контуры на изображении с одной глубиной я получаю следующую ошибку. У меня уже есть одна глубина img, я думаю, мне не нужно использовать cv.cvtcolor.

img = np.random.rand(224,224)
img.astype('uint8')
threshold_value = int(np.max(img) * 0.2)
print(threshold_value)
_, img = cv.threshold(img, threshold_value, 255, cv.THRESH_BINARY)
plt.imshow(img)
plt.show()
_, contours, _ = cv.findContours(img,
                                    cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
plt.imshow(img)
plt.show()

ошибка:

FindContours поддерживает только Изображения CV_8UC1 в режиме! = CV_RETR_FLOODFILL в противном случае поддерживают изображения CV_32SC1 только в функции 'cvStartFindContours_Impl'

Ответы [ 3 ]

1 голос
/ 13 марта 2020
img.astype('uint8')

ничего не делает. Вы должны присвоить результат чему-то, например:

img = img.astype('uint8')

, тогда вы не получите ошибку, которую вы описали.

, но результаты все равно будут не такими, как вы могли ожидать, потому что np.random.rand() присваивает значения в диапазоне (0..1) и путем преобразования их в uint8 все становится равным нулю. возможно, захотите исправить и эту часть.

0 голосов
/ 13 марта 2020

Сначала необходимо преобразовать значения, чтобы значения были до 255. Затем следует преобразовать тип. Как то так:

img = np.random.rand(224,224)
# Take values from 0-1 to 0-255
img *= 255
# Convert type
img = img.astype('uint8')
(...)
0 голосов
/ 13 марта 2020

8UC1 означает 8-битные пиксели, поэтому попробуйте использовать преобразование изображения в оттенки серого.

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