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_8UC1 | 8 位单通道灰度图(如黑白图像) |
CV_8UC3 | 8 位三通道彩色图(BGR) |
CV_8UC4 | 8 位四通道图像(BGRA,含透明度 Alpha) |
CV_32FC1 | 32 位浮点单通道(常用于深度图、概率图等) |
CV_16UC1 | 16 位无符号整型单通道(如深度相机原始数据) |
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);
我目前只有接触上面这些模块,后面接触到其他模块在进行更新
556

被折叠的 条评论
为什么被折叠?



