opencv中Mat的傳值 傳引用 拷貝

2021-08-20 08:50:53 字數 2151 閱讀 6925

c++中,函式引數的傳值、傳引用、傳指標是有區別的。 通常情況下:傳值是對原物件的拷貝,在函式內對其進行的操作不會影響到原物件。 而傳指標,是將指向原物件記憶體區域的乙個指標作為函式引數,在函式內,訪問和操作該指標指向的記憶體,會直接影響到原物件。引用的定義是原物件的乙個繫結,可以理解為兩個物件是一致的,修改其中乙個,另乙個也會改變。

但是opencv中的mat物件卻並非這樣。

可以發現mat物件傳值呼叫,函式內對其的操作將會影響原物件!

2.傳引用

分別為呼叫函式前後的。

引用是對原物件的繫結,對引用進行操作,會改變原物件!

3.過載符=

使用opencv中的過載符=,如mat img=src;

如上,使用=複製的,對其進行操作,會改變原圖;

4.拷貝建構函式

mat img(src);

同=,對其進行操作,會改變原圖;

src_3為原圖,mydrawcircle4是在copyto複製的圖上畫的圓,cur src_3是在上述操作後的src_3。

可以看出,copyto函式複製的物件,對其進行操作,不會影響原物件

開啟mat.hpp,clone的定義是這樣的。顯然,clone()同copyto

使用賦值運算子和拷貝建構函式只複製資訊頭,對其進行操作會作用在原物件上

mat a=src;

mat b(src);

使用函式clone()或者copyto可複製一副影象的矩陣,對其進行操作不會影響原物件

mat c,d;

c=src.clone();

src.copyto(d);

mat物件做為函式引數,不僅是傳引用,傳指標,對於傳值呼叫,在函式內對其進行的操作會作用到原物件

#include #include void mydrawcirle(cv::mat img)   //傳值 

void mydrawcirle2(cv::mat &img) //傳引用

void mydrawcirle3(cv::mat img) //clone()

void mydrawcirle4(cv::mat img) //copyto

void mydrawcirle5(cv::mat img) //賦值運算子

void mydrawcirle6(cv::mat img) //(拷貝)建構函式

int main()

函式傳引數 python傳參是傳值還是傳引用

在此之前先來看看變數和物件的關係 python 中一切皆為物件,數字是物件,列表是物件,函式也是物件,任何東西都是物件。而變數是物件的乙個引用 又稱為名字或者標籤 物件的操作都是通過引用來完成的。例如,a 是乙個空列表物件,變數 a 是該物件的乙個引用 例1 輸出例2 輸出 id不一樣,所以說不是同...

C 中的傳值 傳引用

在c 中預設是按值傳遞,什麼是按值傳遞呢?我們都知道,在引數傳遞過程中,形參和實參占有不同位置的儲存空間,被呼叫過程在執行過程中,改變了形參的值,但不會影響呼叫過程 主調過程 的實參值。所以,當被呼叫過程執行結束返回到呼叫過程,實參還是呼叫之前的值。因此為了保護實參不受被呼叫過程的影響,應選用按值傳...

C 中的傳值 傳引用

在c 中預設是按值傳遞,什麼是按值傳遞呢?我們都知道,在引數傳遞過程中,形參和實參占有不同位置的儲存空間,被呼叫過程在執行過程中,改變了形參的值,但不會影響呼叫過程 主調過程 的實參值。所以,當被呼叫過程執行結束返回到呼叫過程,實參還是呼叫之前的值。因此為了保護實參不受被呼叫過程的影響,應選用按值傳...