C++下OpenCV学习笔记
----常用的数据结构和函数(1)
一.点的表示:Point类
- 定义(以二维为例)
int类型Point_:typedef Point_<int> Point2i;
int64类型Point_:typedef Point_<int64> Point2l;
float类型Point_:typedef Point_<float> Point2f;
double类型Point_:typedef Point_<double> Point2d;
int类型Point:typedef Point2i Point;
- 常用操作
1>默认构造函数
Point2i p1;
Point3f p2;
Point2l p3;
Point3d p4;
2>带参构造函数
Point p;
p.x = 2;
p.y = 3;
Point p = Point(2, 3);
运行结果:
Point3f p(1.2, 1.3, 1.4);
运行结果:
3> 赋值构造函数
Point3f p(1.2, 1.3, 1.4);
Point3f p1(p);
运行结果:
4>转换为Vec类型
Point p(1, 2);
Vec2i v = p;
运行结果:
5>成员函数访问
int n;
Point3i p(1, 2, 3);
n = p.x + p.y + p.z;
运行结果:
6>点乘:可用来计算两个向量之间的夹角
int n;
Point3i p1(1, 2, 3);
Point3i p2(2, 3, 4);
n = p1.dot(p2);
运行结果:
7>十字相乘:仅仅适用于三维点,结果返回两个向量的垂直向量
Point3i p1(1, 2, 3);
Point3i p2(2, 3, 4);
Point3i p3 = p1.cross(p2);
运行结果:
8>判断点是否在矩阵内:仅仅适用于二维点
Rect2f r(0, 0, 1, 1); //这个构造函数是(x,y,width,height).X坐标系向右为正,Y坐标系向上为正
Point2f p(0.5, 0.5);
int value1 = p.inside(r);
cout << "value1 = " << value1 << endl;
p.x = 2;
int value2 = p.inside(r);
cout << "value2 = " << value2 << endl;
运行结果:
- attention
1>用点划线 Point (x,y) -(列,行)
2>取像素点进行赋值 - (行,列)
二.颜色的表示:Scalar类
- 定义
scalar表示一个具有四个元素的数组,用于传递像素值。 - 代码实现
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat srcImage1(200, 200, CV_8UC3, Scalar(0, 0, 255));
Mat srcImage2(200, 200, CV_8UC3, Scalar(0, 255, 0));
Mat srcImage3(200, 200, CV_8UC3, Scalar(255, 0, 0));
imshow("red", srcImage1);
imshow("green", srcImage2);
imshow("blue", srcImage3);
waitKey(0);
}
3. 运行结果

- attention
1>用不到第四个参数可以不写
2>储存RGB颜色值,则在OpenCV中顺序为BGR(如上边代码所示)
三.尺寸的表示:Size类
- 定义(二维)
int类型Size_:typedef Size_<int> Size2i;
int64类型Size_:typedef Size_<int64> Size2l;
float类型Size_:typedef Size_<float> Size2f;
double类型Point_:typedef Size_<double> Size2d;
int类型Size:typedef Size2i Size;
- 常用操作
1>默认构造函数
Size2i sz1;
Size2f sz2;
Size2l sz3;
Size2d sz4;
2>带参构造函数
Size sz;
sz.width = 3;
sz.height = 5;
Size sz(3, 5);
运行结果:
Size2f sz = Size2f(3.1, 5.1);
运行结果:
3> 赋值构造函数
Size2d sz1(1.1, 2.2);
Size2d sz2(sz1);
运行结果:
4>成员函数访问
int n;
Size2i sz(3, 5);
n = sz.height + sz.width;
运行结果:
5> 计算面积:
Size2f sz(1.1, 2.2);
float area = sz.area();
运行结果:
6> 计算斜率:
Size sz(1, 2);
double k = sz.aspectRatio();
运行结果:
返回值为double类型的width/height,OpenCV 4.0以上版本新添加。
7> 判断尺寸是否为空:
Size sz1(-1, -1);
Size sz2(0, 0);
Size sz3(1, 1);
int s1, s2, s3;
cout << "s1 = " << sz1.empty() << endl;
cout << "s2 = " << sz2.empty() << endl;
cout << "s3 = " << sz3.empty() << endl;
运行结果:
说明当width <= 0或height <= 0,结果为真(1);当width>0且height>0时结果为假(0)。
四.矩形的表示:Rect类
---->OpenCV官网Rect类
- 定义
rect对象用来存储一个矩形框的左上角坐标(x, y)、宽度(width)和高度(height)。尺寸为:width*height. - 常用操作
1>默认构造函数
Rect rec();
Rect2i rec();
Rect2f rec();
Rect2d rec();
2>带参构造函数
Rect rec(int x, int y, int width, int height);
Rect rec(0, 0, 100, 100);
Rect rec(const Point &p, const Size &sz);
Point p(0, 0);
Size sz(100, 100);
Rect rec(p, sz);
运行结果:
左上角坐标为(0, 0),尺寸为100x100的矩阵。
3> 赋值构造函数
Rect rec1(0, 0, 100, 100);
Rect rec(rec1);
运行结果:
4>成员函数访问
Rect rec(0, 0, 100, 100);
cout << "tl(左上顶点) = " << rec.tl() << endl;
cout << "br(右下顶点) = " << rec.br() << endl;
cout << "width(宽) = " << rec.width << endl;
cout << "height(高) = " << rec.height << endl;
运行结果:
关于Rect中的 参数(x, y)是左上顶点的坐标的解释:
5> 计算面积和尺寸:
Rect rec(0, 0, 100, 100);
cout << "area(面积) = " << rec.area() << endl;
cout << "size(尺寸) = " << rec.size() << endl;
运行结果:
6> 判断点是否在矩阵内:
Rect rec(0, 0, 100, 100);
int f1 = rec.contains(Point(0, 0));
int f2 = rec.contains(Point(10, 10));
int f3 = rec.contains(Point(0, -10));
cout << "f1 = " << f1 << endl;
cout << "f2 = " << f2 << endl;
cout << "f3 = " << f3 << endl;
运行结果:
7>求两个矩阵的交集和并集:
Rect rect1(0, 0, 10, 10);
Rect rect2(5, 5, 10, 10);
Rect rec1 = rect1 & rect2;
Rect rec2 = rect1 | rect2;
cout << "rec1 = " << rec1 << endl;
cout << "rec2 = " << rec2 << endl;
运行结果:
8>比较两个矩阵是否相等:
Rect rect1(0, 0, 10, 10);
Rect rect2(5, 5, 10, 10);
Rect rect3(rect1);
if (rect1 == rect2)
cout << "rect1 == rect2" << endl;
else
cout << "rect1 != rect2" << endl;
if (rect1 == rect3)
cout << "rect1 == rect3" << endl;
else
cout << "rect1 != rect3" << endl;
运行结果:
9>将矩阵进行平移和缩放:
Rect rec(0, 0, 20, 20);
Point p(-10, 10);
Size sz(10, -10);
Rect rectShift = rec + p;
Rect rectScale = rec + sz;
cout << "rectShift = " << rectShift << endl;
cout << "rectScale = " << rectScale << endl;
运行结果:
10>提取感兴趣区域ROI:
Mat img = imread("C:\\Users\\441\\Desktop\\ZL\\夏目\\1.jpg");
Mat ROI = img(Rect(300,125,200,150));
imshow("区域",ROI);
waitKey(0);
运行结果:

11>判断一个矩阵是否在另一个矩阵内:
bool isInside(Rect rect1, Rect rect2)
{
return (rect1 == (rect1 & rect2));
}
--------------------------------------------------------------------------
Rect rect1(5, 5, 5, 5);
Rect rect2(0, 0, 10, 10);
Rect rect3(10, 10, 10, 10);
if (isInside(rect1,rect2))
cout << "rect1 is in the rect2." << endl;
else
cout << "rect1 is not in the rect2." << endl;
if (isInside(rect1,rect3))
cout << "rect1 is in the rect3." << endl;
else
cout << "rect1 is not in the rect3." << endl;
运行结果:
12>矩形中心点:
Point getCenterPoint(Rect rect)
{
Point cpt;
cpt.x = rect.x + cvRound(rect.width/2.0);
cpt.y = rect.y + cvRound(rect.height/2.0);
return cpt;
}
--------------------------------------------------------------------------
Rect rec(0, 0, 100, 100);
cout << "center point = " << getCenterPoint(rec) << endl;
运行结果:
13>中心点缩放:
Rect rectCenterScale(Rect rect, Size size)
{
rect = rect + size;
Point pt;
pt.x = cvRound(size.width/2.0);
pt.y = cvRound(size.height/2.0);
return (rect-pt);
}
--------------------------------------------------------------------------
Rect rec(0, 0, 100, 100);
Size sz(50, 50); //扩大50,若为-则缩小
cout << "change rect = " << rectCenterScale(rec, sz) << endl;
运行结果:
五.颜色空间的转化:cvtColor类
- 定义
可以实现RGB颜色向HSV、HSI等颜色空间的转换,也可以转为灰度图像。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
第一个参数:表示输入图像
第二个参数:表示输出图像
第三个参数:表示颜色空间转化的标识符
第四个参数:表示目标图像的通道数,若为0,表示目标图像取源图像的通道数
2. 颜色空间转化的标识符(OpenCV2版)
OpenCV3版:将CV_改为COLOR_.
- 代码实现
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat srcImage = imread("C:\\Users\\441\\Desktop\\ZL\\夏目\\1.jpg");
Mat dstImage1, dstImage2;
cvtColor(srcImage, dstImage1, COLOR_BGR2GRAY, 0); //注意是BGR
cvtColor(srcImage, dstImage2, CV_BGR2Lab); //注意是BGR
imshow("原图",srcImage);
imshow("灰度图", dstImage1);
imshow("效果图", dstImage2);
waitKey(0);
}
- 运行结果