OpenCV—基本数据结构与示例


OpenCV的基本数据结构及示例



OpenCV中强大的Mat类型大家已经比较熟悉了。这里梳理一些在工程中其他经常用到的几种基本数据类型。包括:

         Vec

         Scalar

         Point

         Size

         Rect

         RotatedRect


1. Vec


1.1 基本概念

         Vec是一个模板类,主要用于存储数值向量。


1.2 用法


(1)可用它来定义任意类型的向量

Vec myVector; // 定义一个存放8个double型变量的向量
 
   

(2)使用[]访问Vec向量成员         

myVector[0]=0;
 
  

 (3)可使用以下预定义的类型

typedef Vec Vec2b;
typedef Vec Vec3b;
typedef Vec Vec4b;
typedef Vec Vec2s;
typedef Vec Vec3s;
typedef Vec Vec4s;
typedef Vec Vec2i;
typedef Vec Vec3i;
typedef Vec Vec4i;
typedef Vec Vec2f;
typedef Vec Vec3f;
typedef Vec Vec4f;
typedef Vec Vec6f;
typedef Vec Vec2d;
typedef Vec Vec3d;
typedef Vec Vec4d;
typedef Vec 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  myVector;
     for(int i=0; i

OpenCV—基本数据结构与示例_第1张图片

(2)基本运算

	cv::Vec v1,v2,v3;
        	for(int i=0; i 
   OpenCV—基本数据结构与示例_第2张图片 
  

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 = "<

 运行结果:

OpenCV—基本数据结构与示例_第3张图片

(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(x,y);
	cout<<"B chanel of pixel is = "<
 
  
 
  

 运行结果:

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_ Point2i;
typedef Point2i Point;
typedef Point_ Point2f;
typedef Point_ 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(pt);
	cout<<"pix("<

 运行结果:



(2)各类运算

cv::Point pt1(10,20);
	cv::Point pt2(2,3);
	cout<<"pt1     = "<


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 = "<

 运行结果:

OpenCV—基本数据结构与示例_第4张图片


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();
运行结果:

OpenCV—基本数据结构与示例_第5张图片OpenCV—基本数据结构与示例_第6张图片


6. RotatedRect


6.1 基本概念

最后一个基本数据类是一种特殊的矩形称为RotatedRect。这个类通过中心点,宽度和高度和旋转角度来表示一个旋转的矩形。


6.2 用法

旋转矩形类的构造函数:

RotatedRect(const Point2f& center, const Size2f& size, float angle);

参数:

  • center:中心点坐标Point2f类型
  • size:矩形的宽度和高度,Size2f类型
  • angle:顺时针方向的旋转角度(单位°),float类型

OpenCV—基本数据结构与示例_第7张图片


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);
运行结果:

OpenCV—基本数据结构与示例_第8张图片

angle = 10, 30, 45

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

你可能感兴趣的:(OpenCV,C++,Image,Processing,Computer,Vision,algorithm,Bin博的机器视觉工作间)