我們將建立乙個簡單的函式,用它在影象中加入椒鹽雜訊
void
salt
(cv::mat image,
int n)
else
if(image.
type()
== cv_8uc3)
}}
操作畫素
if(image.
type()
== cv_8uc1)
else
if(image.
type()
== cv_8uc3)
opencv 為這樣的短向量定義了一種型別,即 cv::vec3b。這個向量包含三個無符號字元( unsigned character)型別的資料。
有一點需要特別注意,程式設計師必須保證指定的型別與矩陣內的型別是一致的。 at 方法不會進行任何型別轉換
對於三通道彩色影象也可以這樣訪問畫素:
image.at
(j, i)
= cv::
vec3b
(255
,255
,255
);
還有類似的向量型別用來表示二元素向量和四元素向量( cv::vec2b 和 cv::vec4b)。此外還有針對其他元素型別的向量。例如,表示二元素浮點數型別的向量就是把型別名稱的最後個字母換成 f,即 cv::vec2f。對於短整型,最後的字母換成 s;對於整型,最後的字母換成 i;對於雙精度浮點數向量,最後的字母換成 d。所有這些型別都用 cv::vec模板類定義,其中 t 是型別, n 是向量元素的數量。
cv::mat_模板類訪問畫素值:
// 用 mat 模板操作影象
cv::mat_ img(image);
img(50,100)= 0; // 訪問第 50 行、第 100 列處那個值
void
colorreduce
(cv::mat image,
int div=64)
// 一行結束
}}
在彩色影象中,影象資料緩衝區的前 3 位元組表示左上角畫素的三個通道的值,接下來的 3位元組表示第 1 行的第 2 個畫素,以此類推(注意 opencv 預設的通道次序為 bgr)。乙個寬 w高 h 的影象所需的記憶體塊大小為 w×h×3 uchars。不過出於效能上的考慮,我們會用幾個額外的畫素來填補行的長度。這是因為,如果行數是某個數字(例如 8)的整數倍,影象處理的性
能可能會提高,因此最好根據記憶體配置情況將資料對齊。當然,這些額外的畫素既不會顯示也不被儲存,它們的額外資料會被忽略。
opencv 把經過填充的行的長度指定為有效寬度。
如果影象沒有用額外的畫素填充,那麼有效寬度就等於實際的影象寬度。我們已經學過,用 cols和 rows 屬性可得到影象的寬度和高度。
與之類似,用 step 資料屬性可得到單位是位元組的有效寬度。即使影象的型別不是 uchar, step 仍然能提供行的位元組數。
為了簡化指標運算的計算過程, cv::mat 類提供了乙個方法,可以直接訪問影象中一行的
uchar* data= image.ptr
(j);
*data++
=*data/div*div + div2;
//解引用
構建乙個大小和型別都與輸入影象相同的矩陣(如果必要):
result.
create
(image.rows,image.cols,image.
type()
)
3. 對連續影象的高效掃瞄
//檢查影象是否能看成乙個一行矩陣
前面解釋過,為了提高效能,可以在影象的每行末尾用額外的畫素進行填充。有趣的是,在去掉填充後,影象仍可被看作乙個包含 w×h 畫素的長一維陣列。用 cv::mat 的iscontinuous方法可輕鬆判斷影象有沒有被填充。如果影象中沒有填充畫素,它就返回 true。我們還能這樣測試矩陣的連續性:
// 檢查行的長度(位元組數)與「列的個數×單個畫素」的位元組數是否相等
image.step == image.cols*image.
elemsize()
;
void
colorreduce
(cv::mat image,
int div=64)
int n= staic_cast<
int>
(log
(static_cast
<
double
>
(div))/
log(
2.0)
+0.5);
// 用來擷取畫素值的掩碼
uchar mask=
0xff
/ 如果 div=16, 那麼 mask= 0xf0
uchar div2 = div >>1;
// div2 = div/2
// 對於連續影象,這個迴圈只執行一次
for(
int j=
0; j)// 一行結束
}}
opencv 有乙個非常實用的函式可以用來測算函式或**段的執行時間,它就是 cv::gettickcount(),該函式會返回從最近一次計算機開機到當前的時鐘週期數。在**開始和結束時記錄這個時鐘週期數,就可以計算**的執行時間。若想得到以秒為單位的**執行時間,可使用另乙個方法 cv::gettickfrequency(),它返回每秒的時鐘週期數,這裡假定 cpu的頻率是固定的(對於較新的 cpu,頻率並不一定是固定的)。為了獲得某個函式(或**段)的執行時間,通常需使用這樣的程式模板:
const int64 start = cv::
gettickcount()
;colorreduce
(image)
;// 呼叫函式
// 經過的時間(單位:秒)
double duration =
(cv::
gettickcount()
-start)
/cv::
gettickfrequency()
;
2.6 2.7 2.8 組要重新看一遍 OpenCV計算機視覺程式設計攻略 全書總結
cv mat imageroi image,cv rect image.cols logo.cols,roi座標 image.rows logo.rows,logo.cols,logo.rows roi大小 logo.copyto imageroi 插入標誌 cv mat imageroi imag...
《opencv計算機視覺攻略》筆記 一
1.mat 定義的是物件的引用 2.namedwindow char mat 生成的視窗按照名稱標識 3.需要waitkey 0 不然無法顯示影象 4.cv flip image,result,1 正數水平 0垂直翻轉 負數水平和垂直 5.rgb影象是三通道 由3個unsigned char組成 灰...
OpenCV 計算機視覺庫
opencv是乙個由因特爾公司支援的開源機器視覺庫,關於它的介紹,網上隨便一搜就車載斗量。這裡我不談視覺庫的主要內容,而是將這段時間來對它的使用心得作個簡單介紹,以啟發打算用這個庫的朋友的思路,與大家一起來分享。在學校的時候,雖然是影象處理研究方向,但真正具體的應用到影象的很多東西,還是在參加工作以...