cv::Mat 操作多维矩阵的思路

现在有一个 [20(rows) * 20(cols) * 144(channels)]的矩阵,我们想截取一个[20 * 20 * 80]的子矩阵:
cpp 复制代码
int dims[3] = {20, 20, 144};
cv::Mat mat(cv::Size(dims[1], dims[0]), CV_32FC(dims[2]), (void*)input);
const std::vector<cv::Range>& range{cv::Range::all(), cv::Range::all(), cv::Range(0,80)};
cv::Mat split_mat = mat(range);
//这时候会报错,因为Mat的()重载函数里assert(range.size() == mat.dims)
//但是mat.dims只记录mat.rows, mat.cols, 不记录mat.channels(),也就是dims=2,所以这里维度是不对等的
//想在144这个维度分割,有两个方法,将144放在rows或者cols上,
//这样可以用Mat operator()(const std::vector<Range>& ranges) const;
//但是后续对channels维度的操作不太方便,cv对高维度矩阵的操作不太方便
//所以用第二个方法:将三维矩阵变为二维矩阵(通道数变为1)
cv::Mat mat = mat.reshape(1, 400);  
// Mat Mat::reshape(int new_cn, int new_rows) const
// 请注意,reshape不会改变原始矩阵的布局,它只是返回一个新的矩阵头,指向原始数据的不同视图。
// mat size: [rows: 400 x cols: 144 x channels: 1]
const std::vector<cv::Range>& range{cv::Range::all(), cv::Range(0,80)};
cv::Mat split_mat = mat(range);
// split_mat size: [rows: 400 x cols: 80 x channels: 1]
cv::Mat 类不提供与 NumPy 相同的广播机制,下面是对一个单通道矩阵的softmax函数实现:(为了节省效率,所有操作均在原矩阵上进行,这意味着原矩阵的数已被改变)
cpp 复制代码
cv::Mat softmax(const cv::Mat& src) {
    CV_Assert(src.type() == CV_32FC1); // 确保输入矩阵是单通道的32位浮点类型
    for (auto i = 0; i < src.rows; ++i) {
      // 当你使用 src.row(i) 获取矩阵 src 的第 i 行时,你会得到一个指向原始矩阵中那一行的引用。
      // 这意味着,如果你修改了 singleRow,相应的行在原始矩阵 src 中也会被修改,因为它们是同一个数据的不同视图。
      cv::Mat singleRow = src.row(i);
      double max;
      cv::minMaxLoc(singleRow, NULL, &max, NULL, NULL);
      singleRow -= static_cast<float>(max);
      cv::exp(singleRow, singleRow);
      cv::Mat sumMat;
      cv::reduce(singleRow, sumMat, 1, cv::REDUCE_SUM, CV_32F); // 0得到row,1得到col
      float sum = sumMat.at<float>(0, 0); // at(row, col)
      singleRow /= sum;
    }
    return src;
}
相关推荐
爱凤的小光3 分钟前
Opencv常见学习链接(待分类补充)
人工智能·opencv·学习
python算法(魔法师版)8 分钟前
云计算,大数据,人工智能
大数据·人工智能·云计算
liuyang-neu1 小时前
目标检测 RT-DETR(2023)详细解读
人工智能·目标检测·计算机视觉
AI算法工程师Moxi1 小时前
目标检测基础知识
人工智能·目标检测·计算机视觉
大数据张老师1 小时前
解码AI:2025年人工智能技术发展全景图
javascript·css·人工智能
白熊1881 小时前
【图像大模型】AnimateDiff:基于扩散模型的视频生成技术解析与实践指南
人工智能·算法·音视频
几个几个n1 小时前
Matlab入门
开发语言·人工智能·matlab
Allen_LVyingbo1 小时前
传统医疗系统文档集中标准化存储和AI智能化更新路径分析
数据库·人工智能
学技术的大胜嗷1 小时前
YOLOv8损失函数代码详解(示例展示数据变换过程)
人工智能·python·深度学习·yolo·目标检测
代码小白 ac2 小时前
考研数一公式笔记
人工智能