C++下OpenCV学习笔记----常用的数据结构(1)

C++下OpenCV学习笔记

----常用的数据结构和函数(1)

一.点的表示:Point类
  1. 定义(以二维为例)
    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;
  2. 常用操作
    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;

运行结果:
在这里插入图片描述

  1. attention
    1>用点划线 Point (x,y) -(列,行)
    2>取像素点进行赋值 - (行,列)
二.颜色的表示:Scalar类
  1. 定义
    scalar表示一个具有四个元素的数组,用于传递像素值。
  2. 代码实现
#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. 运行结果

  1. attention
    1>用不到第四个参数可以不写
    2>储存RGB颜色值,则在OpenCV中顺序为BGR(如上边代码所示)
三.尺寸的表示:Size类
  1. 定义(二维)
    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;
  2. 常用操作
    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类

  1. 定义
    rect对象用来存储一个矩形框的左上角坐标(x, y)、宽度(width)和高度(height)。尺寸为:width*height.
  2. 常用操作
    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类
  1. 定义
    可以实现RGB颜色向HSV、HSI等颜色空间的转换,也可以转为灰度图像。
    void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);

第一个参数:表示输入图像
第二个参数:表示输出图像
第三个参数:表示颜色空间转化的标识符
第四个参数:表示目标图像的通道数,若为0,表示目标图像取源图像的通道数

      2. 颜色空间转化的标识符(OpenCV2版)
       OpenCV3版:将CV_改为COLOR_.
在这里插入图片描述

  1. 代码实现
#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);
}

  1. 运行结果
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X to Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值