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 级联、HOGSVM、YOLO/SSD 等深度学习检测接口。dnn深度学习加载并运行 TensorFlow、PyTorch、Caffe、ONNX 预训练模型实现图像分类、检测、分割。contrib扩展模块人脸检测 / 识别、跟踪、深度估计等进阶功能需单独安装注目前只接触到core模块和imgcodecs模块的使用简单学习一下这部分写的C不是Pythoncore核心模块定义了用于存储图像、点、矩形等几何信息的基础数据类型。Mat(图像容器)Point(二维坐标), Point2f(二维坐标有浮点数)Rect(矩阵区域)size高度和宽度。Mat容器Opencv的核心容器Matmat对象由两部分组成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_8UC38U为8通道C3代表BGR三通道。其他更加具体的查看下面的表格。类型说明CV_8UC18 位单通道灰度图如黑白图像CV_8UC38 位三通道彩色图BGRCV_8UC48 位四通道图像BGRA含透明度 AlphaCV_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(); // 获取面积 307200Rect定义矩形区域在Mat上面画出一个目标画出一个矩形。cv::Mat img_2(img_1(Rect(10,10,width,height));//从(10,10)点开始截图width*height的图像 cv::Mat img_2(img_1(Rect(PointSize)); //从Point点开始截图Size的内容 cv::Mat img_2(img_1(Rect(Point1Point2)); //截图点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::vectoruchar buffer; // 将图像编码为 PNG 格式的字节流存入 buffer cv::imencode(.png, img, buffer);imdecode:解绑字节// 假设 buffer 中已经有了图像的字节数据 cv::Mat decoded_img cv::imdecode(buffer, cv::IMREAD_COLOR);我目前只有接触上面这些模块后面接触到其他模块在进行更新