在 opencv 中獲取圖像的像素有三種方式:安全
先加載圖像:spa
Mat image=imread(image_path);
1、最高效的方式指針
這種方式只須要一個指針即可訪問圖像的全部像素,用法以下:code
1 int i=0,j=0; 2 //單通道; 3 uchar *p; 4 for( i = 0; i < image.rows; ++i) 5 {
//獲取該行的首指針; 6 p = image.ptr<uchar>(i); 7 for ( j = 0; j < image.cols; ++j) 8 { 9 p[j]=..........//訪問圖像像素; 10 } 11 } 12 //3通道; 13 Vec3b *p; 14 for( i = 0; i < image.rows; ++i) 15 { 16 p = image.ptr<Vec3b>(i); 17 for ( j = 0; j < image.cols; ++j) 18 { 19 p[j][0]=..........//訪問圖像像素 G份量; 20 p[j][1]=..........//訪問圖像像素 B份量; 21 p[j][2]=..........//訪問圖像像素 R份量; 22 } 23 }
這是掃描像素速度最快的方法。對象
這個方法還有另外一個版本,Mat 對象有一個成員變量 data ,data 是一個指針,它指向圖像數據第一行第一列,咱們能夠用它來訪問全部的圖像數據。blog
若是 data 的值爲 null ,則代表圖像加載失敗,所以,能夠用該變量來檢測圖像是否加載成功。索引
uchar* p = image.data; for( unsigned int i =0; i < image.cols*image.rows; ++i) *p++ =........;
2、最安全的方法it
上一種方法須要本身控制索引的範圍,這種方法則不須要。opencv
const int channels = image.channels(); switch(channels) { case 1: { MatIterator_<uchar> it, end; for( it = image.begin<uchar>(), end = image.end<uchar>(); it !=end; ++it) *it =....; break;
} case 3: { MatIterator_<Vec3b> it, end; for( it = image.begin<Vec3b>(), end = image.end<Vec3b>(); it != end; ++it) { (*it)[0] = .....; (*it)[1] = .....; (*it)[2] = .....; } } }
3、直接索引(最慢)class
const int channels = image.channels(); switch(channels) { case 1: { for( int i = 0; i < image.rows; ++i) for( int j = 0; j < image.cols; ++j ) image.at<uchar>(i,j) = ......; break; } case 3: {
for( int i = 0; i < image.rows; ++i) for( int j = 0; j < image.cols; ++j ) { image.at<Vec3b>(i,j)[0] = ......; image.at<Vec3b>(i,j)[1] = ......; image.at<Vec3b>(i,j)[2] = ......; }
break; } }