1. 程式人生 > >OpenCV矩陣運算

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|;
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)|^p
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()
exp(I,dst);//dst=exp(I);計算每個陣列元素的指數
log(I,dst);//如果Iij!=0;則dstij=log(|Iij|)
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)//求絕對值
A cmpop B;A compop alpha;alpha cmpop A;這裡cmpop表示>,>=,==,!=,<=,<等,結果是CV_8UC1的mask的0或255
按位運算:A logicop B;A logicop s;s logicop A;~A;這裡logicop代表&,|,^
bitwise_not(I,dst,mask);//inverts所有的佇列
還有bitwise_and,bitwise_or,bitwise_xor,
min(A,B);min(A,alpha);max(A,B);max(A,alpha);都返回MatExpr,返回的dst和A的型別一樣
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時距原點最小的點(未考證)
------------------------------------------------------------------------------
8.初始化
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);//移出最下面幾行
-------------------------------------------------------------------------------
9.矩陣讀取和修改
(1)1個通道:
for(int i=0;i
for(int j=0;j
I.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;
--------------------------------------------------------------
10.較複雜運算
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();對某個通道進行各種傳遞
-----------------------------------------------------------------
11.未懂的函式
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了


四、以後可能用到的函式
randShuffle,repeat

相關推薦

DCT變換及量化的c++實現(基於opencv矩陣運算

由於DCT的數學原理不好描述,直接放程式碼了: #include<iostream> #include<fstream> #include<opencv2/core/core.hpp> #include<opencv2/highg

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.減法

opencv矩陣運算(3)

簡介   本篇承接上一篇,繼續opencv下矩陣計算的函式使用。 矩陣複製 具體程式碼 printf("mat1:\n"); showMatdate(mat1);   mat3 = Mat(3, 3, CV_64FC1); src

稀疏矩陣opencv中的應用(大矩陣運算速度過慢的問題,藉助SparseMat?)

大矩陣相乘的問題 很多演算法在執行的過程中產生的大矩陣往往包含很多0元素,我們下面的內容也是主要針對這類矩陣展開的。所以這個問題換一個說法就是 稀疏矩陣在opencv中的應用 可以看出,opencv確實支援稀疏矩陣,也就是SparseMat,

opencv矩陣運算

我是轉載的,自己修改了一些,出處不記得了,抱歉,只是用來和大家分享的。 一、矩陣 MatI,img,I1,I2,dst,A,B; double k,alpha; Scalar s;1.加法I=I1+I2;//等同add(I1,I2,I); add(I1,I2,dst,mas

opencv矩陣運算

OpenCV 2.4 Cheat Sheet (C++)系列——Simple Matrix Operations 1。矩陣的點運算 對應:加,減,點乘,點除,點絕對差,點位運算—與,點位運算—或,點位運算—異或,點最大,點最小,點比較。 Example. Alpha compositing functio

OpenCV操作基本矩陣運算

最近兩週做的專案是要將matlab裡面的演算法轉變為C語言,matlab處理矩陣運算實在太牛B了,幾個簡單的字元就代表了很多的操作,為了專案的需要,又不能影響軟體執行速度,因此我在工程中使用了OpenCV的庫進行矩陣操作。好在有這個使用比較方便的開源庫啊! 在matlab中,

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;

一起學python-opencv四(字串操作和陣列運算矩陣運算

沒錯,這個應該是暫時的numpy的第一階段學習的最後一講。在下一講將要先回歸到opencv,因為暫時這些numpy的知識肯定是夠好幾講用的,numpy這個東西確實有點枯燥,所以先回歸到opencv應用一下,理論到實踐的過程是需要的。我們還是耐心地 字串函式

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);//

HDOJ 題目5097 Page Rank(矩陣運算,模擬)

java several similar padding ora ont ria render car Page Rank Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 100000/10000

HDU多校賽第9場 HDU 4965Fast Matrix Calculation【矩陣運算+數學小知識】

stdin amp line you stream [] nbsp content ans 難度上。,,確實。。。不算難 問題是有個矩陣運算的優化 題目是說給個N*K的矩陣A給個K*N的矩陣B(1<=N<=1000 && 1=<K<

Python學習筆記5 【轉載】基本矩陣運算_20170618

ros class 簡單 lba spa 使用 常見 port 模塊 需要 numpy 庫支持 保存鏈接 http://www.cnblogs.com/chamie/p/4870078.html 1.numpy的導入和使用 from numpy import *;

python中的矩陣運算

創建 二維 style ron -h courier strong random 轉置 1.numpy的導入和使用 from numpy import *;#導入numpy的庫函數import numpy as np; #這個方式使用numpy的函數時,需要以np.開頭。

numpy數組、向量、矩陣運算

bool zip github 詳細 spa one num 切片 rod 可以來我的Github看原文,歡迎交流。 https://github.com/AsuraDong/Blog/blob/master/Articles/%E6%9C%BA%E5%99%A8%E5%A

Eigen中的noalias(): 解決矩陣運算的混淆問題

需要 右值 什麽 原因 lan sin 一個 eba ner 作者:@houkai本文為作者原創,轉載請註明出處:http://www.cnblogs.com/houkai/p/6349990.html 目錄 混淆例子解決混淆問題混淆和component級的操作。混淆

MATLAB矩陣運算 MATLAB對數組運算在符號上做了不同的約定,運算 符形式為:.* , ./ , . , .^

行數 內部 .cn 直接 mage 嚴格 fff col ges 矩陣的創建: 直接輸入法:行與行之間必須用分號“ ;”,每行中的元素用逗號“ ,”或空格分隔 x=linspace(a,b,n) 生成有 n 個元素的行向量 x,其元素值在 a、 b 之間線性分布 利用內部

算法導論筆記 第二十八章 矩陣運算

style color 矩陣 導論 span -c pan ria round 28.1 求解線性方程組 定義: 奇異矩陣:秩不是滿秩的矩陣 算法導論筆記 第二十八章 矩陣運算

矩陣矩陣運算

http post 右下角 次方 -c 交換 src 元素 行數 矩陣:一個m×n的矩陣就是m×n個數排成m行n列的一個數陣。由於它把許多數據緊湊的集中到了一起,所以有時候可以簡便地表示一些復雜的模型。在數學中,一個矩陣說穿了就是一個二維數組。單位矩陣:從左上角到右下角的對

卷積轉換為矩陣運算中填充數的計算-GEMM

tom ont mar 只需要 矩陣 卷積 logs pla 操作 要將卷積操作轉換為矩陣乘積的第一步是要做img2col操作,如下圖,想詳細了解看這裏:https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-o