1. 訪問畫素值
在opencv中能夠直接對cv::mat型別的影象呼叫at函式讀取或賦值某個畫素,我們用個簡單的案例來說明:
//在一張影象上增加椒鹽雜訊,image為輸入影象。n為噪點個數
void salt(mat &image, int n)
//彩色影象有三個通道,畫素訪問型別為cv::vec3b,即由三個uchar組成的向量。這裡用下標[i]訪問每乙個通道
else}}
效果例如以下:
能夠看到有非常多白色的雜訊點,像雪花一樣^_^
2. 指標遍歷影象
我們用顏色縮減函式來說明用行首位址的方式遍歷整個影象的畫素。顏色縮減就是將每乙個通道的顏色數減少,假設每乙個通道的強度都是有unsigned char表示。那麼就有256*256*256個顏色數目,假設將每乙個通道的顏色數減少為原先的1/8,那個總顏色數就是32*32*32。大概就是這個意思。
//顏色縮減函式,image為輸入影象。div為縮減的倍數
void colorreduce(mat&image, int div = 64)
for(int j =0;j(j);
//遍歷每行的畫素
for(int i =0;i
當然opencv還有更為底層的指標。在cv::mat中。影象資料以unsigned char形式儲存在一塊記憶體中。
//獲得影象指標
uchar *data = image.data;
//獲得第j行,第i列個畫素值,step代表影象的行寬(包含填補畫素)
data = image.data + j*image.step + i*image.elemsize();
3. 迭代器遍歷影象事實上說到遍歷。非常多人都會想到用迭代器來實現,迭代器是一種特殊的類。專門用來遍歷集合中的各個元素,opencv相同為cv::mat提供了與stl迭代器相容的迭代器,以下我們還是用顏色縮減為例說明迭代器的使用:
//顏色縮減函式。image為輸入影象。div為縮減的倍數
void colorreduce(mat&image, int div = 64)
}
效果與用指標遍歷的一樣。
4. 以上四種訪問畫素方式效率對照
opencv中能夠用gettickcount()來測量一段**的執行時間,此函式返回從上次開機算起的時鐘週期數,gettickfrequency()能夠得到每秒內的時鐘週期數,有這兩個函式就能得到隨意一段**的執行時間了。
我們還是以顏色衰減函式為例,分別用以上四種方法遍歷實現。看看執行時間有何不同:
//at方法
void colorreduce1(mat&image, int div = 64)
}}//行首指標方法
void colorreduce2(mat&image, int div = 64)
}//測試4種畫素遍歷方式執行時間
void calruntime(int v,mat&image)
}duration = static_cast(gettickcount()) - duration;
duration /= gettickfrequency()/100; //執行時間,以ms為單位
qdebug()<
可見用at的方式讀取畫素效率最低,用迭代器速度也比較慢。效率最高的方式還是使用指標讀取。
好了,本篇就到此結束吧。過兩天繼續更^_^
參考書籍
《opencv2計算機視覺程式設計手冊》
shawn-ht
未經同意請勿用於商業用途)
node js 從零學習(4)
之前已經介紹了 http url 部分基礎內容 這次進行介紹 查詢字串的相關基礎 const querystring require querystring querystring.escape str querystring.unescape str 兩個方法 簡單講就是編碼解碼 官方解釋quer...
從零學習 CA 系列
近期由於專案需要,開始轉向 ca 證書相關的知識惡補中,都很少寫日誌了。廢話少說,進入正題,本人之前沒有接觸過加密,也就更沒有接觸過 認證相關的知識,如下內容為學習過程中個人體會。數字證書通常可分為兩大類,根據證書持有者分類和根據金鑰分類。根據證書持有者是否為 ca 進行分類 根據證書持有者是否為 ...
從零學習Swift 2
定義let 定義常量,一經賦值不允許再修改 var 定義變數,賦值之後仍然可以修改 常量 定義常量並且直接設定數值 let x 20 常量數值一經設定,不能修改,以下 會報錯 x 30 使用 型別 僅僅只定義型別,而沒有設定數值 let x1 int 常量有一次設定數值的機會,以下 沒有問題,因為 ...