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;
}
相关推荐
AKAMAI1 小时前
Akamai Cloud客户案例 | CloudMinister借助Akamai实现多云转型
人工智能·云计算
小a杰.3 小时前
Flutter 与 AI 深度集成指南:从基础实现到高级应用
人工智能·flutter
colorknight3 小时前
数据编织-异构数据存储的自动化治理
数据仓库·人工智能·数据治理·数据湖·数据科学·数据编织·自动化治理
Lun3866buzha3 小时前
篮球场景目标检测与定位_YOLO11-RFPN实现详解
人工智能·目标检测·计算机视觉
janefir4 小时前
LangChain框架下DirectoryLoader使用报错zipfile.BadZipFile
人工智能·langchain
齐齐大魔王4 小时前
COCO 数据集
人工智能·机器学习
AI营销实验室5 小时前
原圈科技AI CRM系统赋能销售新未来,行业应用与创新点评
人工智能·科技
爱笑的眼睛115 小时前
超越MSE与交叉熵:深度解析损失函数的动态本质与高阶设计
java·人工智能·python·ai
tap.AI5 小时前
RAG系列(一) 架构基础与原理
人工智能·架构
北邮刘老师6 小时前
【智能体互联协议解析】北邮ACPs协议和代码与智能体互联AIP标准的关系
人工智能·大模型·智能体·智能体互联网