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

OpencvSharp 算子学习教案之 - Cv2.CalcCovarMatrix 重载1

OpencvSharp 算子学习教案之 - Cv2.CalcCovarMatrix 重载1大家好Opencv在很多工程项目中都会用到而OpencvSharp则是以C#开发与实现的Opencv操作库对.NET开发人员友好但很多API的中文资料、应用场景及常见坑点等缺乏系统性归纳因此这系列博客将给大家带来Cv2及Mat对象全系列算子学习教案供大家参考学习。Cv2.CalcCovarMatrix教案版本V1.0面向对象OpenCvSharp 初学者所属模块core源码位置OpenCvSharp/Cv2/Cv2_core.cs:2545摘要InputArray 重载适合“样本已经排成一个矩阵”的情况。本文用一个三行两列的样本矩阵演示 Rows 标志的含义并帮助初学者理解协方差矩阵与均值向量是怎样从单个输入矩阵里计算出来的。1. 函数名称带参数签名publicstaticvoidCalcCovarMatrix(InputArraysamples,OutputArraycovar,InputOutputArraymean,CovarFlagsflags,MatType?ctypenull)2. 函数用途Cv2.CalcCovarMatrix的这个重载会从一个已经排好行或列的矩阵中计算协方差矩阵和均值向量。它最常见的用途有处理表格型样本数据。对已经堆叠好的特征矩阵做统计分析。为 PCA、马氏距离等算法准备协方差基础数据。如果你的数据已经是一个大矩阵这个重载通常比先拆成Mat[]更直接。3. 函数公式协方差矩阵的常见定义是cov⁡(x)1N∑i1N(xi−μ)(xi−μ)T \operatorname{cov}(x) \frac{1}{N} \sum_{i1}^{N} (x_i - \mu)(x_i - \mu)^Tcov(x)N1​i1∑N​(xi​−μ)(xi​−μ)T其中NNN是样本个数xix_ixi​是第iii条样本μ\muμ是均值向量。本文示例把样本放在矩阵的每一行[123456] \begin{bmatrix} 1 2 \\ 3 4 \\ 5 6 \end{bmatrix}​135​246​​它的均值向量是[3,4] [3, 4][3,4]归一化后的协方差矩阵仍然是[83838383] \begin{bmatrix} \frac{8}{3} \frac{8}{3} \\ \frac{8}{3} \frac{8}{3} \end{bmatrix}[38​38​​38​38​​]4. 函数原理说明CalcCovarMatrix(InputArray samples, ...)可以理解成读取输入矩阵。根据Rows或Cols判断哪一个方向是样本方向。先计算均值向量。再把每条样本减去均值。最后组合成协方差矩阵。对初学者来说最容易混淆的是Rows和Cols的方向选择。这个重载本身非常灵活但也因此更容易写错标志位。5. 参数含义解析参数名类型必填含义samplesInputArray是输入样本矩阵covarOutputArray是输出协方差矩阵meanInputOutputArray是输入/输出均值向量flagsCovarFlags是协方差计算方式相关标志ctypeMatType?否输出矩阵类型默认可由 OpenCV 选择补充说明如果样本放在行里就用Rows。如果样本放在列里就用Cols。Normal负责使用常规协方差公式。Scale负责按样本个数归一化。mean既可以作为输出也可以在UseAvg时作为输入均值。6. 应用场景列表场景名场景说明典型用途场景A表格型数据每一行就是一条样本数据分析入门场景B行样本统计直接按行算协方差特征工程场景CPCA 前置处理先求协方差再分解降维教学7. 函数使用示例下面的 Console 程序演示Cv2.CalcCovarMatrix(InputArray samples, ...)。为了让结果更容易看懂我们把三条样本直接排成一个矩阵并且明确告诉函数“每一行都是一条样本”。usingSystem.Text;usingOpenCvSharp;internalstaticclassProgram{/// summary/// 程序入口。/// /summaryprivatestaticvoidMain(){// 控制台要支持中文输出避免说明文字乱码。Console.OutputEncodingEncoding.UTF8;// 这里把三条样本直接放进一个矩阵里每一行都代表一条观测值。varsourceDatanewdouble[,]{{1.0,2.0},{3.0,4.0},{5.0,6.0},};usingvarsourceCreateMatrix(sourceData);usingvarcovariancenewMat();usingvarmeannewMat();// Rows 表示“每一行都是一条样本”Normal 和 Scale 仍然分别负责公式和归一化。Cv2.CalcCovarMatrix(source,covariance,mean,CovarFlags.Rows|CovarFlags.Normal|CovarFlags.Scale,MatType.CV_64FC1);varactualCovarianceReadDoubleMatrix(covariance);varactualMeanReadDoubleMatrix(mean);varexpectedCovariancenewdouble[,]{{8.0/3.0,8.0/3.0},{8.0/3.0,8.0/3.0},};varexpectedMeannewdouble[,]{{3.0,4.0},};Console.WriteLine(InputArray 重载的输出结果);PrintMatrix(样本矩阵每一行都是一条样本,sourceData);PrintMatrix(协方差矩阵,actualCovariance);PrintMatrix(均值向量,actualMean);PrintMatrix(期望协方差矩阵,expectedCovariance);PrintMatrix(期望均值向量,expectedMean);}/// summary/// 把二维数组写入 Mat。/// /summaryprivatestaticMatCreateMatrix(double[,]values){returnMat.FromPixelData(values.GetLength(0),values.GetLength(1),MatType.CV_64FC1,values);}/// summary/// 从 Mat 读取 double 二维数组。/// /summaryprivatestaticdouble[,]ReadDoubleMatrix(Matsource){usingvarconvertednewMat();source.ConvertTo(converted,MatType.CV_64FC1);varresultnewdouble[converted.Rows,converted.Cols];for(varrow0;rowconverted.Rows;row){for(varcol0;colconverted.Cols;col){result[row,col]converted.Atdouble(row,col);}}returnresult;}/// summary/// 打印矩阵内容。/// /summaryprivatestaticvoidPrintMatrix(stringtitle,double[,]matrix){Console.WriteLine(title);for(varrow0;rowmatrix.GetLength(0);row){varlinenewStringBuilder([);for(varcol0;colmatrix.GetLength(1);col){line.Append(matrix[row,col].ToString(F6,System.Globalization.CultureInfo.InvariantCulture));if(colmatrix.GetLength(1)-1){line.Append(, );}}line.Append(]);Console.WriteLine(line.ToString());}Console.WriteLine();}}8. 运行结果解读运行后你会看到输出的均值向量和 Mat[] 版本一致。协方差矩阵的数值也和手工结果一致。只要 Rows 标志写对单矩阵输入就非常直接。这说明 InputArray 重载特别适合已经整理好的表格型样本数据。9. 常见误区与注意事项不要忘记写Rows或Cols。不要把样本方向写反。不要把Normal和Scale的作用混淆。如果你已经有均值也可以考虑配合UseAvg减少重复计算。10. 扩展思考如果你的数据是按列保存的只要把Rows改成Cols同一套思路也能继续使用。这个函数和Eigen经常配套出现因为协方差矩阵本身往往就是后续特征分解的输入。11. 小结InputArray 重载最适合“样本已经排成一个矩阵”的情况。只要你能分清样本是按行还是按列存放这个函数就很好理解。
http://www.gsyq.cn/news/1400536.html

相关文章:

  • 网易云音乐NCM格式解密终极指南:3步实现跨平台播放自由
  • 告别网盘下载限速:9大平台直链解析神器LinkSwift完全指南
  • 嵌入式学习之路->stm32篇->(15)通用定时器(下)
  • Steam成就管理新维度:5分钟掌握SAM工具的核心功能与应用场景
  • 构建本地语音AI智能体:三步流水线实现语音到执行的自动化
  • Windows Subsystem for Android 技术架构深度解析与高级配置指南
  • 终极指南:如何快速逆向Wallpaper Engine资源并提取TEX纹理
  • 如何在3分钟内完成100个视频号下载:终极资源下载器完全指南
  • 多Agent协作示例--请假审批系统(基于Spring AI Alibaba)
  • TranslucentTB:解决Windows任务栏透明化安装失败的终极指南
  • 从IIC时序到电压值:用逻辑分析仪调试STM32驱动ADS1115的全记录
  • 免费解锁百度网盘高速下载:baidu-wangpan-parse终极使用指南
  • 5分钟掌握XUnity.AutoTranslator:让Unity游戏秒变中文版的终极神器
  • 从结构化到面向对象:系统架构设计方法的核心演进
  • AI代理支付自动化:Ramp CLI如何重构金融基础设施与威胁Visa模式
  • 网络通信:套接字编程全解析
  • 【CGLIB】如何使用 `FixedValue` 回调来固定返回某个值,而不调用原方法?
  • 2026年4月推拉窗批发厂家推荐,吊趟门/断桥门窗/系统门窗/断桥窗沙一体外开窗/断桥铝合金门窗,推拉窗门店怎么选择 - 品牌推荐师
  • 为什么说售后服务能力是选择Agent厂商的关键?深度解析企业级AI智能体落地避坑指南
  • 从心跳脚本到AI CLI工作者监督系统:进程守护与健康检查实战
  • 跨境电商产品变体匹配:LLM、Embedding、CV与规则引擎的混合架构实践
  • 【运维心得】彩色喷墨“只打彩色不打黑”?一招搞定
  • 提取矩阵特定多列元素
  • 网页聊天室-测试报告
  • 现代作品集重构指南:从展示到论证,打造高价值个人品牌
  • 别再只用if-else了!用Simulink Relay模块给你的控制逻辑加个‘防抖’缓冲区(附C代码生成分析)
  • 宿迁泗洪县黄金 白银 名表 名包 银元 奢侈品回收就选金佑福 - huangjinhs
  • 超时重试:设置请求超时与自动重试机制(Retry策略),爬虫优雅降级之道:超时重试机制的深度实践与源码解析
  • skynet——服务发现学习
  • 腾讯元宝复制带符号文字怎么快速删改?手贱星人有救了!这款“AI导出鸭”气哭CTRL+C/V党