Как контурировать область изображения с известными координатами?

У меня есть ультразвуковое изображение и координаты (массив точек x и y) опухоли каждого изображения. Как я могу сделать контур вокруг опухоли с этими известными координатами, используя "cv.drawContours()"? Я хочу удалить всю информацию об опухоли и остаться только с изображением/информацией об опухоли.

УЗИ-изображение с областью интереса опухоли

temp=np.array([[284.,  60.],[276.,  59.],[269.,  58.],[260.,  58.],[247.,  60.],[241.,  65.],[237.,  68.],[233.,  72.],[228.,  80.],[225.,  87.],[225.,  96.],[229., 107.],[233., 109.],[238., 110.],[244., 111.],[253., 112.],[260., 113.],[267., 115.],[273., 116.],[290., 115.],[298., 113.],[306., 110.],[313., 109.],[323., 108.],[330., 102.],[330., 100.],[335.,  96.],[338.,  94.],[344.,  91.],[346.,  86.],[346.,  82.],[346.,  77.],[346.,  73.],[341.,  70.],[337.,  68.],[327.,  64.],[322.,  63.],[314.,  62.],[305.,  62.],[300.,  61.],[293.,  60.],[289.,  60.],[284.,  60.]])

imagem = cv2.imread('thyroid/2_1.jpg', cv2.IMREAD_GRAYSCALE)

cc=cv2.drawContours(imagem,temp,3,(0,255,0),3)

Я получаю эту ошибку: error Traceback (most recent call last) <ipython-input-25-59da73cb5b29> in <module> 2 imagem = cv2.imread('thyroid/2_1.jpg', cv2.IMREAD_GRAYSCALE) 3 ----> 4 cc=cv2.drawContours(imagem,temp,3,(0,255,0),3) error: OpenCV(3.4.1) C:\Miniconda3\conda-bld\opencv-suite_1533128839831\work\modules\imgproc\src\drawing.cpp:2515: error: (-215) npoints > 0 in function cv::drawContours Как я могу исправить эту ошибку? Потому что мои контуры - это список

img = cv2.imread('thyroid/2_1.jpg', cv2.IMREAD_GRAYSCALE) temp=temp.astype(np.int32) cc=cv2.drawContours(img,[temp.astype('i4')],-1,(0,255,0),3)


person Bernardo Cecchetto    schedule 06.03.2020    source источник
comment
cv.drawContours ожидает контуры в виде списка Python [] контуров, каждый из которых представляет собой np.array([[x0, y0], [x1, y1], [x2, y2], [x3, y3], etc..]) координат. источники: начало работы с контурами python openCV cv::drawContours документация   -  person Aaron    schedule 07.03.2020
comment
Да, но посмотрите на ошибку, которую я получаю... Я делаю все это, я не знаю, на самом деле, где моя ошибка   -  person Bernardo Cecchetto    schedule 07.03.2020


Ответы (1)


2 проблемы в приведенном выше коде:

1: Как я уже упоминал в своем комментарии, для рисования контуров требуется список контуров, поэтому заключите temp в скобки, чтобы сделать его списком:

cc=cv2.drawContours(imagem,[temp],-1,(0,255,0),3)

2: контуры рисования, похоже, недовольны 64-битными числами с плавающей запятой (по умолчанию для numpy). Предоставление ему 32-битного int, похоже, сработало для меня, как было предложено здесь.

cc=cv2.drawContours(imagem,[temp.astype('i4')],-1,(0,255,0),3)

Весь рабочий код на моем ПК:

import cv2
import numpy as np

temp=np.array([[284.,  60.], [276.,  59.], [269.,  58.], [260.,  58.], [247.,  60.], [241.,  65.], [237.,  68.], [233.,  72.], [228.,  80.], [225.,  87.], [225.,  96.], [229., 107.], [233., 109.], [238., 110.], [244., 111.], [253., 112.], [260., 113.], [267., 115.], [273., 116.], [290., 115.], [298., 113.], [306., 110.], [313., 109.], [323., 108.], [330., 102.], [330., 100.], [335.,  96.], [338.,  94.], [344.,  91.], [346.,  86.], [346.,  82.], [346.,  77.], [346.,  73.], [341.,  70.], [337.,  68.], [327.,  64.], [322.,  63.], [314.,  62.], [305.,  62.], [300.,  61.], [293.,  60.], [289.,  60.]])

imagem = cv2.imread(r'c:\Users\username\Desktop\image.png', cv2.IMREAD_GRAYSCALE)

cc=cv2.drawContours(imagem,[temp.astype('i4')],-1,(255,0,0),3)
cv2.imshow('image',cc)
cv2.waitKey(0)
person Aaron    schedule 06.03.2020
comment
какая у вас версия opencv? Это работает для меня. - person Aaron; 07.03.2020
comment
Версия резюме 3.4.1 - person Bernardo Cecchetto; 07.03.2020
comment
Мой работал с 3.3 и до сих пор работает после обновления до 4.2. Вы пытались запустить его, удаляя все остальное из своего кода? - person Aaron; 07.03.2020
comment
Это сработало прямо сейчас. Большое спасибо, братан. Действительно - person Bernardo Cecchetto; 07.03.2020