C++ OpenCV访问灰度图直方图触发elemSize()断言失败求助
问题根源与解决建议
这个断言失败的核心原因是:你用at<float>访问的直方图矩阵hist,其实际存储的数据类型不是float,导致矩阵元素的实际字节大小(elemSize())和你指定的float类型字节大小(sizeof(float))不匹配,触发了OpenCV的类型检查断言。
排查与解决步骤
确认直方图的实际数据类型
在报错代码前添加一行打印,查看hist的类型:std::cout << "Histogram data type: " << hist.type() << std::endl;OpenCV的类型宏对应关系:
CV_32F(float类型,值为5)、CV_32S(int类型,值为4)、CV_64F(double类型,值为6)、CV_8U(unsigned char类型,值为0)。匹配访问类型与实际存储类型
- 如果打印结果是
4(CV_32S),说明直方图存储的是整数,需要改用at<int>访问:for (int i = 0; i < 256; i++) { hist.at<int>(i) = (hist.at<int>(i) / pixelAmount) * 255; } - 如果需要用
float类型操作,在生成直方图时明确指定输出类型:
创建hist时指定CV_32F,再传入calcHist:Mat hist(1, 256, CV_32F, Scalar(0)); calcHist(&src, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false);
- 如果打印结果是
关于官方文档示例的说明
官方文档中能用at<float>访问,是因为示例里生成的直方图明确指定了float类型存储。你的代码大概率是在调用calcHist时,没有指定输出矩阵的类型,导致OpenCV默认生成了整数类型的直方图,从而引发类型不匹配的断言错误。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

