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;
}
相关推荐
求知呀34 分钟前
最直观的 Cursor 使用教程
前端·人工智能·llm
飞哥数智坊1 小时前
从“工具人”到“超级个体”:程序员如何在AI协同下实现能力跃迁
人工智能
chenqi1 小时前
WebGPU和WebLLM:在浏览器中解锁端侧大模型的未来
前端·人工智能
罗西的思考2 小时前
[2W字长文] 探秘Transformer系列之(23)--- 长度外推
人工智能·算法
小杨4043 小时前
python入门系列十四(多进程)
人工智能·python·pycharm
阿坡RPA18 小时前
手搓MCP客户端&服务端:从零到实战极速了解MCP是什么?
人工智能·aigc
用户277844910499318 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
机器之心18 小时前
刚刚,DeepSeek公布推理时Scaling新论文,R2要来了?
人工智能
算AI20 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
凯子坚持 c21 小时前
基于飞桨框架3.0本地DeepSeek-R1蒸馏版部署实战
人工智能·paddlepaddle