OpenCV知識點總結

2021-10-05 22:20:53 字數 3118 閱讀 8192

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...