OpenCV—基本矩阵操作与示例

OpenCV的基本矩阵操作与示例



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

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


1. 创建与初始化矩阵


1.1 数据类型

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

[cpp] view plain copy
  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类型矩阵,当然也可以直接手动创建矩阵,基本方法是指定矩阵尺寸和数据类型:

[cpp] view plain copy
  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类的几种初始化创建矩阵的方法:

[cpp] view plain copy
  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 矩阵加减法

我们可以使用"+"和"-"符号进行矩阵加减运算。
[cpp] view plain copy
  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 矩阵乘法

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

[cpp] view plain copy
  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()函数实现。
[cpp] view plain copy
  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()方法实现
[cpp] view plain copy
  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()函数实现。

[cpp] view plain copy
  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

[cpp] view plain copy
  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为对应维度的向量。

[cpp] view plain copy
  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 求最大最小值

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

[cpp] view plain copy
  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 – 可选的蒙版,用于选择待处理子区域

[cpp] view plain copy
  1. // 求极值 最大、最小值及其位置  
  2.     Mat img = imread("Lena.jpg",0);  
  3.     imshow("original image",img);  
  4.   
  5.     double minVal=0,maxVal=0;  
  6.     cv::Point minPt, maxPt;  
  7.     minMaxLoc(img,&minVal,&maxVal,&minPt,&maxPt);  
  8.     cout<<"min value  = "<<minVal<<endl;  
  9.     cout<<"max value  = "<<maxVal<<endl;  
  10.     cout<<"minPt = ("<<minPt.x<<","<<minPt.y<<")"<<endl;  
  11.     cout<<"maxPt = ("<<maxPt.x<<","<<maxPt.y<<")"<<endl;  
  12.     cout<<endl;  
  13.   
  14.     cv::Rect rectMin(minPt.x-10,minPt.y-10,20,20);  
  15.     cv::Rect rectMax(maxPt.x-10,maxPt.y-10,20,20);  
  16.   
  17.     cv::rectangle(img,rectMin,cv::Scalar(200),2);  
  18.     cv::rectangle(img,rectMax,cv::Scalar(255),2);  
  19.   
  20.     imshow("image with min max location",img);  
  21.     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

//

 转载:https://blog.csdn.net/iracer/article/details/51296631


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能的三大教父,谱写了一段关于勇气的寓言

来源&#xff1a;原理上世纪80年代末&#xff0c;还在加拿大攻读硕的尤舒亚本吉奥&#xff08;Yoshua Bengio&#xff09;被一个当时并不怎么流行的想法迷住了。那时&#xff0c;有少数从事人工智能研究的计算机科学家试图研发这样一种软件&#xff0c;这种软件可以大致模仿神经…

OpenCV——绘制基本图形

1、代码如下&#xff1a; #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp>using namespace cv;int main() {Size size(800,800);Size size2(300, 200);Mat img Mat::zeros(size, CV_8UC3);P…

动图|几张动图告诉你,工业机器人无所不能!

来源&#xff1a;机电微学堂1.最常见的汽车生产线车间 ☟2.准确抓住手机边缘 ☟3.装配机械手 ☟4.写毛笔字 ☟5.机器人参与上下料 ☟6.把次品投出 ☟7.喷涂机器人 ☟8.六轴机械手 ☟9.抓取机械手 ☟10.切香肠 ☟11.焊接 ☟12.点焊 ☟13.码垛机械手 ☟14.检测 ☟15.打台球 ☟16.…

银联在线支付---利用测试案例代码模拟支付应用(修改)

一、工程搭建 新建一个Web工程&#xff0c;命名为PayOnLine&#xff0c;把你下载好的案例代码拷贝到你的工程下&#xff0c;我的代码目录如下&#xff1a;acp_sdk.properties配置文件需要放在类根路劲下&#xff0c;里面的参数配置信息&#xff0c;下面是案例提供的配置提示&am…

图像处理-线性滤波-1 基础(相关算子、卷积算子、边缘效应)

这里讨论利用输入图像中像素的小邻域来产生输出图像的方法&#xff0c;在信号处理中这种方法称为滤波&#xff08;filtering&#xff09;。其中&#xff0c;最常用的是线性滤波&#xff1a;输出像素是输入邻域像素的加权和。1.相关算子&#xff08;Correlation Operator)定义&a…

力拎30磅!波士顿动力物流机器人Handle亮相,还会摆货架

来源&#xff1a;机器之心摘要&#xff1a;这是一个会堆箱子的机器人。自 2013 年被谷歌收购后&#xff0c;波士顿动力一直就是机器人公司中的「网红」&#xff0c;每次新视频的发布都能引起业内极大的关注。后来&#xff0c;因种种原因&#xff0c;波士顿动力于 2017 年被谷歌…

MFC基础类及其层次结构

MFC基础类及其层次结构 从类CComdTarget层层派生出绝大多数MFC中的类&#xff0c;其层次结构为下图所示. 从根类Cobject层层派生出绝大多数MFC中的类&#xff0c;其层次结构为下图所示. MFC中重点类 其中&#xff0c;CObject类是MFC提供的绝大多数类的基类。该类完成动态空间的…

6个整改!2018年国家重点实验室评估结果公布

来源&#xff1a;科技部网站近日&#xff0c;国家科技部公布了2018年工程和材料领域国家重点实验室评估处理结果。本次64个实验室参加评估&#xff0c;其中工程领域共有43个&#xff0c;材料领域共有21个。评估结果显示&#xff0c;共有6个实验室要求整改&#xff0c;没有实验室…

新智能时代颠覆情报的未来

来源&#xff1a;王飞跃的科学网博客摘要&#xff1a;人工情报机构以“数字”和软件的形式记录或承载了一个实际情报机构的知识、行动和组织等KAO一体化的步骤与过程。访中科院自动化研究所复杂系统管理与控制国家重点实验室主任 王飞跃本期嘉宾&#xff1a;王飞跃&#xff0c;…

MFC实现图像灰度、采样和量化功能详解

本文主要讲述基于VC6.0 MFC图像处理的应用知识&#xff0c;主要结合自己大三所学课程《数字图像处理》及课件进行讲解&#xff0c;主要通过MFC单文档视图实现显示BMP格式图片&#xff0c;并通过Bitmap进行灰度处理、图片采样和量化功能。 个人认为对初学者VC6.0可能还是…

97页PPT,读懂自动驾驶全产业链发展!

来源&#xff1a;兴业证券近年来&#xff0c;汽车电子正在朝着电动化、网联化、智能化、共享化方向发展&#xff0c;尤其是大幅精进的自动驾驶技术备受关注。本文汇总了自动驾驶相机、雷达、高精地图等产业链情况&#xff0c;从中可以看出汽车无人驾驶行业蓝图。如今&#xff0…

MFC对话框绘制灰度直方图

本文主要讲述基于VC6.0 MFC图像处理的应用知识&#xff0c;主要结合自己大三所学课程《数字图像处理》及课件进行回忆讲解&#xff0c;主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图&#xff0c;再获取平均灰度、中指灰度和标准差等值。文章比较详细基础&am…

一张图看懂华为2018年年报

来源&#xff1a;华为摘要&#xff1a;3 月 29 日&#xff0c;华为发布了 2018 年年度报告。报告显示&#xff0c;华为在 2018 的营收为 7212.02 亿元&#xff08;约合 1051.91亿美元&#xff09;&#xff0c;同比增长 19.5%&#xff0c;净利润 593 亿元人民币&#xff0c;同比…

MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理

本文主要讲述基于VC6.0 MFC图像处理的应用知识&#xff0c;主要结合自己大三所学课程《数字图像处理》及课件进行讲解&#xff0c;主要通过MFC单文档视图实现显示BMP图片点运算处理&#xff0c;包括图像灰度线性变换、灰度非线性变换、图像阈值化处理、图像均衡化处理等知识&am…

马化腾:5G和AI双核驱动产业互联网进入“快车道”

来源&#xff1a;腾讯科技腾讯科技讯 3月30至31日&#xff0c;2019中国&#xff08;深圳&#xff09;IT领袖峰会以“IT新未来&#xff1a;5G与人工智能”为主题&#xff0c;汇聚了众多科技领袖和各界精英&#xff0c;聚焦未来通信、工业互联网、数字城市、金融科技等热门话题。…

MFC空间几何变换之图像平移、镜像、旋转、缩放

本文主要讲述基于VC6.0 MFC图像处理的应用知识&#xff0c;主要结合自己大三所学课程《数字图像处理》及课件进行讲解&#xff0c;主要通过MFC单文档视图实现显示BMP图片空间几何变换&#xff0c;包括图像平移、图形旋转、图像反转倒置镜像和图像缩放的知识。同时文章比较详细基…

超级干货:一文看懂5G产业链及投资机会

来源&#xff1a;新材料在线摘要&#xff1a;本文将讲述5G行业概况、产业链结构、上游关键原材料、本行业竞争格局及材料重点应用领域。报告合集涵盖5G关键材料、5G天线、氮化镓半导体、导热材料、电磁屏蔽材料、高频覆铜板基材、微波介质陶瓷、先进封装、手机外壳等九大市场研…

MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化

本文主要讲述基于VC6.0 MFC图像处理的应用知识&#xff0c;主要结合自己大三所学课程《数字图像处理》及课件进行讲解&#xff0c;主要通过MFC单文档视图实现显示BMP图像增强处理&#xff0c;包括图像普通平滑、高斯平滑、不同算子的图像锐化知识。希望该篇文章对你有所帮助&am…

南京大学教授施斌及其团队—— 光纤变“神经” 大地能感知

来源&#xff1a;人民日报你能相信吗&#xff1f;一根头发丝粗细的光纤&#xff0c;根据不同地质环境和多场监测要求&#xff0c;穿上各种“定制”的外衣&#xff0c;就能变身敏感强健的“大地感知神经”&#xff0c;使得大地一有灾害异动&#xff0c;远在千里之外的监测系统就…

MFC详解显示BMP格式图片

本文主要是讲述《数字图像处理》系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存或显示…