转载 --vector
来源:互联网 发布:mac地址不合法 编辑:程序博客网 时间:2024/06/05 02:41
一、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;
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
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;
- }
#include <opencv2/opencv.hpp>
结果:
下面是网上的一个程序(在图片上实现椒盐噪声),椒盐噪声是一种特殊的噪点,是随机的将图像的部分像素设置为黑色或白色(其实我理解是把椒盐噪声点随机设置颜色)。经修改如下:
- #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;
- }
- }
- }
#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
- 转载 --vector
- vector……转载
- 【转载】vector 用法总结
- vector的用法【转载】
- 【转载】C++学习----------vector
- 转载:Vector的使用方法
- vector 常用方法(转载)
- C++ vector 排序(转载)
- 【转载】list、vector、deque区别
- [转载]STL学习之Vector
- vector基本用法(转载)
- STL之vector的使用(转载)
- Vector、ArrayList和List的异同[转载]
- C++ vector转载加略有整理
- Vector 是线程安全的?(转载)
- 用sort对vector排序(转载)
- ArrayList Vector LinkedList 区别与用法 [转载]
- Java中vector的使用详解 (转载)
- 读取realsense彩色图像并且保存为图片
- Linux 基础入门(四)--学习笔记
- 详解Javascript中正则表达式的使用
- 解决nodejs版本低的问题
- Python3 元组
- 转载 --vector
- angular4之时间戳转日期格式
- html中div滚动条
- Hierarchy Viewer的使用
- 解决Android中活动被回收,活动中临时数据丢失问题
- 4.1 自定义控件的原理、流程与实现
- 在SQL查询语句中,使用条件where 1=2的意义
- Linux服务器上新增开放端口号
- C#开发COM组件