OpenCV 3.4.1 C++:二维Mat转向量求平均技术问询
没问题,我来帮你搞定这个需求!你已经成功创建了CV_32FC1类型的二维Mat,接下来用cv::reduce()实现转换和平均值计算的思路很清晰,我分情况给你讲:
情况1:将二维矩阵归约为全局平均值的单元素向量
如果你想要的是整个矩阵的平均值,并把它作为一个单元素的一维向量,可以通过两次reduce操作实现:
#include <opencv2/core/core.hpp> // 假设你的dat矩阵已经创建完成 cv::Mat col_avg; // 第一步:按行归约,计算每一列的平均值,得到1×cols的矩阵 cv::reduce(dat, col_avg, 0, CV_REDUCE_AVG, CV_32FC1); cv::Mat total_avg_vec; // 第二步:对列平均值的结果按列归约,得到整个矩阵的平均值(1×1的向量) cv::reduce(col_avg, total_avg_vec, 1, CV_REDUCE_AVG, CV_32FC1); // 提取平均值的数值 float global_avg = total_avg_vec.at<float>(0, 0);
情况2:先将二维矩阵展平为一维向量,再计算平均值
如果你的需求是先把二维矩阵展平成包含所有元素的一维向量,再计算这个向量的平均值:
注意:
cv::reduce()本身是归约工具,不是用来展平矩阵的。展平矩阵更适合用cv::Mat::reshape(),之后再用reduce计算平均值:
// 展平二维矩阵为1行的一维向量(也可以改成0行,得到列向量) cv::Mat flat_vec = dat.reshape(1, 1); cv::Mat avg_vec; // 对一维向量归约求和,再除以元素总数得到平均值 cv::reduce(flat_vec, avg_vec, 1, CV_REDUCE_SUM, CV_32FC1); float avg = avg_vec.at<float>(0, 0) / (dat.rows * dat.cols);
重要提示:内存释放
你用new手动分配了rawdata,而cv::Mat在这种构造方式下不会自动释放外部内存,所以记得在dat不再使用后,手动释放内存:
delete[] rawdata;
内容的提问来源于stack exchange,提问作者astronomerdave
相关产品推荐
相关产品推荐

