转自:https://blog.csdn.net/qq_29796317/article/details/73743296

  • 一、矩阵

    • 1.加法
    • 2.减法
    • 3.乘法
    • 4.除法
    • 5.转换
    • 6.其他
    • 7.运算符
    • 8.比较
    • 9.按位运算:
    • 10.最值
    • 11.行列式运算
  • 二.初始化
  • 三.矩阵读取和修改
    • (1)1个通道:
    • (2)3个通道:
  • 四.较复杂运算
  • 五、其他数据结构

一、矩阵

Mat I,img,I1,I2,dst,A,B;
double k,alpha;
Scalar s;

//Scalar 是一个结构体,常用来存储像素,比如Scalar s;
s=cvGet2D(pImg,x,y);
s.val[0],s.val[1],s.val[2]就是对应的图像BGR的值

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|;
A-B;A-s;s-A;-A;
subtract(I1,I2,dst);

3.乘法

I=I.mul(I);//点乘,I.mul(I,3);–>I=3*I.^2
Mat C=A.mul(5/B);//==divide(A,B,C,5);

A*B;矩阵相乘

I=alpha*I;
Mat::cross(Mat);//三维向量(或矩阵)的叉乘,A.cross(B)
double Mat::dot(Mat);//2个向量(或矩阵)的点乘的结果,A.dot(B)
mul——-multiply
pow(src,double p,dst);//如果p是整数dst(I)=src(I)^p;其他|src(I)|^plog(src,dst)//自然对数运算

4.除法

divide(I1,I2,dst,scale,int dtype=-1);//dst=saturate_cast(I1*scale/I2);
A/B;alpha/A;都是点除

5.转换

I.convertTo(I1,CV_32F);//类型转换
A.t();//转置
flip(I,dst,int flipCode);//flipCode=0是上下翻转,>0时左右翻转,<0时一起来
sqrt(I,dst);
cvtColor(I,dst,int code,int dstCn=0);
resize:对图像进行形变

————————————————————————–

6.其他

Scalar s=sum(I);各通道求和
norm,countNonZero,trace,determinant,repeat都是返回Mat或者Scalar
countNonZero:用来统计非零的向量个数.(rows*cols个)
Scalar m=mean(I);//各通道求平均
Mat RowClone=C.row(1).clone();//复制第2行
addWeight(I1,alpha,I2,beta,gamma,dst,int dtype=-1);//dst=saturate(alpha*I1+beta*I2+gamma);dtype是dst的深度

—————————————————————————-

7.运算符

log10()log(I,dst);//如果Iij!=0;则dstij=log(|Iij|)exp(I,dst);//dst=exp(I);计算每个数组元素的指数
randu(I,Scalar::all(0),Scalar::all(255));Mat::t()转置Mat::inv(int method=DECOMP_LU)求逆。method=DECOMP_CHOLESKY(专门用于对称,速度是LU的2倍),DECOMP_SVD//A.inv();A.inv()*B;
invert(I1,dst,int method=DECOMP_LU);//用法同上
MatExpr abs(Mat)//求绝对值

8.比较

A cmpop B;A compop alpha;alpha cmpop A;这里cmpop表示>,>=,==,!=,<=,<等,结果是CV_8UC1的mask的0或255

9.按位运算:

A logicop B;A logicop s;s logicop A;~A;这里logicop代表&,|,^bitwise_not(I,dst,mask);//inverts所有的队列
还有bitwise_and,bitwise_or,bitwise_xor,

10.最值

min(A,B);min(A,alpha);max(A,B);max(A,alpha);都返回MatExpr,返回的dst和A的类型一样

11.行列式运算

double determinant(Mat);//行列式bool eigen(I1,dst,int lowindex=-1,int highindex=-1);//
bool eigen(I1,dst,I,int…);//得到特征值向量dst和对应特征值的特征向量
minMaxLoc(I1,&minVal,&maxVal,Point *minLoc=0,Point* MaxLoc=0,mask);
//minLoc是2D时距原点最小的点(未考证)

——————————————————————————

二.初始化

Mat I(img,Rect(10,10,100,100));//用一块地方初始化。
Mat I=img(Range:all(),Range(1,3));//所有行,1~3列
Mat I=img.clone();//完全复制
img.copyTo(I);//传递矩阵头
Mat I(2,2,CV_8UC3,Scalar(0,0,255));//I=[0,0,255,0,0,255;0,0,255,0,0,255];
Mat E=Mat::eye(4,4,CV_64F);//对角矩阵
Mat O=Mat::ones(2,2,CV_32F);//全一矩阵
Mat Z=Mat::zeros(3,3,CV_8UC1);//全零矩阵
Mat C=(Mat_(2,2)<<0,-1,2,3);//如果是简单矩阵的初始化
Mat::row(i);Mat::row(j);Mat::rowRange(start,end);Mat::colRange(start,end);都只是创建个头
Mat::diag(int d);d=0是是主对角线,d=1是比主低的对角线,d=-1….
static Mat Mat::diag(const Mat& matD)
Mat::setTo(Scalar &s);以s初始化矩阵
Mat::push_back(Mat);在原来的Mat的最后一行后再加几行
Mat::pop_back(size_t nelems=1);//移出最下面几行

——————————————————————————-

三.矩阵读取和修改

(1)1个通道:

for(int i=0;ifor(int j=0;jI.at(i,j)=k;

(2)3个通道:

Mat_ _I=I;//他没有4个通道寸,只有3个通道!
for(int i=0;i
for(int j=0;j
{
_I(i,j)[0]=b;
_I(i,j)[1]=g;
_I(i,j)[2]=r;
}
I=_I;

————————————————————

或者直接用I.at(i,j)[0]….

————————————————-

float *s;
for(i=0;i
{s=proImg.ptr(i);
for(j=0;j
{a1=s[3*j+1]-m1;
a2=s[3*j+2]-m2;}}

————————————————————————-
(3)其他机制

I.rows(0).setTo(Scalar(0));//把第一行清零
saturate_cast(…);//可以确保内容为0~255的整数
Mat::total();返回一共的元素数量
size_t Mat::elemSize();返回元素的大小:CV_16SC3–>3*sizeof(short)–>6
size_t Mat::elemSize1();返回元素一个通道的大小CV_16SC3–>sizeof(short)–>2
int Mat::type()返回他的类型CV_16SC3之类
int Mat::depth()返回深度:CV_16SC3–>CV_16S
int Mat::channels()返回通道数
size_t Mat:step1()返回一个被elemSize1()除以过的step
Size Mat::size()返回Size(cols,rows);如果大于2维,则返回(-1,-1),都是先宽再高的
bool Mat::empty()如果没有元素返回1,即Mat::total()==0或者Mat::data==NULL
uchar *Mat::ptr(int i=0)指向第i行
Mat::at(int i)(int i,int j)(Point pt)(int i,int j,int k)
RNG随机类:next,float RNG::uniform(float a,float b);..
double RNG::gaussian(double sigma);
RNG::fill(I,int distType,Mat low,Mat up);//用随机数填充
randu(I,low,high);
randn(I,Mat mean,Mat stddev);
reduce(I,dst,int dim,int reduceOp,int dtype=-1);//可以统计每行或每列的最大、最小、平均值、和
setIdentity(dst,Scalar &value=Scalar(1));//把对角线替换为value
//效果等同:Mat A=Mat::eye(4,3,CV_32F)*5;

————————————————————–

四.较复杂运算

gemm(I1,I2,alpha,I3,beta,dst,int flags=0);//I1至少是浮点型,I2同I1,flags用来转置
//gemm(I1,I2,alpha,I3,beta,dst,GEMM_1_T,GEMM_3_T);–>dst=alpha*I1.t()*I2+beta*I3.t();可用此完全代替此函数
mulTransposed(I,dst,bool aTa,Mat delta=noArray(),double scale=1,int rtype=-1);
//I是1通道的,和gemm不同,他可用于任何类型。
//如果aTa=flase时,dst=scale*(I-delta).t()*(I-delta);
//如果是true,dst=scale*(I-delta)(I-delta).t();
calcCovarMatrix(Mat,int,Mat,Mat,int,int=);calcCovarMatrix(Mat I,Mat covar,Mat mean,int flags,int=);
cartToPolar//转到极坐标
compare(I1,I2,dst,cmpop);cmpop=CMP_EQ,CMP_GT,CMP_GE,CMP_LT,CMP_LE,COM_NE
completeSymm(M,bool lowerToUpper=false);当lowerToUpper=true时Mij=Mji(ij)
变成可显示图像:convertScaleAbs(I,dst,alpha,beta);dst=saturate_cast(|alpha*I+beta|);
dct(I,dst,int flags=0);//DCT变换,1维、2维的矩阵;flags=DCT_INVERSE,DCT_ROWS
idct,dft,idft
inRange(I1,I_low,I_up,dst);//dst是CV_8UC1,在2者之间就是255
Mahalanobis(vec1,vec2,covar);
merge(vector,Mat);//把多个Mat组合成一个和split相反
double norm(…):当src2木有时,norm可以计算出最长向量、向量距离和、向量距离和的算术平方根
solveCubic解3次方程,solvePoly解n次方程
排列:sort,sortIdx
mixChannels();对某个通道进行各种传递

—————————————————————–
未懂的函数

getConvertElem,extractImageCOI,LUT
magnitude(x,y,dst);//I1,I2都是1维向量,dst=sqrt(x(I)^2+y(I)^2);
meanStdDev,
MulSpectrums(I1,I2,dst,flags);傅里叶
normalize(I,dst,alpha,beta,int normType=NORM_L2,int rtype=-1,mask);//归一化
PCA,SVD,solve,transform,transpose

五、其他数据结构

Point2f P(5,1);
Point3f P3f(2,6,7);
vector v;v.push_back((float)CV_PI);v.push_back(2);v.push_back(3.01f);//不断入
vector vPoints(20);//一次定义20个

常用方法:

Mat mask=src<0;这样很快建立一个mask了

opencv中Mat的数学运算和基本操作相关推荐

  1. Opencv中Mat的data数据只定义为uchar*类型,

    opencv中Mat的数据定义为指向uchar 的指针,而构造函数又提供了许多其他类型. 其实数据在内存中是一维存储的,而图像基本结构是二维的,3D图像还会是三维的:同时,彩色图像还有多个channe ...

  2. OpenCV中Mat的属性

    OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是 ...

  3. C++下的OpenCV中Mat类型存储的图像格式

    在调用CV进行图像处理时,经常涉及图像格式转换,经常出现原始图像输入后CV_32F与ushort之间的数据差异导致程序报错,可使用std::cout << "dilated_ty ...

  4. opencv中Mat究竟是什么?

    opencv中Mat究竟是什么?(试着运行一下两个代码) 首先看opencv是怎么显示一张图的 : //#include "stdafx.h"#include <opencv ...

  5. Opencv中Mat类详细解读(学习笔记)

    基于windows10.vs2015.OpenCv4.1.0. 目录 1.Mat类简介 2.Mat类的构造与赋值 2.1.Mat类的构造 2.2.Mat类的赋值 3.Mat类支持的运算 3.1Mat类 ...

  6. opencv中mat详细解析

    ##1.起源 OpenCV作为强大的计算机视觉开源库,很大程度上参考了MatLab的实现细节和风格,比如说,在OpenCV2.x 版本以后,越来越多的函数实现了MatLab具有的功能,甚至干脆连函数名 ...

  7. OpenCV中Mat总结

    一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...

  8. opencv获取mat的指针_数字图像处理之opencv中Mat数据操作

    数字图像处理其实就是处理二维矩阵数据.利用opencv来学习处理算法是一种比较好的方式.学习opencv,主要就是调用其中的图像处理函数来实现各种操作.如果要得到想要的处理结果,还需要对图像处理算法有 ...

  9. opencv java水平投影_使用OpenCv中Mat进行水平投影与垂直投影并实现字符切分

    由于要做图像的处理,所以最近在学习Opencv的相关知识,学习了Opencv中的Mat对象,查阅了网上的资料,了解了相关知识.现在实现了一个使用Mat对象来进行图像的水平投影与垂直投影,并在此基础之上 ...

  10. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

最新文章

  1. Paper7:R-CNN
  2. 那些总是写“烂代码”的同学,强烈推荐你用这款IDEA插件!
  3. tensorflow checkpoint文件
  4. 注解处理器开发过程相关问题
  5. 14秋 c 语言程序设计 在线作业1,14秋学期《C语言及程序设计》在线作业
  6. c语言读入文件排序,帮忙-如何对文件排序啊
  7. tar包bz2和gz的对比
  8. 为什么物联网产品迫切需要良好的 UI/UX 设计?
  9. CodeMirror自动提醒配置
  10. 【答题卡识别】基于matlab GUI hough变换答题卡成绩统计(带面板)【含Matlab源码 1828期】
  11. c语言中 临时变量的作用,C语言 临时变量不能作为函数的返回值?
  12. matlab 画图函数plot
  13. java jni so_java 用jni调用so全过程
  14. markdown java 代码高亮_Markdown 入门教程
  15. 慕课java工程师2020版_中国大学慕课2020Java程序设计答案大全
  16. PPT怎么用100张照片做照片墙?
  17. “华为”和“荣耀”的区别,双品牌满足我和爸妈的不同需求
  18. 决策树【机器学习笔记简摘】
  19. python实现水滴筹页面的数据统计
  20. 基于python分析广告投放转化情况

热门文章

  1. vins 解读_VINS 中的 IMU 预积分推导和代码解读
  2. n160ii打印机查看ip地址_芯烨ip地址设定软件下载|
  3. linux 显存占用内存,Linux服务器内存、CPU、显卡、硬盘使用情况查看
  4. java8 metaspacesize_java-8 – Java8 MetaspaceSize标志不起作用
  5. React:react-router
  6. SQL:postgresql查询某个字段最大值行的其他字段值
  7. Spring Boot实现动态数据库配置
  8. 23个命令搞定git使用的笔记
  9. Halcon和Opencv区别
  10. 论文笔记_S2D.72_RGB图像和不确定性引导的稀疏噪声激光雷达深度补全