当前位置: 首页 > news >正文

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

  • 现在有一个 [20(rows) * 20(cols) * 144(channels)]的矩阵,我们想截取一个[20 * 20 * 80]的子矩阵:
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函数实现:(为了节省效率,所有操作均在原矩阵上进行,这意味着原矩阵的数已被改变)
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得到colfloat sum = sumMat.at<float>(0, 0); // at(row, col)singleRow /= sum;}return src;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 快速响应需求:App路由动态化探索
  • 2024 年第十四届亚太数学建模竞赛(中文赛项)浅析
  • 【深度学习实战(44)】Anchor based and Anchor free(无锚VS有锚)
  • 鸿蒙笔记导航栏,路由,还有axios
  • Java基础概念
  • UDP通讯实现
  • 速盾:cdn 缓存图片
  • Vue基础知识:Vue3.3出现的defineOptions,如何使用,解决了什么问题?
  • 2. 年龄问题
  • 高效利用iCloud指南
  • Python中的类和对象:如何定义一个类以及如何创建类的实例(对象)
  • 网络安全合规建设
  • Nginx在线安装与启动
  • Stable Diffusion图像的脸部细节控制——采样器全解析
  • 【基于R语言群体遗传学】-13-群体差异量化-Fst
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 30天自制操作系统-2
  • 78. Subsets
  • Javascript编码规范
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js学习笔记
  • LeetCode算法系列_0891_子序列宽度之和
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • PAT A1050
  • Redux系列x:源码分析
  • socket.io+express实现聊天室的思考(三)
  • 大数据与云计算学习:数据分析(二)
  • 区块链技术特点之去中心化特性
  • 双管齐下,VMware的容器新战略
  • 容器镜像
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • # 安徽锐锋科技IDMS系统简介
  • #### golang中【堆】的使用及底层 ####
  • ######## golang各章节终篇索引 ########
  • #NOIP 2014# day.1 T2 联合权值
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $.each()与$(selector).each()
  • (八)Flink Join 连接
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (论文阅读11/100)Fast R-CNN
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .java 9 找不到符号_java找不到符号
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net 发送邮件
  • .net 怎么循环得到数组里的值_关于js数组
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Autowired多个相同类型bean装配问题
  • @PreAuthorize与@Secured注解的区别是什么?