OpenCV中强大的Mat类型大家已经比较熟悉了。这里梳理一些在工程中其他经常用到的几种基本数据类型。包括:
Vec
Scalar
Point
Size
Rect
RotatedRect
1. Vec类
1.1 基本概念
Vec是一个模板类,主要用于存储数值向量。
1.2 用法
(1)可用它来定义任意类型的向量
Vec<double, 8> myVector; // 定义一个存放8个double型变量的向量
(2)使用[]访问Vec向量成员
myVector[0]=0;
(3)可使用以下预定义的类型
-
typedef Vec<uchar,
2> Vec2b;
-
typedef Vec<uchar,
3> Vec3b;
-
typedef Vec<uchar,
4> Vec4b;
-
typedef Vec<
short,
2> Vec2s;
-
typedef Vec<
short,
3> Vec3s;
-
typedef Vec<
short,
4> Vec4s;
-
typedef Vec<
int,
2> Vec2i;
-
typedef Vec<
int,
3> Vec3i;
-
typedef Vec<
int,
4> Vec4i;
-
typedef Vec<
float,
2> Vec2f;
-
typedef Vec<
float,
3> Vec3f;
-
typedef Vec<
float,
4> Vec4f;
-
typedef Vec<
float,
6> Vec6f;
-
typedef Vec<
double,
2> Vec2d;
-
typedef Vec<
double,
3> Vec3d;
-
typedef Vec<
double,
4> Vec4d;
-
typedef Vec<
double,
6> Vec6d;
(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)
1.3 示例代码
(1)向量定义与元素的访问
-
// Vec
-
cv::Vec<
double,
8> myVector;
-
for(
int i=
0; i<myVector.rows;i++)
-
myVector[i] = i;
-
cout<<
"myVector= "<<myVector<<
endl;
-
cout<<
"myVector[0]= "<<myVector[
0]<<
endl;
-
cout<<
"myVector[3]= "<<myVector[
3]<<
endl;
运行结果:
(2)基本运算
-
cv::Vec<
int,
6> v1,v2,v3;
-
for(
int i=
0; i<v2.rows;i++){
//v2.rows返回向量v2的行数
-
v2[i] = i;
-
v3[i] = i+
1;
-
}
-
-
v1 = v2 + v3;
-
cout<<
"v2 = "<<v2<<
endl;
-
cout<<
"v3 = "<<v3<<
endl;
-
cout<<
"v1=v2+v3= "<<v1<<
endl;
-
cout<<
"v1=v2*2 = "<<v2*
2<<
endl;
-
cout<<
"v1=-v2 = "<<-v2<<
endl;
-
cout<<
"v1==v2 = "<<(v1==v2)<<
endl;
-
cout<<
"v1!=v2 = "<<(v1!=v2)<<
endl;
-
cout<<
"norm(v2)= "<<norm(v2)<<
endl;
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/8d82901ae3778afa687a055a783b7e41.jpeg)
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(
0,
255,
0);
-
cout<<
"myScalar = "<<myScalar<<
endl;
-
system(
"pause");
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/09ae1643bb23cc7e9ab0ad2de1fdac10.jpeg)
(2)读取彩色图像像素值
彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。
OpenCV存储通道次序为:蓝色、绿色、红色即BGR。
因此,访问彩色像素中元素的方法如下:
-
cv::Mat pImg = cv::imread(
"Lena.jpg",
1);
-
if(!pImg.data)
-
return
0;
-
int x =
100, y =
100;
-
cv::Scalar pixel=pImg.at<Vec3b>(x,y);
-
cout<<
"B chanel of pixel is = "<<pixel.val[
0]<<
endl;
-
cout<<
"G chanel of pixel is = "<<pixel.val[
1]<<
endl;
-
cout<<
"R chanel of pixel is = "<<pixel.val[
2]<<
endl;
-
system(
"pause");
运行结果:
3. Point类
3.1 基本概念
常用于表示2维坐标(x,y)。
3.2 用法
(1)图像坐标
对图像而言,我们可以这样定义:
-
cv::Point pt;
-
pt.x =
10;
-
pt.y =
8;
或者
cv::Point pt = Point(10, 8);
或者
cv::Point pt(10,8);
(2)或使用如下预定义:
-
typedef Point_<
int> Point2i;
-
typedef Point2i Point;
-
typedef Point_<
float> Point2f;
-
typedef 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
-
cv::Point pt;
-
pt.x =
278;
-
pt.y =
269;
-
//或者
-
//cv::Point pt (278,269);
-
cv::Scalar pix = pImg.at<Vec3b>(pt);
-
cout<<
"pix("<<pt.x<<
","<<pt.y<<
") = "<<pix<<
endl;
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/b4910f287e46a59a9128e27ca51974d0.jpeg)
(2)各类运算
-
cv::Point pt1(10,20);
-
cv::Point pt2(2,3);
-
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*
2<<
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(6,3);
-
cv::Size size2;
-
size2.width =
4;
-
size2.height =
2;
-
cv::Mat mat1(size1,CV_8UC1,cv::Scalar(0));
-
cv::Mat mat2(size2,CV_8UC3,cv::Scalar(1,2,3));
-
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",
1);
-
cv::Rect rect(180,200,200,200);
//(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(
0,
255,
0),
2);
-
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 示例代码
-
//RotatedRect
-
cv::Point2f center(100,100);
-
cv::Size2f size(100,50);
-
float angle =
45;
// try 10, 30, 45
-
-
RotatedRect rRect(center, size, angle);
-
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));
-
-
imshow(
"rectangles", image);
-
waitKey(
0);
运行结果:
angle = 10, 30, 45
转载请注明出处(本文更新链接):http://blog.csdn.net/iracer/article/details/51292349