opencv的基本数据结构(二)(转)
转自:原文链接,以下代码、图片、内容有点改动,只为转载不降低博客内容的可阅性,版权归原作者所有。
OpenCV中强大的Mat类型大家已经比较熟悉了。这里梳理一些在工程中其他经常用到的几种基本数据类型。包括:
- Vec
- Scalar
- Point
- Size
- Rect
- RotatedRect
1. Vec类
1.1 基本概念
Vec是一个模板类,主要用于存储数值向量。
1.2 用法
(1)可用它来定义任意类型的向量
Vec<double, > myVector; // 定义一个存放8个double型变量的向量
(2)使用[ ]访问Vec向量成员
myVector[]=;
(3)可使用以下预定义的类型
typedef Vec<uchar, > Vec2b;
typedef Vec<uchar, > Vec3b;
typedef Vec<uchar, > Vec4b;
typedef Vec<short, > Vec2s;
typedef Vec<short, > Vec3s;
typedef Vec<short, > Vec4s;
typedef Vec<int, > Vec2i;
typedef Vec<int, > Vec3i;
typedef Vec<int, > Vec4i;
typedef Vec<float, > Vec2f;
typedef Vec<float, > Vec3f;
typedef Vec<float, > Vec4f;
typedef Vec<float, > Vec6f;
typedef Vec<double, > Vec2d;
typedef Vec<double, > Vec3d;
typedef Vec<double, > Vec4d;
typedef Vec<double, > Vec6d;
//可以直接运用
Vec3b mychar;
mychar[2]='cat';
Vec6d mydata;
for(int i=0; i<mydata.rows;i++)
mydata[i] = 20.3+18*i;
cout<<"mydata="<<mydata<<endl;
(4)Vec支持的运算如下:
v1 = v2 + v3
v1 = v2 - v3
v1 = v2 * scale
v1 = scale * v2
v1 = -v2
v1 += v2
v1 == v2, v1 != v2
norm(v1) (euclidean norm)//欧几里得范数
//求mydata的欧几里得范数
norm(mydata);
1.3 示例代码
(1)向量定义与元素的访问
// Vec
cv::Vec<double, > myVector;
for(int i=; i<myVector.rows;i++)
myVector[i] = i;
cout<<"myVector= "<<myVector<<endl;
cout<<"myVector[0]= "<<myVector[]<<endl;
cout<<"myVector[3]= "<<myVector[]<<endl;
(2)基本运算
cv::Vec<int, > v1,v2,v3;
for(int i=; i<v2.rows;i++){ //v2.rows返回向量v2的行数
v2[i] = i;
v3[i] = i+;
} v1 = v2 + v3;
cout<<"v2 = "<<v2<<endl;
cout<<"v3 = "<<v3<<endl;
cout<<"v1=v2+v3= "<<v1<<endl;
cout<<"v1=v2*2 = "<<v2*<<endl;
cout<<"v1=-v2 = "<<-v2<<endl;
cout<<"v1==v2 = "<<(v1==v2)<<endl;
cout<<"v1!=v2 = "<<(v1!=v2)<<endl;
cout<<"norm(v2)= "<<norm(v2)<<endl;

2. Scalar类
2.1 基本概念
Scalar是一个从Vec类引出的模板类,是一个可存放4个元素的向量,广泛用于传递和读取图像中的像素值。
2.2 用法
可使用[]访问Scalar值。或使用如下方式定义BGR三个通道的值。
cv:: Scalar( B, G, R )
2.3 示例代码
(1)cv::Scalar结构
cv::Scalar myScalar;
myScalar = cv::Scalar(,,);
cout<<"myScalar = "<<myScalar<<endl;
system("pause");
(2)读取彩色图像像素值
彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。
OpenCV存储通道次序为:蓝色、绿色、红色即BGR。
因此,访问彩色像素中元素的方法如下:
cv::Mat pImg = cv::imread("1.jpg",);
if(!pImg.data)
return ;
int x = , y = ;
cv::Scalar pixel=pImg.at<Vec3b>(x,y);
cout<<"B chanel of pixel is = "<<pixel.val[]<<endl;
cout<<"G chanel of pixel is = "<<pixel.val[]<<endl;
cout<<"R chanel of pixel is = "<<pixel.val[]<<endl;
system("pause");
3. Point类
3.1 基本概念
常用于表示2维坐标(x,y)。
3.2 用法
(1)图像坐标
对图像而言,我们可以这样定义:
cv::Point pt;
pt.x = ;
pt.y = ;
或者:
Point pt = Point(,);
Point pt(10,8);
(2)或使用如下预定义:
typedef Point_<int> Point2i;
typedef Point2i Point; //上面使用Point
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
可见Point_<int>、Point2i、Point互相等价,Point_<float>和Point2f互相等价,Point_<double>和Point2d互相等价。
(3)基本运算
pt1 = pt2 + pt3;
pt1 = pt2 - pt3;
pt1 = pt2 * a;
pt1 = a * pt2;
pt1 += pt2;
pt1 -= pt2;
pt1 *= a;
double value = norm(pt); // L2 norm
pt1 == pt2;
pt1 != pt2;
3.3 示例代码
(1)设置坐标点
// Point
Point pt;
pt.x = ;
pt.y = ;
//或者
//Point pt (300,498);
Scalar pix = pImg.at<Vec3b>(pt);
cout<<"pix("<<pt.x<<","<<pt.y<<") = "<<pix<<endl;

(2)各类运算
cv::Point pt1(,);
cv::Point pt2(,);
cout<<"pt1 = "<<pt1<<endl;
cout<<"pt2 = "<<pt2<<endl;
cout<<"pt1+pt2 = "<<pt1+pt2<<endl;
cout<<"pt1+=pt2= "<<(pt1+=pt2)<<endl;
cout<<"pt1-pt2 = "<<pt1-pt2<<endl;
cout<<"pt2*2 = "<<pt2*<<endl;

4. Size类
4.1 基本概念
模板类Size可表示一幅图像或一个矩形的大小。它包含宽、高2个成员:width , height还有一个有用的面积函数area()。
4.2 用法
cv::Size size(int w, int h);
//或者
cv::Size size;
size.width = w;
size.height = h;
4.3 示例代码
// Size
cv::Size size1(,);
cv::Size size2;
size2.width = ;
size2.height = ;
cv::Mat mat1(size1,CV_8UC1,cv::Scalar());
cv::Mat mat2(size2,CV_8UC3,cv::Scalar(,,));
cout<<"mat1 = "<<endl<<mat1<<endl;
cout<<endl<<"mat2 = "<<endl<<mat2<<endl;
system("pause");

5. Rect类
5.1 基本概念
Rect是另一个用于定义2维矩形的模板类。它由两个参数定义:
- 矩形左上角坐标: (x,y)
- 矩形的宽和高: width, height
Rect可以用来定义图像的ROI区域。
5.2 用法
cv::Rect rect(x, y, width, height);
5.3 示例代码
// Rect
cv::Mat pImg = imread("Lena.jpg",);
cv::Rect rect(,,,);//(x,y)=(180,200),w=200,height=200
cv::Mat roi = cv::Mat(pImg, rect);
cv::Mat pImgRect = pImg.clone();
cv::rectangle(pImgRect,rect,cv::Scalar(,,),);
cv::imshow("original image with rectangle",pImgRect);
cv::imshow("roi",roi);
cv::waitKey();


6. RotatedRect类
6.1 基本概念
最后一个基本数据类是一种特殊的矩形称为RotatedRect。这个类通过中心点,宽度和高度和旋转角度来表示一个旋转的矩形。
6.2 用法
旋转矩形类的构造函数:
RotatedRect(const Point2f& center, const Size2f& size, float angle);
参数:
- center:中心点坐标Point2f类型
- size:矩形的宽度和高度,Size2f类型
- angle:顺时针方向的旋转角度(单位°),float类型

6.3 示例代码
cv::Point2f center(100, 100);
cv::Size2f size(100, 50);
float bn = 10;
float angle[3];
for (int i = 0; i < 3; i++)
angle[i] = bn+i*20;//angle=10,30,50
for (int i = 0; i < 3; i++)
{
RotatedRect rRect(center, size, angle[i]);
cv::Mat image(200, 200, CV_8UC3, cv::Scalar(0));
Point2f vertices[4];
rRect.points(vertices);
for (int i = 0; i < 4; i++)
line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0));
Rect brect = rRect.boundingRect();
rectangle(image, brect, Scalar(255, 0, 0));
ostringstream oss;
oss << "rectangles" << i << endl;
imshow(oss.str(), image);
} waitKey(0); //system("pause")亦可

opencv的基本数据结构(二)(转)的更多相关文章
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- opencv学习笔记(二)寻找轮廓
opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...
- OpenCV中Mat与二维数组之间的转换
---恢复内容开始--- 在OpenCV中将Mat(二维)与二维数组相对应,即将Mat中的每个像素值赋给一个二维数组. 全部代码如下: #include <iostream> #inclu ...
- 基于Opencv识别,矫正二维码(C++)
参考链接 [ 基于opencv 识别.定位二维码 (c++版) ](https://www.cnblogs.com/yuanchenhui/p/opencv_qr.html) OpenCV4.0.0二 ...
- opencv基本的数据结构(转)
DataType : 将C++数据类型转换为对应的opencv数据类型 enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8组件结构全解析
转自: http://blog.csdn.net/poem_qianmo/article/details/19925819 本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:ht ...
- OpenCV(2)-Mat数据结构及访问Mat中像素
Mat数据结构 一开始OpenCV是基于C语言的,在比较早的教材例如<学习OpenCV>中,讲解的存储图像的数据结构还是IplImage,这样需要手动管理内存.现在存储图像的基本数据结构是 ...
- OpenCV使用FindContours进行二维码定位
我使用过FindContours,而且知道有能够直接寻找联通区域的函数.但是我使用的大多只是"最大轮廓"或者"轮廓数目"这些数据.其实轮廓还有另一个很重要的性质 ...
随机推荐
- SQL Server 中几个有用的特殊函数
在SQL Server 的使用过程中,发现几个很有用,但不太常用(或细节不太清楚)的函数(存储过程): isnumeric,isdate,patindex,newid,collate,sp_execu ...
- RFC 8446
https://tools.ietf.org/html/rfc8446#section-2.3 简要内容.. [Docs] [txt|pdf] [draft-ietf-tls-...] [Tracke ...
- NULL,"",String.Empty三者在C#中的区别
(1)NULLnull 关键字是表示不引用任何对象的空引用的文字值.null 是引用类型变量的默认值.那么也只有引用型的变量可以为NULL,如果int i=null,的话,是不可以的,因为Int是值类 ...
- spring远程服务知识梳理
序:本文主要是总结和归纳spring的远程服务相关知识,可作为入门学习笔记.写博客目的也是为了进行知识梳理,便于以后查看.本文主要参考资料 spring 实战第三版 本文主要讨论内容如下: 远程调度概 ...
- maven下载、安装、卸载以及MyEclipse配置maven
maven下载 官网下载:http://maven.apache.org/download.cgi 点击链接为官网下载页面,翻到下图所示位置,点击红框选项即可下载 maven安装 1.解压 ...
- 给表格控件DBGrid加上记录序号的列
DBGrid使用起来还是很方便的,但就是没有显示记录序号的功能,必须自己加,参照老外给的解决方案如下: 方案1: 1- 在DBGrid建一个第一列 (列的名字起“NO”) 2- 在DBGrid事件 D ...
- MySQL 双主问题集
最近试用MySQL高可用方案,需要配MySQL双主,对期间遇到的问题做下记录. 1.导出锁表问题 mysqldump 命令增加参数 --skip-opt -q 可避免导出时锁表: 2.导出\导入所有数 ...
- [BZOJ4556][Tjoi2016&Heoi2016]字符串 后缀数组+主席树
4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec Memory Limit: 128 MB Description 佳媛姐姐过生日的时候,她的小 ...
- MT【151】传球问题
(清华2017.4.29标准学术能力测试10) 甲.乙.丙.丁四人做相互传球的游戏,第一次甲传给其他三人中的一人,第二次由拿到球的人再传给其他三人中的一人,这样的传球共进行了$4$次,则第四次球传回甲 ...
- IoT与区块链的机遇与挑战
区块链, 分布式账本技术的一种形式, 自从2014年或多或少地获得了大量的关注: 区块链和物联网, 区块链和安全, 区块链和金融, 区块链和物流, 凡是你能想到的,仿佛都可以应用区块链. 在本文中, ...

