轉自: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,則對應操作如下:

 

[cpp]  view plain  copy
 
  1. srcImage.at<uchar>(14,25) = 25;  

     如果要操作的圖片img是一幅數據類型同樣為unsigned char的彩色圖片,再次要求將坐標(14,25)的像素賦值為25。這個操作跟上面的就有點區別了,需要對這個像素三個通道的每個對應元素賦值,Opencv中圖像三原色在內存中的排列順序為B-G-R(見下面注釋),操作過程如下:

 

 

[cpp]  view plain  copy
 
  1. img.at<Vec3b>(14,25) [0]= 25;//B    
  2. img.at< Vec3b >(14,25) [1]= 25;//G    
  3. img.at< Vec3b >(14,25 [2]= 25;//R    

一個簡單小程序:

 

[cpp]  view plain  copy
 
  1. #include <opencv2/opencv.hpp>  
  2. #include <iostream>  
  3. using namespace cv;  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     Mat m(3, 3, CV_8UC3);//建立一個三行三列3通道像素  
  8.     Vec3b p;  
  9.     for (int i = 0; i < 3; i++)  
  10.     {  
  11.         for (int j = 0; j < 3; j++)  
  12.         {  
  13.             p[0] = i;  
  14.             p[1] = j;  
  15.             p[2] = i+j;  
  16.             m.at<Vec3b>(i,j) = p;  
  17.         }  
  18.     }  
  19.     cout <<"數組:"<<endl<<"M= " << m << endl;  
  20.     int a = m.at<Vec3b>(2, 2)[2];  
  21.     Vec3b b = m.at<Vec3b>(2, 2)[2];  
  22.     cout << "訪問一個數:" << a <<endl<<"訪問三通道:"<<b<<endl;  
  23.     waitKey(0);  
  24.     return 0;  
  25. }  


結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM