MeshGraphormer Hand Refiner crashes when empty crop is passed to cv2.resize

该报错通常发生在 ComfyUI 中使用 MeshGraphormer+ImpactDetector-DepthMapPreprocessor 处理手部深度图时,检测到的手部边界框或裁剪坐标异常,导致传入 cv2.resize() 的 cropped 图像为空(宽或高为 0)。优先排查手部检测结果与

快速结论:该报错通常发生在 ComfyUI 中使用 MeshGraphormer+ImpactDetector-DepthMapPreprocessor 处理手部深度图时,检测到的手部边界框或裁剪坐标异常,导致传入 cv2.resize() 的 cropped 图像为空(宽或高为 0)。优先排查手部检测结果与裁剪坐标是否有效,并在重设尺寸前加入空裁剪判断。

适用环境:Issue 已确认的工具为 ComfyUI ControlNet Aux 的 MeshGraphormer+ImpactDetector-DepthMapPreprocessor,报错来自 OpenCV 4.13.0。Issue 未明确给出操作系统、Python、CUDA、PyTorch、显卡型号及具体节点版本,这些项目无法据 Issue 补写。

最快修复方案:暂无确认的一步修复方案。Issue 中给出的做法是在 pipeline.py 的 cv2.resize() 调用前增加对 cropped 为空、宽或高为 0、crop_len <= 0 的判断,命中时置 depth_failure = True 并跳过该手部的细化,从而避免整个工作流崩溃;该改动属于建议方案,Issue 未表明已被合入或由维护者验证。

注意事项:该方案只阻止无效裁剪导致整个流程崩溃,并不修复手部检测本身,也不保证该手部结果正确。它属于跳过失败手部细化,批处理中可能得到缺少该手部精修的结果。Issue 提到该问题可能只在特定图片或检测结果下出现,难以稳定复现;修改文件前建议备份,并确认所改文件路径与当前安装版本一致。

问题场景

用户在 ComfyUI 中运行 ControlNet Aux 节点的 MeshGraphormer+ImpactDetector-DepthMapPreprocessor 时触发崩溃。该预处理器先通过手部检测得到关键点,再根据关键点计算手部边界框与裁剪区域,随后把裁剪图像送入 MeshGraphormer 推理。当检测到的手部边界框或计算出的裁剪坐标无效时,裁剪区域可能变成空图像,下一步对空图像调用 cv2.resize() 就会触发 OpenCV 断言失败。Issue 作者指出,这可能只在某些图片或某些检测结果下出现,因此不一定每次都能复现。

报错原文

cv2.error: OpenCV(4.13.0) ... resize.cpp:4208:
error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'

出错位置对应代码:

graphormer_input = cv2.resize(cropped, (224, 224), interpolation=cv2.INTER_CUBIC)

原因分析

最可能的原因是 cropped 变成了空图像。Issue 中裁剪由类似下面的切片生成:

cropped = padded_image[crop_y_min:crop_y_max+1, crop_x_min:crop_x_max+1]

当手部关键点检测得到的边界框异常,或据此计算出的 crop_x_min、crop_x_max、crop_y_min、crop_y_max 无效时,裁剪结果可能宽度为 0 或高度为 0,甚至切片为空。OpenCV 的 cv2.resize() 无法处理空输入,于是报 !ssize.empty() 断言失败。评论中给出的代码还显示,crop_len 由手部关键点范围计算而来;若关键点范围过小或坐标异常,crop_len 也可能小于等于 0,从而加剧该问题。该判断属于基于代码的推断,Issue 未进一步给出具体触发图片或检测器输出。

环境排查

  • 确认当前使用的 ComfyUI ControlNet Aux 版本及 mesh_graphormer/pipeline.py 的实际路径,避免修改到旧版本或缓存目录中的文件。
  • 确认 OpenCV 版本,Issue 报错环境为 OpenCV 4.13.0;不同版本报错行号可能不同,但 !ssize.empty() 断言含义一致。
  • 确认触发工作流确实调用了 MeshGraphormer+ImpactDetector-DepthMapPreprocessor,而非其他深度或手部预处理节点。
  • 确认输入图片中手部是否过小、被裁切、遮挡严重或位于图像边缘,这些情况可能使手部关键点范围异常。
  • Issue 未提供 Python、PyTorch、CUDA、显卡型号或检测器依赖版本,无需据此臆测版本冲突;如问题持续,可记录完整终端日志中的前后调用栈。

解决步骤

  1. 打开 comfyui_controlnet_aux/src/custom_controlnet_aux/mesh_graphormer/pipeline.py,定位到调用 cv2.resize(cropped, (224, 224), ...) 的位置。
  2. 在切片生成 cropped 之前,可优先尝试加入对裁剪坐标的严格检查:确认 crop_len > 0、crop_x_max > crop_x_min、crop_y_max > crop_y_min,且 crop_x_min、crop_y_min 不小于 0,crop_x_max、crop_y_max 不超过 padded_image 的宽高。命中无效条件时设置 depth_failure = True 并跳出当前手部处理循环。
  3. 在生成 cropped 之后、调用 cv2.resize() 之前,再加入空裁剪检查:crop_len <= 0、cropped is None、cropped.size == 0、cropped.shape[0] == 0 或 cropped.shape[1] == 0 任一成立时,设置 depth_failure = True 并跳出循环。
  4. 保存文件并重启 ComfyUI,使修改后的模块重新加载。
  5. 用原先失败的图片重新运行工作流;如果该图片触发无效裁剪,预期应跳过该手部的 MeshGraphormer 细化,而不是抛出 cv2.resize 异常。

验证方法

重新运行同一工作流和触发图片,确认终端中不再出现 cv2.error ... !ssize.empty() in function 'cv::resize',且队列不会因该手部处理中断。若工作流正常完成但该手部没有精修结果,说明空裁剪判断已生效;这符合该方案“跳过失败手部而非修复检测”的设计。Issue 未提供官方回归测试或确认修复版本,因此以上验证仅针对该建议补丁的实际运行效果。

参考来源

Fannovel16/comfyui_controlnet_aux #624

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 35063

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注