Opencv: выпуклость, дефекты по наибольшему контуру дают ошибку - PullRequest
0 голосов
/ 30 августа 2018

Я получаю эту ошибку:

OpenCV Error: Assertion failed (hpoints > 0) in cv::convexityDefects, file C:\projects\opencv-python\opencv\modules\imgproc\src\convhull.cpp, line 284
Traceback (most recent call last):
  File "E:/PycharmProjects/ComputerVisionAgain/Image Segmentation/hand_blk/main.py", line 12, in <module>
    hull_defects=cv2.convexityDefects(sorted_cnts[0],hull)
cv2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\convhull.cpp:284: error: (-215) hpoints > 0 in function cv::convexityDefects

когда я пытаюсь получить выпуклость дефектов самого большого контура изображения. Это код, который я использую:

import cv2
import numpy as np

img=cv2.imread('blk_hand.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,thresh=cv2.threshold(gray,100,255,cv2.THRESH_BINARY)

_,contours,h=cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)
sorted_cnts=sorted(contours,key=cv2.contourArea,reverse=True)
hull=cv2.convexHull(sorted_cnts[0])
hull_defects=cv2.convexityDefects(sorted_cnts[0],hull)
cv2.drawContours(img,[hull],-1,(0,0,255),3)

cv2.drawContours(img,sorted_cnts[0],-1,(0,255,0),3)

cv2.imshow('img',img)
cv2.imshow('thresh',thresh)
cv2.waitKey(0)

This is the original image

This is threshed image

This is convex hulled image on largest contour

1 Ответ

0 голосов
/ 05 декабря 2018

cv2.convexHull по умолчанию возвращает выпуклый корпус в виде набора точек (за это отвечает аргумент returnPoints , по умолчанию True , здесь ). Но функция cv2.convexityDefects, согласно документам , ожидает, что 2-й аргумент будет индексами точек контура, которые делают корпус .

Так что просто поменяйте

hull=cv2.convexHull(sorted_cnts[0])

до

hull=cv2.convexHull(sorted_cnts[0], returnPoints=False)

, поэтому hull будет содержать индексы исходного sorted_cnts[0] контура, которые образуют выпуклый корпус.

Кстати, в этом случае вы все еще можете получить корпус в виде набора точек, выполнив sorted_cnts[0][hull].

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