101 lines
3.6 KiB
Markdown
101 lines
3.6 KiB
Markdown
|
|
# Documentation
|
|
- Class name: Contours
|
|
- Category: Bmad/CV/Contour
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/comfyanonymous/ComfyUI
|
|
|
|
Contours节点旨在根据指定的检索和近似模式从图像中识别和提取轮廓。它将输入图像转换为灰度版本,必要时应用阈值处理,并利用OpenCV的轮廓查找功能返回识别出的轮廓及其层次结构。
|
|
|
|
# Input types
|
|
## Required
|
|
- image
|
|
- 输入图像,用于提取轮廓。这个图像至关重要,因为它是轮廓检测的基础,直接影响所识别的轮廓及其特征。
|
|
- Comfy dtype: IMAGE
|
|
- Python dtype: torch.Tensor
|
|
- retrieval_mode
|
|
- 指定轮廓检索模式,决定轮廓的组织或检索方式。这个选择会影响输出轮廓的结构,进而影响轮廓的层次关系或分组方式。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
- approximation_mode
|
|
- 定义用于近似轮廓的方法。不同的模式可以以各种方式简化轮廓形状,影响提取轮廓的细节水平和整体形状。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
|
|
# Output types
|
|
- cv_contours
|
|
- 图像中检测到的轮廓列表,是轮廓检测的主要输出。
|
|
- Comfy dtype: CV_CONTOURS
|
|
- Python dtype: List[torch.Tensor]
|
|
- cv_contour
|
|
- 从检测到的轮廓列表中选择的单个轮廓,基于特定标准或处理步骤。
|
|
- Comfy dtype: CV_CONTOUR
|
|
- Python dtype: torch.Tensor
|
|
- cv_contours_hierarchy
|
|
- 轮廓的层次表示,指示轮廓级别之间的关系。这种层次结构提供了图像中轮廓嵌套和组织的洞察。
|
|
- Comfy dtype: CV_CONTOURS_HIERARCHY
|
|
- Python dtype: torch.Tensor
|
|
|
|
|
|
## Usage tips
|
|
- Infra type: `GPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class Contours:
|
|
"""
|
|
Note:
|
|
The image is converted to grey, but no threshold is applied.
|
|
Apply the thresholding before using and feed a black and white image.
|
|
"""
|
|
|
|
approximation_modes_map = {
|
|
'CHAIN_APPROX_NONE': cv.CHAIN_APPROX_NONE,
|
|
'CHAIN_APPROX_SIMPLE': cv.CHAIN_APPROX_SIMPLE,
|
|
'CHAIN_APPROX_TC89_L1': cv.CHAIN_APPROX_TC89_L1,
|
|
'CHAIN_APPROX_TC89_KCOS': cv.CHAIN_APPROX_TC89_KCOS
|
|
}
|
|
approximation_modes = list(approximation_modes_map.keys())
|
|
|
|
retrieval_modes_map = {
|
|
'RETR_EXTERNAL': cv.RETR_EXTERNAL,
|
|
'RETR_LIST': cv.RETR_LIST,
|
|
'RETR_CCOMP': cv.RETR_CCOMP,
|
|
'RETR_TREE': cv.RETR_TREE,
|
|
'RETR_FLOODFILL': cv.RETR_FLOODFILL
|
|
}
|
|
retrieval_modes = list(retrieval_modes_map.keys())
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {
|
|
"required": {
|
|
"image": ("IMAGE",),
|
|
"retrieval_mode": (s.retrieval_modes, {"default": "RETR_LIST"}),
|
|
"approximation_mode": (s.approximation_modes, {"default": "CHAIN_APPROX_SIMPLE"}),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("CV_CONTOURS", "CV_CONTOUR", "CV_CONTOURS_HIERARCHY")
|
|
FUNCTION = "find_contours"
|
|
CATEGORY = "Bmad/CV/Contour"
|
|
OUTPUT_IS_LIST = (False, True, False)
|
|
|
|
def find_contours(self, image, retrieval_mode, approximation_mode):
|
|
image = tensor2opencv(image)
|
|
thresh = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
|
|
|
|
# no thresh applied here, non zeroes are treated as 1 according to documentation;
|
|
# thresh should have been already applied to the image, before passing it to this node.
|
|
|
|
contours, hierarchy = cv.findContours(
|
|
thresh,
|
|
self.retrieval_modes_map[retrieval_mode],
|
|
self.approximation_modes_map[approximation_mode])
|
|
|
|
return (contours, contours, hierarchy,)
|
|
|
|
```
|