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

 

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

  • 本文已收录于以下专栏:
  • Bin博士的机器视觉工作间

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

 

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 本文已收录于以下专栏:
  • Bin博士的机器视觉工作间

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

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

相关文章

中科院院士丁汉:数字化制造、机器人、人工智能是智能制造 “三驾马车”

丁汉院士演讲1月10日&#xff0c;由中国机电一体化技术应用协会、北京理工大学智能机器人与系统高精尖创新中心、中关村智友天使学院、机器人大讲堂(立德共创服务平台)、中关村融智特种机器人产业联盟和中关村信息谷等单位共同举办的2019年中国机器人行业年会在北京召开。会上&…

图像拼接---图片柱面投影简单实现

算法思想参考&#xff1a;http://blog.csdn.net/weixinhum/article/details/50611750 柱面投影是图片拼接的前期的一部分工作&#xff0c;以下代码只是简单的实现了投影&#xff0c;还可以优化&#xff0c; 柱面半径设置位图片宽度的一半&#xff0c;即 R width/2 代码运算…

从消费端到企业端,从设备到数据:物联网市场的爆发式增长

来源&#xff1a;资本家实验室随着越来越多的设备接入网络&#xff0c;并实现相互沟通&#xff0c;我们正在加速进入“万物互联”的时代。在此背景下&#xff0c;连接设备的数量、产生的收入和数据量也将呈现惊人的增长&#xff1a;到2020年&#xff0c;全球连接设备数量将达到…

《LoadRunner 没有告诉你的》之四——理解性能

本文是《LoadRunner没有告诉你的》系列文章的第四篇&#xff0c;在这篇短文中&#xff0c;我将尽可能用简洁清晰的文字写下我对“性能”的看法&#xff0c;并澄清几个容易混淆的概念&#xff0c;帮助大家更好的理解“性能”的含义。 如何评价性能的优劣: 用户视角 vs. 系统视角…

容斥原理---概念介绍

容斥原理---概念介绍 容斥原理是一种基本的计数工具。 假设我们有N个对象的集合A&#xff0c;设a1, a2,…, ar是这些对象可能有的性质的集合&#xff0c;设N(ai )是有性质ai的对象数目。一个对象可能有若干个所讨论的性质&#xff08;或一个性质也没有&#xff09;。设N(a’i …

c#自动更新+安装程序的制作

一、自动更新的实现 让客户端实现自动更新&#xff0c;通常做法是在客户端部署一个单独的自动更新程序。主程序启动后&#xff0c;访问服务端&#xff0c;检查配置文件是否有更新版本&#xff0c;有更新版本就启动更新程序&#xff0c;由更新负责下载更新版本&#xff0c;并更新…

中国AI科研产出全球第一 但引文影响力低

来源&#xff1a;科学网 日前&#xff0c;爱思唯尔发布了《人工智能&#xff1a;知识的创造、转移与应用》报告&#xff0c;分析了全球人工智能科研的发展趋势。报告显示&#xff0c;2017年中国在人工智能领域出版的文章数量位列全球第一&#xff0c;科研产出已在2004年超过美国…

OpenCV--SIFT算法检测特征点

代码选自&#xff1a;http://blog.csdn.net/zhaocj/article/details/42124473 SIFT算法是用来检测图像中特征点的&#xff0c; 代码如下&#xff1a; opencv版本:2.4.9 #include "opencv2/opencv.hpp" #include "opencv2/imgproc/imgproc.hpp" #include…

对话 Geoffrey Hinton Demis Hassabis :人工智能离我们有多远?

来源&#xff1a;AI科技评论预测用户喜欢的音乐类型、检测出转移性肿瘤、生成脑癌的综合扫描、利用真实世界中拍摄的视频创造出虚拟环境、识别出被拐卖的人口、击败国际象棋大师以及专业的 Dota2 电竞团队、帮助 Alphabet 旗下的 Waymo 首次推出商业无人驾驶出租车服务、代替出…

SharePoint 2013 关于自定义显示列表表单的bug

1、在SharePoint 2013中&#xff0c;我们隐藏列表Dispform页面的ListFormWebPart部件&#xff0c;转而使用自定义显示列表表单进行展示&#xff0c;因为这样更容易定制我们需要的显示&#xff1b; 2、之后发现文件夹下的文档&#xff0c;查看属性会报错&#xff0c;如下图&…

SIFT算法中概念简单解释

尺度空间 真实世界的物体只有在一定尺度上才有意义&#xff0c;例如我们能够看到放在桌子上的水杯&#xff0c;但对于整个银河系&#xff0c;这个水杯是不存在的。物体的这种多尺度的本质在自然界中是普遍存在的。尺度空间就是试图在数字图像领域复制这个概念。又比如&#xf…

发布|CES 2019 科技趋势(附40页PPT)

来源&#xff1a;Robot未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff…

UVAL - 6755 - Swyper Keyboard

先上题目&#xff1a; https://icpcarchive.ecs.baylor.edu/external/67/6755.pdf 题目复制起来比较麻烦。 题意&#xff1a;定义一种操作&#xff1a;给出一个字符串&#xff0c;然后手指就按照给出的字符串的字符出现顺序不离开触摸屏那样移动&#xff0c;这样最后就会得到一…

Ransac算法简介

给定两个点p1与p2的坐标&#xff0c;确定这两点所构成的直线&#xff0c;要求对于输入的任意点p3&#xff0c;都可以判断它是否在该直线上。初中解析几何知识告诉我们&#xff0c;判断一个点在直线上&#xff0c;只需其与直线上任意两点点斜率都相同即可。实际操作当中&#xf…

2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势

来源&#xff1a;网络大数据1、简介过去几年一直是人工智能爱好者和机器学习专业人士最幸福的时光。因为这些技术已经发展成为主流&#xff0c;并且正在影响着数百万人的生活。各国现在都有专门的人工智能规划和预算&#xff0c;以确保在这场比赛中保持优势。数据科学从业人员也…

仿射变换的原理

在条形码识别软件中有图像预览的功能。有时预览的图像需要进行转置&#xff08;旋转180度或者90度&#xff09;、缩放、镜像&#xff08;左右反转&#xff09;等操作。OpenCV提供了相应的函数进行以上操作。例如&#xff1a; 转置&#xff1a;cv::WarpAffine() 缩放&#xff…

拯救顽疾大作战!IDC绘中国医疗AI生态图谱,英伟达献医疗影像新杀器

来源&#xff1a;智东西摘要&#xff1a;中国千家医院部署AI系统&#xff01;IDC医疗AI报告详解行业趋势和五大药方。2018年是令人唏嘘的一年&#xff0c;台湾作家李敖、动画大师高畑勋、相声表演艺术家师胜杰、央视主持人李咏、微软联合创始人保罗艾伦、武侠小说宗师金庸等一个…

存在描述所有生命的方程吗?

○ 生物体既复杂又有序&#xff0c;就像这片亚麻茎的横截面。研究人员希望最终发展出描述所有生命的基本方程。来源&#xff1a;原理关于生命&#xff0c;没有什么是简单的。每一秒钟&#xff0c;都有数百万个缜密有序的化学反应发生在一个细胞内&#xff1b;数十亿个单细胞生物…

CSS3滤镜

今天在办公室亲眼目睹了同事使用CSS3滤镜为一张漂亮的照片轮廓加上了阴影&#xff0c;瞬间亮瞎了我的的双眼&#xff0c;见笑了。 所以也迅速尝试使用CSS3滤镜让最新出炉的MUI LOGO也性感一把&#xff0c;试图来愉悦一下大家的双眼。已经等不及了&#xff0c;赶紧奉上今天的测试…

全面认识“边缘云”,中国首份边缘云白皮书发布

来源&#xff1a;中国电子技术标准化研究院、阿里云摘要&#xff1a;《边缘云计算技术与标准化白皮书》近期发布&#xff0c;定义了边缘云计算的概念和标准等。中心云和边缘云相互配合&#xff0c;实现中心-边缘协同、全网算力调度、全网统一管控等能力&#xff0c;真正实现“无…