使用凸包计数图像物体时遇数据类型不支持错误,求解决
解决cv2.convexHull报错TypeError: points data type = 17 is not supported
嘿,我来帮你看看这个问题!你遇到的这个TypeError是因为OpenCV的convexHull函数不支持你传入的点集数据类型,还有个小细节是坐标顺序可能不符合OpenCV的预期,咱们一步步来修正:
错误原因分析
- 数据类型不匹配:
np.where()返回的索引数据类型是np.int64(对应的类型码就是报错里的17),而OpenCV的convexHull只支持np.int32或np.float32类型的点集。 - 坐标顺序问题:
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
相关产品推荐
相关产品推荐

