Opencv图形库

OpenCV库的简单使用

介绍

OpenCV就是一个专门用来处理图片、视频、做图像算法的超级工具包。不需要自己进行操作字节,进行图片内容分享的修改(最近被RIP格式给搞崩溃了!字节序,行字节对齐,MSB-first 像素位排布,没有任何官方的文档,全靠ai分析出文档。看见这个不需要自己操作byte的真爽)

核心模块

OpenCV被分成多个模块,一般也是只用到其中一些简单的模块。

core(核心模块):基础数据结构(Mat 图像矩阵、Point、Rect、Scalar)、内存管理、数学运算、数组操作,是所有模块的基础。

imgcodecs(图像编解码):图像读取(imread)、保存(imwrite),支持 JPG、PNG、BMP、TIFF 等格式。

imgproc(图像处理):颜色空间转换、滤波、阈值、边缘检测、形态学、几何变换、轮廓提取、直方图等。

highgui(图形界面):创建窗口、显示图像 / 视频、键盘 / 鼠标交互、滑动条控制。

videoio(视频读写):摄像头捕获、本地视频读取 / 写入、帧处理。

features2d(特征检测):SIFT、SURF、ORB、FAST 等特征点检测与匹配。

objdetect(目标检测):Haar 级联、HOG+SVM、YOLO/SSD 等深度学习检测接口。

dnn(深度学习):加载并运行 TensorFlow、PyTorch、Caffe、ONNX 预训练模型,实现图像分类、检测、分割。

contrib(扩展模块):人脸检测 / 识别、跟踪、深度估计等进阶功能(需单独安装)

注:目前只接触到core模块和imgcodecs模块的使用,简单学习一下这部分(写的C++不是Python)

core(核心模块)

定义了用于存储图像、点、矩形等几何信息的基础数据类型。Mat(图像容器),Point(二维坐标), Point2f(二维坐标,有浮点数),Rect(矩阵区域),size(高度和宽度)。

Mat容器

Opencv的核心容器Mat,mat对象由两部分组成:1,矩阵头(Header) 2,数据区(Data Block)。

矩阵头:储存数据图片的参数信息

数据区:储存实际像素注:为了节省空间,普通的赋值都是给的浅拷贝。有一个计数器,申请一个计算器添加1,释放一个计算器释放1,最后到0就被释放。赋值都是浅拷贝,

//创建与初始化
cv::Mat img_1(hight,width,CV_8UC3,cv::Scalar(255,255,255));//创建hight * width的RGB通道的8位图像 白色背景

//浅拷贝
cv::Mat img_2(img_1);    // 拷贝构造函数
cv::Mat img_2 = img_1;   // 赋值操作符
cv::Mat img_2 = img_1(Rect(10,10,100,100)); // ROI,从img截图
cv::Mat img_2(img_1(Rect(10,10,100,100)));  // ROI,从img截图

//深拷贝
cv::Mat img_2 = img_1.clone();   // 推荐:创建完整副本
cv::Mat img_2.copyTo(img_1);    // 将img_1复制到 img_2(img_2自动调整大小/类型)
cv::Mat img_2 = img_1(Rect(10,10,100,100)).clone();  //ROI,从img截图之后,赋值截图之后的图片
cv::Mat img_2(img_1(Rect(10,10,100,100)).clone());    ////ROI,从img截图之后,赋值截图之后的图片

这里的CV_8UC3,8U为8通道,C3代表BGR三通道。其他更加具体的,查看下面的表格。

类型说明
CV_8UC18 位单通道灰度图(如黑白图像)
CV_8UC38 位三通道彩色图(BGR)
CV_8UC48 位四通道图像(BGRA,含透明度 Alpha)
CV_32FC132 位浮点单通道(常用于深度图、概率图等)
CV_16UC116 位无符号整型单通道(如深度相机原始数据)
Scalar

基础的数据结构,容纳4个元素的向量容器。用于Mat初始化,给Mat的画布一个颜色。

Scalar(255, 0, 0):代表纯蓝色。
Scalar(0, 255, 0):代表纯绿色。
Scalar(0, 0, 255):代表纯红色。
Scalar(255, 255, 255):代表白色。
Scalar(0) 或 Scalar(0, 0, 0):代表黑色。

Scalar` 的第 4 个值 (val[3]):通常作为 Alpha 通道(透明度)或在多通道矩阵中使用。我没有用过这个东西,不知道干嘛的。

point和pointf二维数据点

我没用过,看一下网上的用法。

#include <opencv2/opencv.hpp>

// 方式一:先声明,再逐个赋值
cv::Point p1;
p1.x = 100;
p1.y = 200;

// 方式二:使用构造函数(更简洁常用)
cv::Point p2(100, 200);        // 整数坐标
cv::Point2f p3(10.5f, 20.5f);  // 浮点数坐标

// 访问坐标值
int x_val = p2.x;
int y_val = p2.y;

看了一下这个基本上是用于画线的,访问坐标像素值的地方。也可以用来计算一些识别数据的相关内容。

Size定义尺寸

Size 是 OpenCV 中用来表示二维尺寸的基础数据结构。它只包含两个核心成员变量:width(宽度)和 height(高度)。

// 定义一个宽 640、高 480 的尺寸
cv::Size size(640, 480); 
int w = size.width;   // 获取宽度 640
int h = size.height;  // 获取高度 480
int area = size.area(); // 获取面积 307200
Rect定义矩形区域

在Mat上面画出一个目标,画出一个矩形。

cv::Mat img_2(img_1(Rect(10,10,width,height));//从(10,10)点开始截图width*height的图像 
cv::Mat img_2(img_1(Rect(Point,Size));        //从Point点开始截图Size的内容
cv::Mat img_2(img_1(Rect(Point1,Point2));      //截图点Point1到点Point2之间的图像

imgcodecs(图像编解码)

负责图像读取,保存以及内存中的编码与解码。

读取图像

imread从本地读取文件

// 读取一张彩色图像
cv::Mat img = cv::imread("test.jpg", cv::IMREAD_COLOR);

后面的宏定义具体含义在下面,IMREAD_COLOR一般都是使用BGR三色。

宏定义 (C++ )含义
IMREAD_UNCHANGED按原样返回加载的图像。如果原图带有 Alpha(透明)通道,则会保留(4通道);否则会被裁剪。同时会忽略 EXIF 旋转信息。
IMREAD_GRAYSCALE强制转换为单通道灰度图。无论原图是什么格式,都会被内部转换为 8 位单通道灰度图像。
IMREAD_COLOR(默认值)强制转换为 3 通道 BGR 彩色图。如果原图是灰度图,也会被扩展为 3 通道;Alpha 通道会被剥离。
IMREAD_ANYDEPTH保留位深度。如果输入图像是 16 位或 32 位深度,则返回对应深度的图像;否则转换为 8 位。
IMREAD_ANYCOLOR以任何可能的颜色格式读取。读取出的通道数由文件实际的通道数决定(不超过 3 个)。
IMREAD_IGNORE_ORIENTATION忽略 EXIF 方向标志。不按图片 EXIF 信息中的方向自动旋转图像。

保存图像

cv::imwrite("output.jpg", img);

*** 图像解码***

我没有用过,一般使用在网络通信之中,方便进行数据传输。把图片数据进行byte化

imencode:变成字节编码

std::vector<uchar> buffer;
// 将图像编码为 PNG 格式的字节流存入 buffer
cv::imencode(".png", img, buffer);

imdecode:解绑字节

// 假设 buffer 中已经有了图像的字节数据
cv::Mat decoded_img = cv::imdecode(buffer, cv::IMREAD_COLOR);

我目前只有接触上面这些模块,后面接触到其他模块在进行更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值