mat 是乙個類,由兩個資料部分組成:矩陣頭(包含矩陣尺寸,儲存方法,儲存位址等資訊)和乙個指向儲存所有畫素值的矩陣(根據所選儲存方法的不同矩陣可以是不同的維數)的指標。矩陣頭的尺寸是常數值,但矩陣本身的尺寸會依影象的不同而不同,通常比矩陣頭的尺寸大數個數量級。因此,當在程式中傳遞影象並建立拷貝時,大的開銷是由矩陣造成的,而不是資訊頭。所以,除非有必要,否則我們不應該拷貝大的影象,因為這會降低程式速度。
為了搞定這個問題,opencv使用引用計數機制。其思路是讓每個 mat 物件有自己的資訊頭,但共享同乙個矩陣。這通過讓矩陣指標指向同一位址而實現。而拷貝建構函式則 只拷貝資訊頭和矩陣指標 ,而不拷貝矩陣,屬於淺拷貝。但某些時候你仍會想拷貝矩陣本身(不只是資訊頭和矩陣指標)屬於深拷貝,這時可以使用函式clone() 或者 copyto()。
clone() 函式直接呼叫了方法
inline mat mat::
clone()
const
mat的釋放
mat mat1 = mat::
ones(1
,5, cv_32f)
;mat mat2 = mat1;
// 僅建立乙個mat2資訊頭, mat1,mat2 資料區的位址相同
mat mat3 = mat::
zeros(1
,4, cv_32f);
mat2.
release()
;// 因為mat2是對mat1的引用,這裡清除mat2的資訊頭和資料指標
mat1.
release()
;// mat1的資料區都會被釋放,但是mat資訊頭資料還會儲存(也就是還能繼續被賦值)
cout << mat1 << endl;
cout << mat2 << endl;
cout << mat3 << endl << endl;
mat3.
copyto
(mat1)
;// 拷貝會給mat1從新分配資料區域(指向新的資料區),其原來的資料區還會保留即mat2的資料是原來mat1的資料,
//mat1 = mat3.clone(); // mat1和mat3的資料相同(指向新的資料區),但是資料儲存空間不同,mat2儲存的是mat1最初的值
mat3.
release()
;// mat3的釋放不會影響mat1
cout << mat1 << endl;
cout << mat2 << endl;
1.mat裁剪
cv::mat tempmat = cvimage;
cv::range row;
//對應 高
row.start = ymin;
row.end = ymax;
cv::range col;
//對應 寬
col.start = xmin;
col.end = xmax;
// 構造出新的框圖
cvimage = cv::
mat(tempmat,row,col)
.clone()
;
2.mat邊界拉伸
import cv2 as cv
defmakeborder()
: src = cv.imread(
"a/pic.png"
)print
(src.shape)
top =
0# shape[0] = rows
bottom =
100 left =
0# shape[1] = cols
right =
100 value =[0
,0,0
]# 常量:黑邊就用0白邊255
bordertype = cv.border_constant
dst1 = cv.copymakeborder(src, top, bottom, left, right, bordertype,
none
, value)
cv.imshow(
"black border"
, dst1)
print
(dst1.shape)
# 拉伸邊緣
bordertype = cv.border_constant
dst2 = cv.copymakeborder(src, top, bottom, left, right, bordertype,
none
, value)
print
(dst2.shape)
cv.imshow(
"border_replicate"
, dst2)
cv.waitkey(0)
cv.destroyallwindows(
)makeborder(
)
3.mat之resize
cv::
resize
(oriimg, desimg, cv::
size
(width,height)
,0.f
,0.0f
,cv::inter_linear)
;
3.mat之顏色空間轉換
#include
#include
#include
// src_img : uchar* 源資料
// src_img : uchar* 結果資料
// cv_rgba2bgr :轉換方式
cv::
cvtcolor
(src_img, des_img, cv_rgba2bgr)
;
opencv官網沒有macos版本,參考macos下配置opencv方法步驟
待續…
OpenCV知識點記錄
關鍵字前帶cv的都是c裡的寫法,不帶cv的是c 裡的寫法,比如cvrng和rng,其本質都是一樣的。計算機產生的隨機數都是偽隨機數,是根據種子seed和特定演算法計算出來的。所以,只要種子一定,演算法一定,產生的隨機數是相同的 要想產生完全重複的隨機數,可以用系統時間做種子。opencv中用gett...
關於opencv的小知識點總結
對於opencv2.4.3 使用vs2010建立工程,然後使用vs2017開啟,開啟後並不公升級程式,這樣依然使用的是vs2010的sdk,只不過是使用vs2017這個工具開發。直接使用vs2017 並配合opencv2.4.3時 會有很多問題,最好不要這樣操作。用上面讀取時發現 mat為空,使用絕...
知識點總結
1,迴圈中的中斷 continue 跳出此次迴圈,繼續for迴圈 break 跳出當前for迴圈 return 跳出當前方法 2,字串的操作 componentseparatedbystring stringbyreplacingoccurencesofstring withstring iskin...