转自:原文链接,以下代码、图片、内容有点改动,只为转载不降低博客内容的可阅性,版权归原作者所有。
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 Vec2> Vec2b; typedef Vec 3> Vec3b; typedef Vec 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;
//可以直接运用
Vec3b mychar;
mychar[2]='cat';
Vec6d mydata;
for(int i=0; imydata[i] = 20.3+18*i;
cout<<"mydata="<
(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, 8> myVector; for(int i=0; i) myVector[i] = i; cout<<"myVector= "< endl; cout<<"myVector[0]= "< 0]<<endl; cout<<"myVector[3]= "< 3]<
(2)基本运算
cv::Vec<int, 6> v1,v2,v3; for(int i=0; i//v2.rows返回向量v2的行数 v2[i] = i; v3[i] = i+1; } v1 = v2 + v3; cout<<"v2 = "< endl; cout<<"v3 = "< endl; cout<<"v1=v2+v3= "< endl; cout<<"v1=v2*2 = "< 2<<endl; cout<<"v1=-v2 = "<<-v2<<endl; cout<<"v1==v2 = "<<(v1==v2)<<endl; cout<<"v1!=v2 = "<<(v1!=v2)<<endl; cout<<"norm(v2)= "<
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 = "<endl; system("pause");
(2)读取彩色图像像素值
彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。
OpenCV存储通道次序为:蓝色、绿色、红色即BGR。
因此,访问彩色像素中元素的方法如下:
cv::Mat pImg = cv::imread("1.jpg",1); if(!pImg.data) return 0; int x = 100, y = 100; cv::Scalar pixel=pImg.at(x,y); cout<<"B chanel of pixel is = "< 0]<<endl; cout<<"G chanel of pixel is = "< 1]<<endl; cout<<"R chanel of pixel is = "< 2]<<endl; system("pause");
3. Point类
3.1 基本概念
常用于表示2维坐标(x,y)。
3.2 用法
(1)图像坐标
对图像而言,我们可以这样定义:
cv::Point pt; pt.x = 10; pt.y = 8;
或者:
Point pt = Point(10,8);
Point pt(10,8);
(2)或使用如下预定义:
typedef Point_<int> Point2i; typedef Point2i Point; //上面使用Point typedef Point_<float> Point2f; typedef Point_<double> Point2d;
可见Point_
(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 = 300; pt.y = 498; //或者 //Point pt (300,498); Scalar pix = pImg.at(pt); cout<<"pix("< ","< ") = "<
(2)各类运算
cv::Point pt1(10,20); cv::Point pt2(2,3); cout<<"pt1 = "<endl; cout<<"pt2 = "< endl; cout<<"pt1+pt2 = "< endl; cout<<"pt1+=pt2= "<<(pt1+=pt2)<<endl; cout<<"pt1-pt2 = "< endl; cout<<"pt2*2 = "< 2<
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; cout< "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 示例代码
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")亦可