You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用凸包计数图像物体时遇数据类型不支持错误,求解决

解决cv2.convexHull报错TypeError: points data type = 17 is not supported

嘿,我来帮你看看这个问题!你遇到的这个TypeError是因为OpenCV的convexHull函数不支持你传入的点集数据类型,还有个小细节是坐标顺序可能不符合OpenCV的预期,咱们一步步来修正:

错误原因分析

  1. 数据类型不匹配:np.where()返回的索引数据类型是np.int64(对应的类型码就是报错里的17),而OpenCV的convexHull只支持np.int32或np.float32类型的点集。
  2. 坐标顺序问题:np.where()返回的是(行索引, 列索引),也就是(y, x)的顺序,但OpenCV中图像坐标遵循(x, y)(列, 行)的规则,虽然这个不会直接导致当前报错,但后续绘制凸包时会出现位置偏移的问题,建议一起修正。

修正后的代码

import cv2
import numpy as np

# 假设Cells是你已经预处理好的二值图像
ret, labels = cv2.connectedComponents(Cells)

# 获取标签为3的区域的行、列索引
rows, cols = np.where(labels == 3)
# 转换为OpenCV支持的(x, y)坐标顺序,并将数据类型转为int32
Points = np.column_stack((cols, rows)).astype(np.int32)

print(Points)
# 计算凸包
ContPoints = cv2.convexHull(Points)
print(ContPoints)

# 如果需要在图像上绘制凸包,可以加上这行
cv2.polylines(Cells, [ContPoints], isClosed=True, color=(255, 0, 0), thickness=2)

cv2.imshow('out', Cells)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键调整点说明

  • 使用np.column_stack((cols, rows))将列索引作为x坐标、行索引作为y坐标,符合OpenCV的坐标体系。
  • 通过.astype(np.int32)将点集的数据类型转换为OpenCV支持的类型,彻底解决data type = 17 is not supported的报错。

内容的提问来源于stack exchange,提问作者Hasan Saleh Hussein Alomari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:30:07