Как использовать контуры Skimage в opencv?

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

Я использую это, чтобы найти контуры водораздела Skimage:

contours = measure.find_contours(watershed(-distance, markers, mask=th4), 0.8)

для рисования контуров я использую это:

cv2.drawContours(rimg6, [A.astype(np.int32)], -1, (0,255,0), 4)

Поскольку skimage дает реальные числа, а opencv работает только с целыми числами, я использую это, чтобы преобразовать контуры в целые числа:

A = np.floor(contours[0])
A = A.astype(int)

рисование контура ничего не делает с [A.astype(np.int32)], и когда я использую A.astype(np.int32) (я имею в виду без скобок), я получаю эту ошибку:

OpenCV(4.1.2) /io/opencv/modules/imgproc/src/drawing.cpp:2509: error: (-215:Assertion failed) npoints > 0 in function 'drawContours'

Что я должен делать?


person Hakuna Matata    schedule 19.03.2021    source источник


Ответы (1)


Контуры OpenCV имеют дополнительный набор скобок вокруг каждой точки (не знаю, почему, так было всегда).

Вот короткий демонстрационный скрипт, показывающий способ преобразования контуров skimage в контуры OpenCV.

import cv2
import numpy as np
from skimage import measure

# create empty image
blank = np.zeros((100,100), np.uint8);

# ------------The following lines of code were taken from here-----------
# https://scikit-image.org/docs/dev/auto_examples/edges/plot_contours.html#sphx-glr-auto-examples-edges-plot-contours-py

# Construct some test data
x, y = np.ogrid[-np.pi:np.pi:100j, -np.pi:np.pi:100j]
r = np.sin(np.exp((np.sin(x)**3 + np.cos(y)**2)))

# Find contours at a constant value of 0.8
contours = measure.find_contours(r, 0.8)

# ----------end of code copying--------------

# convert to opencv contour and draw
for con in contours:
    cv_contour = [];
    for point in con:
        intify = [int(point[0]), int(point[1])];
        cv_contour.append([intify]); # extra pair of brackets because ¯\_(ツ)_/¯ it's OpenCV

    # convert to numpy and draw
    cv_contour = np.array(cv_contour);
    cv2.drawContours(blank, [cv_contour.astype(int)], -1, (255), -1);

# resize bigger
blank = cv2.resize(blank, (300,300));
cv2.imshow("Blank", blank);
cv2.waitKey(0);
person Ian Chu    schedule 19.03.2021
comment
Извините, немного поздно увидел. Спасибо за ответ. - person Hakuna Matata; 22.03.2021