轉自:http://blog.csdn.net/qq_29540745/article/details/52517269
一、What is vector?
vector(向量): C++中的一種數據結構,確切的說是一個類.它相當於一個動態的數組,當程序員無法知道自己需要的數組的規模多大時,用其來解決問題可以達到最大節約空間的目的.
用法:
1.文件包含:
首先在程序開頭處加上#include<vector>以包含所需要的類文件vector,還有一定要加上using namespace std;
2.聲明一個int向量以替代一維的數組:vector <int> a;(等於聲明了一個int數組a[],大小沒有指定,可以動態的向里面添加刪除。
比如Vec<uchar, 3>:
其實這句就是定義一個uchar類型的數組,長度為3而已,例如 8U 類型的 RGB 彩色圖像可以使用 <Vec3b>,3 通道 float 類型的矩陣可以使用 <Vec3f>。對於 Vec 對象,可以使用[]符號如操作數組般讀寫其元素,如:Vec3b color; //用 color 變量描述一種 RGB 顏色
color[0]=255; //0通道的B 分量
color[1]=0; //1通道的G 分量
color[2]=0; //2通道的R 分量
二、How do we use it ?
vv
先擴展一下訪問像素的 .at 的用法:
cv::mat的成員函數: .at(int y, int x)可以用來存取圖像中對應坐標為(x,y)的元素坐標。但是在使用它時要注意,在編譯期必須要已知圖像的數據類型,這是因為cv::mat可以存放任意數據類型的元素。因此at方法的實現是用模板函數來實現的。假設提前已知一幅圖像img的數據類型為 unsigned char型灰度圖(單通道),要對坐標為(14,25)的像素重新賦值為25,則對應操作如下:
- srcImage.at<uchar>(14,25) = 25;
如果要操作的圖片img是一幅數據類型同樣為unsigned char的彩色圖片,再次要求將坐標(14,25)的像素賦值為25。這個操作跟上面的就有點區別了,需要對這個像素三個通道的每個對應元素賦值,Opencv中圖像三原色在內存中的排列順序為B-G-R(見下面注釋),操作過程如下:
- img.at<Vec3b>(14,25) [0]= 25;//B
- img.at< Vec3b >(14,25) [1]= 25;//G
- img.at< Vec3b >(14,25 [2]= 25;//R
一個簡單小程序:
- #include <opencv2/opencv.hpp>
- #include <iostream>
- using namespace cv;
- using namespace std;
- int main()
- {
- Mat m(3, 3, CV_8UC3);//建立一個三行三列3通道像素
- Vec3b p;
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- p[0] = i;
- p[1] = j;
- p[2] = i+j;
- m.at<Vec3b>(i,j) = p;
- }
- }
- cout <<"數組:"<<endl<<"M= " << m << endl;
- int a = m.at<Vec3b>(2, 2)[2];
- Vec3b b = m.at<Vec3b>(2, 2)[2];
- cout << "訪問一個數:" << a <<endl<<"訪問三通道:"<<b<<endl;
- waitKey(0);
- return 0;
- }
結果: