OpenCV計算機視覺程式設計攻略(第二章)部分沒看完

2021-10-09 05:09:00 字數 3220 閱讀 8624

我們將建立乙個簡單的函式,用它在影象中加入椒鹽雜訊

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

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是乙個由因特爾公司支援的開源機器視覺庫,關於它的介紹,網上隨便一搜就車載斗量。這裡我不談視覺庫的主要內容,而是將這段時間來對它的使用心得作個簡單介紹,以啟發打算用這個庫的朋友的思路,與大家一起來分享。在學校的時候,雖然是影象處理研究方向,但真正具體的應用到影象的很多東西,還是在參加工作以...