OpenCV—基本矩阵操作与示例

矩阵伪逆的opencv实现 1、矩阵的逆 定义: 设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得: AB=BA=I。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。 可逆条件: A是可逆矩阵的充分必要条件是,即可逆矩阵就是非奇异矩阵。(当 时,A称为奇异矩阵) 性质: -矩阵A可逆的充要条件是A的行列式不等于0。 -可逆矩阵一定是方阵。 -如果矩阵A是可逆的,A的逆矩阵是唯一的。 -可逆矩阵也被称为非奇... 阅读详情

OpenCV的基本矩阵操作与示例



OpenCV中的矩阵操作非常重要,本文总结了矩阵的创建、初始化以及基本矩阵操作,给出了示例代码,主要内容包括:

  • 创建与初始化
  • 矩阵加减法
  • 矩阵乘法
  • 矩阵转置
  • 矩阵求逆
  • 矩阵非零元素个数
  • 矩阵均值与标准差
  • 矩阵全局极值及位置
  • 其他矩阵运算函数列表


1. 创建与初始化矩阵


1.1 数据类型

建立矩阵必须要指定矩阵存储的数据类型,图像处理中常用的几种数据类型如下:


 
  1. CV_8UC1 // 8位无符号单通道
  2. CV_8UC3 // 8位无符号3通道
  3. CV_8UC4
  4. CV_32FC1 // 32位浮点型单通道
  5. CV_32FC3 // 32位浮点型3通道
  6. CV_32FC4

包括数据位深度8位、32位,数据类型U:uchar、F:float型以及通道数C1:单通道、C3:三通道、C4:四通道。


1.2 基本方法

我们可以通过载入图像来创建Mat类型矩阵,当然也可以直接手动创建矩阵,基本方法是指定矩阵尺寸和数据类型:


 
  1. // 基本方法
  2. cv:: Mat a(cv::Size(5,5),CV_8UC1); // 单通道
  3. cv::Mat b = cv::Mat(cv::Size( 5, 5),CV_8UC3); //3通道每个矩阵元素包含3个uchar值
  4. cout<< "a = "<< endl<<a<< endl<< endl;
  5. cout<< "b = "<< endl<<b<< endl<< endl;
  6. system( "pause");

运行结果:

3通道矩阵中,一个矩阵元素包含3个变量。


1.3 初始化方法

上述方法不初始化矩阵数据,因此将出现随机值。如果想避免这种情况,可使用Mat类的几种初始化创建矩阵的方法:


  
  1. // 初始化方法
  2. cv::Mat mz = cv::Mat::zeros(cv::Size( 5, 5),CV_8UC1); // 全零矩阵
  3. cv::Mat mo = cv::Mat::ones(cv::Size( 5, 5),CV_8UC1); // 全1矩阵
  4. cv::Mat me = cv::Mat::eye(cv::Size( 5, 5),CV_32FC1); // 对角线为1的对角矩阵
  5. cout<< "mz = "<< endl<<mz<< endl<< endl;
  6. cout<< "mo = "<< endl<<mo<< endl<< endl;
  7. cout<< "me = "<< endl<<me<< endl<< endl;
运行结果:


2. 矩阵运算


2.1 基本概念

 OpenCV的Mat类允许所有的矩阵运算。


2.2 矩阵加减法

我们可以使用"+"和"-"符号进行矩阵加减运算。

  
  1. cv::Mat a= Mat::eye(Size( 3, 2), CV_32F);
  2. cv::Mat b= Mat::ones(Size( 3, 2), CV_32F);
  3. cv::Mat c= a+b;
  4. cv::Mat d= a-b;


2.3 矩阵乘法

使用"*"号计算矩阵与标量相乘,矩阵与矩阵相乘(必须满足矩阵相乘的行列数对应规则)


  
  1. Mat m1= Mat::eye( 2, 3, CV_32F); //使用cv命名空间可省略cv::前缀,下同
  2. Mat m2= Mat::ones( 3, 2, CV_32F);
  3. cout<< "m1 = "<< endl<<m1<< endl<< endl;
  4. cout<< "m2 = "<< endl<<m2<< endl<< endl;
  5. // Scalar by matrix
  6. cout << "\nm1.*2 = \n" << m1* 2 << endl;
  7. // matrix per element multiplication
  8. cout << "\n(m1+2).*(m1+3) = \n" << (m1+ 1).mul(m1+ 3) << endl;
  9. // Matrix multiplication
  10. cout << "\nm1*m2 = \n" << m1*m2 << endl;


2.4 矩阵转置

矩阵转置是将矩阵的行与列顺序对调(第i行转变为第i列)形成一个新的矩阵。OpenCV通过Mat类的t()函数实现。

  
  1. // 转置
  2. Mat m1= Mat::eye( 2, 3, CV_32F);
  3. Mat m1t = m1.t();
  4. cout<< "m1 = "<< endl<<m1<< endl<< endl;
  5. cout<< "m1t = "<< endl<<m1t<< endl<< endl;
  6. system( "pause");
运行结果:


2.5 求逆矩阵

逆矩阵在某些算法中经常出现,在OpenCV中通过Mat类的inv()方法实现

  
  1. // 求逆
  2. Mat meinv = me.inv();
  3. cout<< "me = "<< endl<<me<< endl<< endl;
  4. cout<< "meinv = "<< endl<<meinv<< endl<< endl;
  5. system( "pause");
运行结果:

单位矩阵的逆就是其本身。

2.6 计算矩阵非零元素个数

计算物体的像素或面积常需要用到计算矩阵中的非零元素个数,OpenCV中使用countNonZero()函数实现。


  
  1. // 非零元素个数
  2. int nonZerosNum = countNonZero(me); // me为输入矩阵或图像
  3. cout<< "me = "<< endl<<me<< endl;
  4. cout<< "me中非零元素个数 = "<<nonZerosNum<< endl<< endl;
  5. system( "pause");
运行结果:


2.7 均值和标准差

OpenCV提供了矩阵均值和标准差计算功能,可以使用meanStdDev(src,mean,stddev)函数实现。

参数

  • src – 输入矩阵或图像
  • mean – 均值,OutputArray
  • stddev – 标准差,OutputArray


  
  1. // 均值方差
  2. Mat mean;
  3. Mat stddev;
  4. meanStdDev(me, mean, stddev); //me为前文定义的5×5对角阵
  5. cout<< "mean = "<<mean<< endl;
  6. cout<< "stddev = "<<stddev<< endl;
  7. system( "pause");

运行结果:

需要说明的是,如果src是多通道图像或多维矩阵,则函数分别计算不同通道的均值与标准差,因此返回值mean和stddev为对应维度的向量。


  
  1. Mat mean3;
  2. Mat stddev3;
  3. Mat m3(cv::Size(5,5),CV_8UC3,Scalar(255,200,100));
  4. cout<< "m3 = "<< endl<<m3<< endl<< endl;
  5. meanStdDev(m3, mean3, stddev3);
  6. cout<< "mean3 = "<<mean3<< endl;
  7. cout<< "stddev3 = "<<stddev3<< endl;
  8. system( "pause");

多通道矩阵运算结果:




2.8 求最大最小值

求输入矩阵的全局最大最小值及其位置,可使用函数:


  
  1. void minMaxLoc(InputArray src, CV_OUT double* minVal,
  2. CV_OUT double* maxVal=0, CV_OUT Point* minLoc=0,
  3. CV_OUT Point* maxLoc=0, InputArray mask=noArray());

参数:

  • src – 输入单通道矩阵(图像).
  • minVal – 指向最小值的指针, 如果未指定则使用NULL
  • maxVal – 指向最大值的指针, 如果未指定则使用NULL
  • minLoc – 指向最小值位置(2维情况)的指针, 如果未指定则使用NULL
  • maxLoc – 指向最大值位置(2维情况)的指针, 如果未指定则使用NULL
  • mask – 可选的蒙版,用于选择待处理子区域


  
  1. // 求极值 最大、最小值及其位置
  2. Mat img = imread( "Lena.jpg", 0);
  3. imshow( "original image",img);
  4. double minVal= 0,maxVal= 0;
  5. cv::Point minPt, maxPt;
  6. minMaxLoc(img,&minVal,&maxVal,&minPt,&maxPt);
  7. cout<< "min value = "<<minVal<< endl;
  8. cout<< "max value = "<<maxVal<< endl;
  9. cout<< "minPt = ("<<minPt.x<< ","<<minPt.y<< ")"<< endl;
  10. cout<< "maxPt = ("<<maxPt.x<< ","<<maxPt.y<< ")"<< endl;
  11. cout<< endl;
  12. cv:: Rect rectMin(minPt.x-10,minPt.y-10,20,20);
  13. cv:: Rect rectMax(maxPt.x-10,maxPt.y-10,20,20);
  14. cv::rectangle(img,rectMin,cv::Scalar( 200), 2);
  15. cv::rectangle(img,rectMax,cv::Scalar( 255), 2);
  16. imshow( "image with min max location",img);
  17. cv::waitKey();
运行结果:


输入图像及其最大最小值位置


3. 其他矩阵运算

其他矩阵运算函数见下表:

Function (函数名)

Use (函数用处)

add

矩阵加法,A+B的更高级形式,支持mask

scaleAdd

矩阵加法,一个带有缩放因子dst(I) = scale * src1(I) + src2(I)

addWeighted

矩阵加法,两个带有缩放因子dst(I) = saturate(src1(I) * alpha + src2(I) * beta + gamma)

subtract

矩阵减法,A-B的更高级形式,支持mask

multiply

矩阵逐元素乘法,同Mat::mul()函数,与A*B区别,支持mask

gemm

一个广义的矩阵乘法操作

divide

矩阵逐元素除法,与A/B区别,支持mask

abs

对每个元素求绝对值

absdiff

两个矩阵的差的绝对值

exp

求每个矩阵元素 src(I) 的自然数 e 的 src(I) 次幂 dst[I] = esrc(I)

pow

求每个矩阵元素 src(I) 的 p 次幂 dst[I] = src(I)p

log

求每个矩阵元素的自然数底 dst[I] = log|src(I)| (if src != 0)

sqrt

求每个矩阵元素的平方根

min, max

求每个元素的最小值或最大值返回这个矩阵 dst(I) = min(src1(I), src2(I)), max同

minMaxLoc

定位矩阵中最小值、最大值的位置

compare

返回逐个元素比较结果的矩阵

bitwise_and, bitwise_not, bitwise_or, bitwise_xor

每个元素进行位运算,分别是和、非、或、异或

cvarrToMat

旧版数据CvMat,IplImage,CvMatND转换到新版数据Mat

extractImageCOI

从旧版数据中提取指定的通道矩阵给新版数据Mat

randu

以Uniform分布产生随机数填充矩阵,同 RNG::fill(mat, RNG::UNIFORM)

randn

以Normal分布产生随机数填充矩阵,同 RNG::fill(mat, RNG::NORMAL)

randShuffle

随机打乱一个一维向量的元素顺序

theRNG()

返回一个默认构造的RNG类的对象

 theRNG()::fill(...)

reduce

矩阵缩成向量

repeat

矩阵拷贝的时候指定按x/y方向重复

split

多通道矩阵分解成多个单通道矩阵

merge

多个单通道矩阵合成一个多通道矩阵

mixChannels

矩阵间通道拷贝,如Rgba[]到Rgb[]和Alpha[]

sort, sortIdx

为矩阵的每行或每列元素排序

setIdentity

设置单元矩阵

completeSymm

矩阵上下三角拷贝

inRange

检查元素的取值范围是否在另两个矩阵的元素取值之间,返回验证矩阵

checkRange

检查矩阵的每个元素的取值是否在最小值与最大值之间,返回验证结果bool

sum

求矩阵的元素和

mean

求均值

meanStdDev

均值和标准差

countNonZero

统计非零值个数

cartToPolar, polarToCart

笛卡尔坐标与极坐标之间的转换

flip

矩阵翻转

transpose

矩阵转置,比较 Mat::t() AT

trace

矩阵的迹

determinant

行列式 |A|, det(A)

eigen

矩阵的特征值和特征向量

invert

矩阵的逆或者伪逆,比较 Mat::inv()

magnitude

向量长度计算 dst(I) = sqrt(x(I)2 + y(I)2)

Mahalanobis

Mahalanobis距离计算

phase

相位计算,即两个向量之间的夹角

norm

求范数,1-范数、2-范数、无穷范数

normalize

标准化

mulTransposed

矩阵和它自己的转置相乘 AT * A, dst = scale(src - delta)T(src - delta)

convertScaleAbs

先缩放元素再取绝对值,最后转换格式为8bit型

calcCovarMatrix

计算协方差阵

solve

求解1个或多个线性系统或者求解最小平方问题(least-squares problem)

solveCubic

求解三次方程的根

solvePoly

求解多项式的实根和重根

dct, idct

正、逆离散余弦变换,idct同dct(src, dst, flags | DCT_INVERSE)

dft, idft

正、逆离散傅立叶变换, idft同dft(src, dst, flags | DTF_INVERSE)

LUT

查表变换

getOptimalDFTSize

返回一个优化过的DFT大小

mulSpecturms

两个傅立叶频谱间逐元素的乘法


上表引自:http://blog.sina.com.cn/s/blog_7908e1290101i97z.html


转载请注明出处(本文更新链接):http://blog.youkuaiyun.com/iracer/article/details/51296631

    OpenCV中的矩阵操作 OpenCV中的矩阵操作主要围绕Mat类展开,涵盖创建、访问、运算及变换等。 阅读详情

    相关推荐

    OpenCV | 基本矩阵操作

    起因 在2013年1月份发行的OpenCV 2.4.4中,对Java的支持也正式发布。同时也有支持Python。 环境配置 这里的环境配置十分简单,在这里,操作系统64位,所以选这个,将里面的opencv_java342.dll负责到你本地下载的JDK的bin目录下,和JDK下的JRE目录下的bin目录下。 我使用的是Eclipse,在Eclipse新建Java工程后将opencv-3...

    啦啦啦啊摘月亮 的博客 1642

    Opencv-C++笔记 (2) : opencv的矩阵操作

    这个混杂(“scrambled”)矩阵的特征值将和真正的协方差矩阵的特征值匹配,真正的特征向量可以很容易的从混杂 (“scrambled”)协方差矩阵的特征向量中计算出来。或者如果协方差矩阵是部分计算出来的 - 倘若这样, avg 不是输入向量的子集的平均值,而是整个集合的平均向量。目前这个函数比函数 cvSVD 要慢,精确度要低, 如果已知 A 是正定的,(例如, 它是一个协方差矩阵), 它通常被交给函数 cvSVD 来计算其特征值和特征向量,尤其是在不需要计算特征向量的情况下。

    jiyanghao19的博客 4052

    ubuntu20.04升级OpenSSH

    业务需求,需要将服务器的OpenSSH版本从8.2升级到最新版本(9.9),由于apt能提供的最新版本就是8.2,所以需要采用源码安装的方式。

    xiamu66的博客 1524

    OpenCV矩阵运算

    一、矩阵 Mat I,img,I1,I2,dst,A,B; double k,alpha; Scalar s; 1.加法 I=I1+I2;//等同add(I1,I2,I); add(I1,I2,dst,mask,dtype); scaleAdd(I1,scale,I2,dst);//dst=scale*I1+I2; 2.减法 absdiff(I1,I2,I);//I=|I1-I2

    延陵小明 3万+

    解读文献(五)------基于阻抗控制

    文章目录背景主动柔顺控制阻抗控制基于力的阻抗控制基于位置的阻抗控制力位混合控制 背景 主动柔顺控制 阻抗控制 基于力的阻抗控制 基于位置的阻抗控制 力位混合控制 ...

    accumulation 1万+

    Seurat3.0小提琴图腰围的参数

    小提琴图没有有些群没有出现小提琴只有点点,是由于0值比例太多, 一个关键的参数scale = "width"导致了这种局面,应加上上述参数 ggplot(p$data,aes(ident,CD4)) + geom_violin(scale = "width", adjust =1, trim = TRUE) + geom_jitter()+ theme_bw() adjust参数可以调整腰的粗细,eg: ggplot(p$data,aes(ident,CD4)) + geom_violin(scale

    Demomwu的博客 1661

    OpenCV矩阵操作

    文章目录1.矩阵创建2.矩阵初始化3.矩阵转置(t())4.矩阵求逆(inv)5.矩阵元素访问ptr<>()at<>()6. 行列式(determinant)7.矩阵复制(clone/copyTo)8.矩阵行列的提取(rowRange/colRange)9.对角矩阵(diag)10.矩阵重塑(reshape)11.范数(cv::norm)12.对Mat进行排序13.矩阵其他...

    windistance的博客 3474

    树莓派4在Bookworm Raspbian系统下无法进入桌面模式(启动后出现彩色画面,然后一直黑屏,但是可以正常启动和ssh)

    本文记录了这段比较坎坷的探索之路,由于你的问题不一定是我最终解决方案的,可能是前面探索路上试过的,所以建议按顺序看排除前置问题。 双十一又买了个树莓派 4B,插上之前树莓派 4B 的 TF 卡直接就能使用(毕竟是一样规格的)。但是由于用来连接硬盘的 USB 线是坏的,我以为是系统问题就进行了重装(所以坏掉的线还是直接扔了好)。 重新安装系统就装了最新的 2023-10-10 版本的 64 位的 Raspberry Pi OS,但是出现了一个问题: 启动后出现彩色画面,然后一直黑屏。

    ZhongUncle的博客 3735

    OpenCV3之Mat矩阵操作

    文章目录三、矩阵操作1.转置(1)transpose()(2)Mat::t()2.加减 OpenCV—基本矩阵操作与示例 三、矩阵操作 1.转置 (1)transpose() 原型 void transpose(InputArray src, OutputArray dst); 参数 src:要转置的矩阵 dst:转置后的矩阵。可以像下面例子一样不用创建实际空间。 例子 #i...

    sandalphon4869的博客 2030

    用Python爬取公众号历史所有文章,看这篇就够了

    手把手教你爬取公众号历史所有文章

    u010522887的专栏 1万+

    算法之动态规划(DP)求解完全背包问题

    算法之动态规划(DP)求解01背包问题 上面这篇文章主要讲解了01背包问题和动态规划算法,如果你不了解动态规划算法,建议先浏览一下这篇文章熟悉一下,因为,本文的算法思想是基于这篇文章的。 1、什么是完全背包问题? **01背包问题:**有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品只能取1次放入背包中,背包所有物品权重和最大是多少? 完全背包: 有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品可以取无限次放入背包中,背包所有物品权重和

    PRML_MAN的博客 2万+

    OpenCV的基本矩阵操作与示例

    OpenCV的基本矩阵操作与示例

    jacke121的专栏 2333

    从CTFShow靶场实战,聊聊Node.js原型链污染漏洞的几种利用姿势(附详细复现步骤)

    本文深入剖析Node.js原型链污染漏洞的原理与实战利用,通过复现CTFShow靶场题目(web338-web341),详细演示五种高级利用技巧,包括基础污染、多级污染、模板引擎RCE等,并提供防御方案与最佳实践,帮助开发者提升Web应用安全性。

    weixin_30791095的博客 445

    C++调用Opencv实现基本矩阵操作

    1、生成常用矩阵 Mat类中的函数eye(),one()在mat.hpp文件中有申明: /*@param rows Number of rows. @param cols Number of columns. @param type Created matrix type.*/ static MatExpr eye(int rows, int cols, int type); sta...

    hsy7862323887的博客 5067

    客服转人工率直降60%!OpenClaw深度集成NLP引擎,打造企业级对话自动化智能客服系统

    本文介绍了一套基于OpenClaw智能体框架和NLP大模型引擎的智能客服系统解决方案。该系统通过深度集成NLP引擎实现精准语义理解,采用分层架构设计支持多渠道接入和业务系统对接,显著提升了客服效率。核心亮点包括:92%的重复问题自动解决率,60%的转人工率下降,40%的人力成本降低,以及从30秒压缩至0.5秒的平均响应时长。文章详细阐述了技术选型、系统架构设计、核心模块实现等关键环节,展示了如何通过智能对话系统破解传统客服业务中的人力资源与服务质量矛盾。

    专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 361

    OV9734 DATASHEET,完整规格书

    OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

    OpenCV 基本矩阵操作与示例

    OpenCV的基本矩阵操作与示例 OpenCV中的矩阵操作非常重要,本文总结了矩阵的创建、初始化以及基本矩阵操作,给出了示例代码,主要内容包括: 创建与初始化矩阵加减法矩阵乘法矩阵转置矩阵求逆矩阵非零元素个数矩阵均值与标准差矩阵全局极值及位置其他矩阵运算函数列表 1. 创建与初始化矩阵 1.1 数据类型 建立矩阵必须要指定矩阵存储的数据类型,图像处理中常用的几种数据类型如下: CV_8...

    张齐贤的博客 3640

    IDEA的使用指南

    IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

    opencv简单的矩阵操作

    OpenCV的基本矩阵操作与示例 OpenCV中的矩阵操作非常重要,本文总结了矩阵的创建、初始化以及基本矩阵操作,给出了示例代码,主要内容包括: 创建与初始化 矩阵加减法 矩阵乘法 矩阵转置 矩阵求逆 矩阵非零元素个数 矩阵均值与标准差 矩阵全局极值及位置 其他矩阵运算函数列表 1.创建与初始化矩阵 1.1数据类型 建立矩阵必须要...

    阿桑的专栏 1069

    LinePhone3.2.7(android端最新版本) sip客户端

    SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

    VB摄像头监控

    该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

    OpenCV 矩阵操作 CvMat

    综述: OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.OpenCV将向量作为1维矩阵处理.矩阵按行存储,每行有4字节的校整.分配矩阵空间:CvMat* cvCreateMat(int rows, int cols, int type); type: 矩阵元素类型. 格式为CV_(S|

    schoolers的专栏 1万+

    Opencv C++ 矩阵的基本操作

    #include <iostream> #include <string> #include <sstream> using namespace std; // OpenCV include; //#include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include &l...

    廷益_飞鸟的博客 1113
    上一篇: 15-基本阈值操作
    下一篇: 16-自定义线型滤波
    hellohake
    博客等级 码龄10年 4543粉丝 108原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值