OpenCV基礎篇之畫素訪問

2021-06-26 07:09:12 字數 2694 閱讀 1547

/*

* filename : get_pixels.cpp

* author : xiahouzuoxin @163.com

* version : v1.0

* date : sun 01 jun 2014 06:40:54 pm cst

* brief :

* */

#include

#include

using

namespace

std;

using

namespacecv;

intmain

(int

argc

,char

*argv

)mat

img;

img=

imread

(argv[1

],1);/*

* reverse pixels

*/mat

out1

=img

.clone

();// change dst will not affect img

long

n_rows

=out1

.rows

;long

n_cols

=out1

.cols

*out1

.channels

();/*

* row pointer

*/uchar*p

;for

(longi=

0;i<

n_rows;i

++)}/*

* element pointer

*/mat

out2

;out2

.create

(img

.size

(),img

.type

());

// reserve size and type but alloc new space

n_rows

=out2

.rows

;n_cols

=out2

.cols

*out2

.channels

();p

=out2

.data

;doublec=

0.5;

doubleb=

30;for(

longi=

0;i<

n_rows

*n_cols;i

++)/** display

*/namedwindow

("src_image"

,cv_window_normal

);imshow

("src_image"

,img

);namedwindow

("reverse_image"

,cv_window_normal

);imshow

("reverse_image"

,out1

);namedwindow

("mici_image"

,cv_window_normal

);imshow

("mici_image"

,out2

);waitkey(0

);return0;

}

基於元素指標的畫素訪問:根據mat的資料結構,按理我們可以通過mat.data訪問畫素資料的指標,再根據指標訪問到畫素資料,這是最直接的方法,一般資料在記憶體中都是連續儲存(一般應該使用is_continues()進行判斷,注意上面程式中沒有,因為大部分情況是連續儲存的,所以沒有考慮),這種訪問畫素方式的一般格式是:

uchar *p;  // 定義乙個畫素索引指標

p = image.data; // image為mat物件,將物件的資料指標賦值給p

for (long i=0; i < image.rows*image.cols*image.channels(); i++)

上面程式通過元素指標的方法給出了乙個冪次變換的例子:

*(p+i) = (uchar)(255 * 0.5 * ((double)(img.data[i]) / 255) + b);
冪次變換是一種很好用的影象增強的方法,我的github上還有乙個matlab寫的用冪次變換處理外出爬山風景**的例子(

基於行指標的訪問:opencv中定義了乙個ptr方法,是乙個模板:

// returns pointer to the matrix element

// idx – rows,you should use @iscontinues() before decided it

templateuchar* ptr(const vec& idx);

通過ptr(i)直接獲得mat物件的第i行的指標,跟二維陣列的行指標有些類似,繼而可以通過ptr(i)[j]得到第i行第j列的畫素值。

上面程式給出了使用行指標進行影象反轉的例子。

請注意一下其它的函式:img.clone()之前已經講過——除了拷貝mat資料結構的頭和資料指標,連資料也一塊拷貝,並將資料指標指向新拷貝的資料。

左邊是元素,中間是經過反轉之後的,右邊是使用冪次變換增強後的。

OpenCV之畫素訪問優化

優化基本原則 1.減少多層迴圈的使用 2.盡量使用位運算 基於以上原則,可將之前幾篇博文中介紹的color reduce演算法 改為 voidcolorreduce5 mat image,intn 6 for int j 0 j 執行效率測試對比 測試環境 影象 500 338pixel cpu p...

OpenCV 畫素訪問

我說說我的理解 srcimage.at j,i 表示的是 j 行 i 列 的這個畫素 srcimage.at point j,i 表示的是 座標 j,i 的畫素12 為了 的圖方便說明 j 換成 x i 換成 y 也就是說 srcimage.at x,y 表示的是 x 行 y 列 的這個畫素 src...

OpenCV 操作畫素(訪問畫素值)

為構建計算機視覺應用程式,我們需要學會訪問影象的內容,有時也要修改或者建立影象。本章將講講如何操作影象的元素 即畫素 影象本質上就是由陣列組成的矩陣。opencv使用了cv mat結構來操作影象。矩陣中的每乙個元素表示乙個畫素。對灰度影象而言,畫素是8位無符號數 資料型別為unsigned char...