1. 程式人生 > >Open CV學習記錄(二十)—Mat的運算和Rect

Open CV學習記錄(二十)—Mat的運算和Rect

一、矩陣
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

Rect

//如果建立一個Rect物件rect(100, 50, 50, 100),那麼rect會有以下幾個功能:  
rect.area();     //返回rect的面積 5000  
rect.size();     //返回rect的尺寸 [50 × 100]  
rect.tl();       //返回rect的左上頂點的座標 [100, 50]  
rect.br();       //返回rect的右下頂點的座標 [150, 150]  
rect.width();    //返回rect的寬度 50  
rect.height();   //返回rect的高度 100  
rect.contains(Point(x, y));  //返回布林變數,判斷rect是否包含Point(x, y)點  

//還可以求兩個矩形的交集和並集  
rect = rect1 & rect2;  
rect = rect1 | rect2;  

//還可以對矩形進行平移和縮放    
rect = rect + Point(-100, 100); //平移,也就是左上頂點的x座標-100,y座標+100  
rect = rect + Size(-100, 100);  //縮放,左上頂點不變,寬度-100,高度+100  

//還可以對矩形進行對比,返回布林變數  
rect1 == rect2;  
rect1 != rect2;  

//OpenCV裡貌似沒有判斷rect1是否在rect2裡面的功能,所以自己寫一個吧  
bool isInside(Rect rect1, Rect rect2)  
{  
    return (rect1 == (rect1&rect2));  
}  

//OpenCV貌似也沒有獲取矩形中心點的功能,還是自己寫一個  
Point getCenterPoint(Rect rect)  
{  
    Point cpt;  
    cpt.x = rect.x + cvRound(rect.width/2.0);  
    cpt.y = rect.y + cvRound(rect.height/2.0);  
    return cpt;  
}  

//圍繞矩形中心縮放  
Rect rectCenterScale(Rect rect, Size size)  
{  
    rect = rect + size;   
    Point pt;  
    pt.x = cvRound(size.width/2.0);  
    pt.y = cvRound(size.height/2.0);  
    return (rect-pt);  
}  

相關推薦

Open CV學習記錄Mat運算Rect

一、矩陣 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(I

Open CV學習記錄—影象處理基本知識

Mat 的初始化可以使用複製建構函式或者賦值運算子,不進行儲存畫素值的矩陣複製,只複製矩陣頭。 clone()和copyTo進行整體複製。 設定某部分割槽域,可以使用Rect或Range HSV把顏色分解成色調、飽和度和亮度,拋棄最後一個元素,使演算法對輸

Centos6.10下Open-falcon學習記錄——Mysql監控

記錄了學習過程,官方文件地址http://book.open-falcon.org/zh_0_2/usage/getting-started.html 另外還看了Open-falcon作者的寫的設計理念的文,見open-falcon編寫的整個腦洞歷程 1 Mysql監控 通過mymon(

Android學習記錄--Android apache httpclients的使用。

1.歷史原因:      Android當前不在支援APACHE的一套內容,開始推自己的網路請求庫,基本等同於okhttp。但是非常令人失望的是,這個庫目前看支援是不全的,對於網路鑑權,只支援BASE的網路鑑權,不支援DIGEST鑑權,因此APACHE的庫依然還需要使用。但

python學習筆記:異常處理

錯誤 fetchall nbsp 如果 info blog months api root 1 def calc(a,b): 2 res=a/b 3 return res 4 def main(): 5 money=input(‘輸入多少

Linux學習總結正則三劍客之sed

sedsed 流式編輯器,針對文檔的行來操作的 一 查找打印 1.打印某行格式: sed -n ‘n‘p filename 單引號內的n代表數字,表示第幾行例如:打印第二行sed -n ‘2‘p /etc/passwd也可以指定區間,比如打印前三行sed -n‘1,3‘p /etc/passwd打印所有的行s

day9-Python學習筆記數據庫備份,

python學習 swd div pan self. 數據 筆記 tmp filename 數據庫備份, import os,datetimeclass BakDb(object): def __init__(self,ip,username,passwd,port

java基礎學習總結:多執行緒上下文切換

什麼是上下文切換        即使是單核CPU也支援多執行緒執行程式碼,CPU通過給每個執行緒分配CPU時間片來實現這個機制。時間片是CPU分配給各個執行緒的時間,因為時間片非常短,所以CPU通過不停地切換執行緒執行,讓我們感覺多個執行緒時同時執行的,時

Effective_STL 學習筆記 為指標的關聯容器指定比較型別

  對於 string* 指標的 set,列印 set <string*> ssp 內容: 1  for( set<string*>::const_iterator i = ssp.begin(); i != ssp.end(); i++ ) 2     cout&

機器學習筆記:TensorFlow實戰TensorBoard視覺化

1 - 引言 前面已經介紹到TensorFlow可以實現許多非常常用的神經網路結構,有的網路結構十分複雜,裡面的引數關係更是難以管理。因此,TensorFlow提供了一個視覺化工具TensorBoard。可以有效的展示執行過程中的計算圖、各種指標隨著時間的變化趨勢以及訓練中使用到的影象等

openCV學習筆記 —— 影象濾波 —— 線性濾波方框濾波、均值濾波、高斯濾波

影象濾波簡介 方框濾波——boxFilter()  原理 方框濾波程式  #include<opencv2/opencv.hpp> #include <vector> #include <time.h> using

Android學習記錄七)--ListView重新整理記錄滑動位置的實現。

在listview中實現檔案系統時,目錄層級跳轉,採用activity跳轉的話,壓棧可能會非常的多,這種實現是不合理的。 如果不壓棧的話,如果回退到上一次目錄,就需要記錄上一次滑動的位置。本文記錄一下

opencv學習筆記——形態學濾波

開運算 處理過程:先腐蝕後膨脹。 功能:用於消除小物體,在纖細點處分離物體,並且在平滑較大物體的邊界的同時不明顯改變其面積,同時抑制比結構元小的亮細節。 使用例項: #include<opencv2/opencv.hpp> void main

php學習筆記mysqli的stmt的預處理類的使用防止sql注入問題

<?php /** * 處理資料庫的擴充套件庫 * * mysqli的預處理語句 * mysqli_stmt預處理類(推薦使用的類) * 優點:(mysqli和mysqli_result類的相比

Android學習記錄)-Android WEBDAV MKCOL的使用

先上需求: 使用webdav上行檔案之前,需要建立目錄。 坑在哪裡: http 4.0以後http不再支援excutemethod的方法。不能直接呼叫mkcol方法進行目錄建立。 解決的辦法: 檢視開

Android學習記錄)-viewpager切換資料載入的簡單優化。

背景:預設的viewpager是要載入前後兩個view的資料的。 如果你有定時輪詢其它頁面的網路請求時。。。。沒必要的開銷有時候會很坑,尤其是弱網。。。 方法2種: 1.什麼修改包的預設屬性這種不適合偶們。 2.在不可見的時候,網路的定時器不要起,或者關掉就o了。 複寫:

模式識別Pattern Recognition學習筆記--BP演算法

1.引言        在無法像線性感知器一樣利用梯度下降學習引數這一問題阻礙了MLP長達25年後的一天,有人給出了一種有效的求解這些引數的方法,就是大名鼎鼎的反向傳播演算法(Back Propagation),簡稱為我們熟知的BP演算法(特別注意,BP演算法是一種演算法,

SpringBoot學習SpringBoot整合Freemarker

基本步驟 新增pom依賴 在application.yml中新增相關配置 建立freemarker模板 建立控制層 測試訪問 新增pom依賴 <!-- springboot整合f

Unity3D學習筆記Rect、Canvas、Toggle、Slider、ScrollBar

png 批量添加 事件 func 快捷鍵 resource engine 選中 創建 Rect Transform(錨點):圖片中心的四個點,界面以雪花形式顯示 當四個點在一起的時候組成錨點,當四個點分開的時候組成錨框(合則錨點,分則錨框) Anchors: ---

GTK+圖形化應用程式開發學習筆記—分欄列表構建

分欄列表構件(GtkCList)是較常用的構件,它是多列列表構件,可以非常方便的處理數千列的資訊。每一列都可以有一個標題,而且可以是活動的。你還可以將函式繫結到列選擇上。 一、建立分欄列表構件 建立GtkCList構件的方法和建立其他構件的方法是類似的。 1. 名