OpenCV的基本数据结构及示例

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)可使用以下预定义的类型

 
 
  1. typedef Vec<uchar, 2> Vec2b;
  2. typedef Vec<uchar, 3> Vec3b;
  3. typedef Vec<uchar, 4> Vec4b;
  4. typedef Vec< short, 2> Vec2s;
  5. typedef Vec< short, 3> Vec3s;
  6. typedef Vec< short, 4> Vec4s;
  7. typedef Vec< int, 2> Vec2i;
  8. typedef Vec< int, 3> Vec3i;
  9. typedef Vec< int, 4> Vec4i;
  10. typedef Vec< float, 2> Vec2f;
  11. typedef Vec< float, 3> Vec3f;
  12. typedef Vec< float, 4> Vec4f;
  13. typedef Vec< float, 6> Vec6f;
  14. typedef Vec< double, 2> Vec2d;
  15. typedef Vec< double, 3> Vec3d;
  16. typedef Vec< double, 4> Vec4d;
  17. typedef Vec< double, 6> Vec6d;


(4)Vec支持的运算如下:


 
 
  1. v1 = v2 + v3
  2. v1 = v2 - v3
  3. v1 = v2 * scale
  4. v1 = scale * v2
  5. v1 = -v2
  6. v1 += v2
  7. v1 == v2, v1 != v2
  8. norm(v1) (euclidean norm)

1.3 示例代码


(1)向量定义与元素的访问

 
 
  1. // Vec
  2. cv::Vec< double, 8> myVector;
  3. for( int i= 0; i<myVector.rows;i++)
  4. myVector[i] = i;
  5. cout<< "myVector= "<<myVector<< endl;
  6. cout<< "myVector[0]= "<<myVector[ 0]<< endl;
  7. cout<< "myVector[3]= "<<myVector[ 3]<< endl;
 运行结果: 

(2)基本运算

 
 
  1. cv::Vec< int, 6> v1,v2,v3;
  2. for( int i= 0; i<v2.rows;i++){ //v2.rows返回向量v2的行数
  3. v2[i] = i;
  4. v3[i] = i+ 1;
  5. }
  6. v1 = v2 + v3;
  7. cout<< "v2 = "<<v2<< endl;
  8. cout<< "v3 = "<<v3<< endl;
  9. cout<< "v1=v2+v3= "<<v1<< endl;
  10. cout<< "v1=v2*2 = "<<v2* 2<< endl;
  11. cout<< "v1=-v2 = "<<-v2<< endl;
  12. cout<< "v1==v2 = "<<(v1==v2)<< endl;
  13. cout<< "v1!=v2 = "<<(v1!=v2)<< endl;
  14. 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结构

 
 
  1. cv::Scalar myScalar;
  2. myScalar = cv::Scalar( 0, 255, 0);
  3. cout<< "myScalar = "<<myScalar<< endl;
  4. system( "pause");

 运行结果:


(2)读取彩色图像像素值

彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。

OpenCV存储通道次序为:蓝色、绿色、红色即BGR。
因此,访问彩色像素中元素的方法如下:


 
 
  1. cv::Mat pImg = cv::imread( "Lena.jpg", 1);
  2. if(!pImg.data)
  3. return 0;
  4. int x = 100, y = 100;
  5. cv::Scalar pixel=pImg.at<Vec3b>(x,y);
  6. cout<< "B chanel of pixel is = "<<pixel.val[ 0]<< endl;
  7. cout<< "G chanel of pixel is = "<<pixel.val[ 1]<< endl;
  8. cout<< "R chanel of pixel is = "<<pixel.val[ 2]<< endl;
  9. system( "pause");
 
 

 运行结果:

3. Point类


3.1 基本概念

常用于表示2维坐标(x,y)。

3.2 用法

(1)图像坐标

对图像而言,我们可以这样定义:


 
 
  1. cv::Point pt;
  2. pt.x = 10;
  3. pt.y = 8;
或者

cv::Point pt =  Point(10, 8);
 
 

或者

cv::Point pt(10,8);
 
 

(2)或使用如下预定义:


 
 
  1. typedef Point_< int> Point2i;
  2. typedef Point2i Point;
  3. typedef Point_< float> Point2f;
  4. typedef Point_< double> Point2d;
(3)基本运算

 
 
  1. pt1 = pt2 + pt3;
  2. pt1 = pt2 - pt3;
  3. pt1 = pt2 * a;
  4. pt1 = a * pt2;
  5. pt1 += pt2;
  6. pt1 -= pt2;
  7. pt1 *= a;
  8. double value = norm(pt); // L2 norm
  9. pt1 == pt2;
  10. pt1 != pt2;


3.3 示例代码


(1)设置坐标点

 
 
  1. // Point
  2. cv::Point pt;
  3. pt.x = 278;
  4. pt.y = 269;
  5. //或者
  6. //cv::Point pt (278,269);
  7. cv::Scalar pix = pImg.at<Vec3b>(pt);
  8. cout<< "pix("<<pt.x<< ","<<pt.y<< ") = "<<pix<< endl;

 运行结果:



(2)各类运算

 
 
  1. cv::Point pt1(10,20);
  2. cv::Point pt2(2,3);
  3. cout<< "pt1 = "<<pt1<< endl;
  4. cout<< "pt2 = "<<pt2<< endl;
  5. cout<< "pt1+pt2 = "<<pt1+pt2<< endl;
  6. cout<< "pt1+=pt2= "<<(pt1+=pt2)<< endl;
  7. cout<< "pt1-pt2 = "<<pt1-pt2<< endl;
  8. cout<< "pt2*2 = "<<pt2* 2<< endl;

 运行结果:



4. Size类


4.1 基本概念

模板类Size可表示一幅图像或一个矩形的大小。它包含宽、高2个成员:width , height还有一个有用的面积函数area()。

4.2 用法


 
 
  1. cv::Size size(int w, int h);
  2. //或者
  3. cv::Size size;
  4. size.width = w;
  5. size.height = h;

4.3 示例代码


 
 
  1. // Size
  2. cv::Size size1(6,3);
  3. cv::Size size2;
  4. size2.width = 4;
  5. size2.height = 2;
  6. cv::Mat mat1(size1,CV_8UC1,cv::Scalar(0));
  7. cv::Mat mat2(size2,CV_8UC3,cv::Scalar(1,2,3));
  8. cout<< "mat1 = "<< endl<<mat1<< endl;
  9. cout<< endl<< "mat2 = "<< endl<<mat2<< endl;
  10. 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 示例代码


 
 
  1. // Rect
  2. cv::Mat pImg = imread( "Lena.jpg", 1);
  3. cv::Rect rect(180,200,200,200); //(x,y)=(180,200),w=200,height=200
  4. cv::Mat roi = cv::Mat(pImg, rect);
  5. cv::Mat pImgRect = pImg.clone();
  6. cv::rectangle(pImgRect,rect,cv::Scalar( 0, 255, 0), 2);
  7. cv::imshow( "original image with rectangle",pImgRect);
  8. cv::imshow( "roi",roi);
  9. 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 示例代码


 
 
  1. //RotatedRect
  2. cv::Point2f center(100,100);
  3. cv::Size2f size(100,50);
  4. float angle = 45; // try 10, 30, 45
  5. RotatedRect rRect(center, size, angle);
  6. cv::Mat image(200,200,CV_8UC3,cv::Scalar(0));
  7. Point2f vertices[ 4];
  8. rRect.points(vertices);
  9. for ( int i = 0; i < 4; i++)
  10. line(image, vertices[i], vertices[(i+ 1)% 4], Scalar( 0, 255, 0));
  11. Rect brect = rRect.boundingRect();
  12. rectangle(image, brect, Scalar( 255, 0, 0));
  13. imshow( "rectangles", image);
  14. waitKey( 0);
运行结果:


angle = 10, 30, 45

转载请注明出处(本文更新链接):http://blog.csdn.net/iracer/article/details/51292349

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值