為了搞定這個問題,opencv使用引用計數機制。其思路是讓每個 mat 物件有自己的資訊頭,但共享同乙個矩陣。這通過讓矩陣指標指向同一位址而實現。而拷貝建構函式則只拷貝資訊頭和矩陣指標,而不拷貝矩陣。
123456
mata,c;// 只建立資訊頭部分a=
imread
(argv[1
],cv_load_image_color
);// 這裡為矩陣開闢記憶體
matb(a
);// 使用拷貝建構函式c=
a;// 賦值運算子
以上**中的所有mat物件最終都指向同乙個也是唯一乙個資料矩陣。雖然它們的資訊頭不同,但通過任何乙個物件所做的改變也會影響其它物件。實際上,不同的物件只是訪問相同資料的不同途徑而已。這裡還要提及乙個比較棒的功能:你可以建立只引用部分資料的資訊頭。比如想要建立乙個感興趣區域( roi ),你只需要建立包含邊界資訊的資訊頭:
12
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() 。
123
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時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的例項物件相關。靜態資料成員的用途之一是統計有...