| from kornia.filters import canny
|
| from typing_extensions import override
|
|
|
| import comfy.model_management
|
| from comfy_api.latest import ComfyExtension, io
|
|
|
|
|
| class Canny(io.ComfyNode):
|
| @classmethod
|
| def define_schema(cls):
|
| return io.Schema(
|
| node_id="Canny",
|
| category="image/preprocessors",
|
| inputs=[
|
| io.Image.Input("image"),
|
| io.Float.Input("low_threshold", default=0.4, min=0.01, max=0.99, step=0.01),
|
| io.Float.Input("high_threshold", default=0.8, min=0.01, max=0.99, step=0.01),
|
| ],
|
| outputs=[io.Image.Output()],
|
| )
|
|
|
| @classmethod
|
| def detect_edge(cls, image, low_threshold, high_threshold):
|
|
|
| return cls.execute(image, low_threshold, high_threshold)
|
|
|
| @classmethod
|
| def execute(cls, image, low_threshold, high_threshold) -> io.NodeOutput:
|
| output = canny(image.to(comfy.model_management.get_torch_device()).movedim(-1, 1), low_threshold, high_threshold)
|
| img_out = output[1].to(comfy.model_management.intermediate_device()).repeat(1, 3, 1, 1).movedim(1, -1)
|
| return io.NodeOutput(img_out)
|
|
|
|
|
| class CannyExtension(ComfyExtension):
|
| @override
|
| async def get_node_list(self) -> list[type[io.ComfyNode]]:
|
| return [Canny]
|
|
|
|
|
| async def comfy_entrypoint() -> CannyExtension:
|
| return CannyExtension()
|
|
|