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;
}
相关推荐
idealmu18 分钟前
知识蒸馏(KD)详解一:认识一下BERT 模型
人工智能·深度学习·bert
Cathyqiii20 分钟前
生成对抗网络(GAN)
人工智能·深度学习·计算机视觉
ai产品老杨1 小时前
打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程的智慧工业开源了
人工智能·开源·音视频·能源
小陈phd2 小时前
高级RAG策略学习(五)——llama_index实现上下文窗口增强检索RAG
人工智能
凯禾瑞华养老实训室4 小时前
人才教育导向下:老年生活照护实训室助力提升学生老年照护服务能力
人工智能
湫兮之风5 小时前
Opencv: cv::LUT()深入解析图像块快速查表变换
人工智能·opencv·计算机视觉
Christo35 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
qq_508823405 小时前
金融量化指标--2Alpha 阿尔法
大数据·人工智能
黑金IT6 小时前
`.cursorrules` 与 `.cursorcontext`:Cursor AI 编程助手时代下的“双轨配置”指南
人工智能
学弟6 小时前
快捷:常见ocr学术数据集预处理版本汇总(适配mmocr)
计算机视觉