Opencv vector

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

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

  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    
img.at<Vec3b>(14,25) [0]= 25;//B  
img.at< Vec3b >(14,25) [1]= 25;//G  
img.at< Vec3b >(14,25 [2]= 25;//R  

一個簡單小程序:

  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. }  
#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;
}

結果:


下面是網上的一個程序(在圖片上實現椒鹽噪聲),椒鹽噪聲是一種特殊的噪點,是隨機的將圖像的部分像素設置爲黑色或白色(其實我理解是把椒鹽噪聲點隨機設置顏色)。經修改如下:

  1. #include<opencv2/opencv.hpp>  
  2. #include<iostream>  
  3. #include<cstdlib>   
  4. #include<vector>  
  5. using namespace std;  
  6. using namespace cv;  
  7.   
  8. #define WINDOW_1 "椒鹽噪聲點1"  
  9. #define WINDOW_2 "椒鹽噪聲點2"  
  10. void salt(Mat&, int);  
  11. int main()  
  12. {  
  13.     Mat srcImage = imread("D://vvoo//lena.jpg");  
  14.     Mat grayImage;  
  15.     cvtColor(srcImage, grayImage/*, CV_8UC1*/, CV_RGB2GRAY);  
  16.     imshow("原圖", srcImage);  
  17.   
  18.     namedWindow(WINDOW_1, WINDOW_AUTOSIZE);  
  19.     Mat g_dstImage = grayImage.clone();  
  20.     Mat dstImage = srcImage.clone();  
  21.     salt(g_dstImage, 3000);  
  22.     salt(dstImage, 3000);  
  23.       
  24.     imshow(WINDOW_1, g_dstImage);  
  25.     imshow(WINDOW_2, dstImage);  
  26.     waitKey(0);  
  27.     return 0;  
  28. }  
  29. void salt(Mat&dst, int Saltnum)  
  30. {  
  31.     int x,y;  
  32.     for (int i = 0;i < Saltnum; i++)  
  33.     {  
  34.         x = rand() % dst.cols;//保證x和y都在src的行數和列數範圍內  
  35.         y = rand() %dst.rows;  
  36.         if (dst.channels() == 1)  
  37.         {  
  38.             dst.at<uchar>(y, x) = 0;  
  39.         }  
  40.         if (dst.channels() ==3)  
  41.         {  
  42.             dst.at<Vec3b>(y, x)[0] = 0;  
  43.             dst.at<Vec3b>(y, x)[1] = 0;  
  44.             dst.at<Vec3b>(y, x)[2] = 0;  
  45.         }  
  46.     }  
  47.   
  48.   
  49. }  
#include<opencv2/opencv.hpp>
#include<iostream>
#include<cstdlib> 
#include<vector>
using namespace std;
using namespace cv;

#define WINDOW_1 "椒鹽噪聲點1"
#define WINDOW_2 "椒鹽噪聲點2"
void salt(Mat&, int);
int main()
{
	Mat srcImage = imread("D://vvoo//lena.jpg");
	Mat grayImage;
	cvtColor(srcImage, grayImage/*, CV_8UC1*/, CV_RGB2GRAY);
	imshow("原圖", srcImage);

	namedWindow(WINDOW_1, WINDOW_AUTOSIZE);
	Mat g_dstImage = grayImage.clone();
	Mat dstImage = srcImage.clone();
	salt(g_dstImage, 3000);
	salt(dstImage, 3000);
	
	imshow(WINDOW_1, g_dstImage);
	imshow(WINDOW_2, dstImage);
	waitKey(0);
	return 0;
}
void salt(Mat&dst, int Saltnum)
{
	int x,y;
	for (int i = 0;i < Saltnum; i++)
	{
		x = rand() % dst.cols;//保證x和y都在src的行數和列數範圍內
		y = rand() %dst.rows;
		if (dst.channels() == 1)
		{
			dst.at<uchar>(y, x) = 0;
		}
		if (dst.channels() ==3)
		{
			dst.at<Vec3b>(y, x)[0] = 0;
			dst.at<Vec3b>(y, x)[1] = 0;
			dst.at<Vec3b>(y, x)[2] = 0;
		}
	}


}
結果:


三、references 

1.http://blog.csdn.net/liukun321/article/details/38402601

2.http://blog.csdn.net/wenhao_ir/article/details/50946638










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章