Mat 類成員詳解(真正原創,非copy

2021-07-09 08:29:43 字數 1815 閱讀 4004

為了搞定這個問題,opencv使用引用計數機制。其思路是讓每個 mat 物件有自己的資訊頭,但共享同乙個矩陣。這通過讓矩陣指標指向同一位址而實現。而拷貝建構函式則只拷貝資訊頭和矩陣指標,而不拷貝矩陣。

123

456

mata,

c;// 只建立資訊頭部分a=

imread

(argv[1

],cv_load_image_color

);// 這裡為矩陣開闢記憶體

matb(a

);// 使用拷貝建構函式c=

a;// 賦值運算子

以上**中的所有mat物件最終都指向同乙個也是唯一乙個資料矩陣。雖然它們的資訊頭不同,但通過任何乙個物件所做的改變也會影響其它物件。實際上,不同的物件只是訪問相同資料的不同途徑而已。這裡還要提及乙個比較棒的功能:你可以建立只引用部分資料的資訊頭。比如想要建立乙個感興趣區域( roi ),你只需要建立包含邊界資訊的資訊頭:

1

2

matd(

a,rect(10

,10,100

,100));

// using a rectangle

mate=a

(range:

all(),

range(1

,3));// using row and column boundaries

現在你也許會問,如果矩陣屬於多個 mat 物件,那麼當不再需要它時誰來負責清理?簡單的回答是:最後乙個使用它的物件。通過引用計數機制來實現。無論什麼時候有人拷貝了乙個 mat 物件的資訊頭,都會增加矩陣的引用次數;反之當乙個頭被釋放之後,這個計數被減一;當計數值為零,矩陣會被清理。但某些時候你仍會想拷貝矩陣本身(不只是資訊頭和矩陣指標),這時可以使用函式 clone() 或者 copyto() 。

1

23

matf=

a.clone

();matg;

a.copyto(g

);

現在改變 f 或者 g 就不會影響 mat 資訊頭所指向的矩陣。總結一下,你需要記住的是

matallocator * 

allocator

custom allocator more... //自定義分配器

int 

cols

uchar * 

data

pointer to the data more... //資料指標

const uchar * 

dataend

const uchar * 

datalimit

const uchar * 

datastart

helper fields used in locateroi and adjustroi more... //用在兩個函式中,

int 

dims

the matrix dimensionality, >= 2 more...

int 

flags

int 

rows

the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions more...

matsize

size

matstep

step

umatdata * 

uinteraction with umat

more...

非原創 C 類成員函式的過載 覆蓋和隱藏

題目 類成員函式的過載 覆蓋和隱藏區別描述正確的有?a 覆蓋是指在同乙個類中名字相同,引數不同 b 過載是指派生類函式覆蓋基類函式,函式相同,引數相同,基類函式必須有virtual關鍵字 c 派生類函式與基類函式相同,但是引數不同,會 隱藏 父類函式 d 函式名字相同,引數相同,基類無virtual...

C 類靜態成員與類靜態成員函式詳解

static關鍵字至少有下列n個作用 1 函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值 2 在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問 3 在模組內的static函式只可被這...

C 類靜態成員與類靜態成員函式詳解

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...