OpenCV 是一个流行的计算机视觉库,用于处理图像和视频数据,它包含了许多模块,以支持不同的计算机视觉任务。
主要分为以下模块:
1.Core 模块
这是 OpenCV 的核心模块,提供了基本的数据结构和功能,如图像加载、保存、绘图、数据类型转换等。
(1)基本的数据结构
Core 模块包括了许多基本数据结构,如 cv::Mat
用于存储图像和矩阵数据,以及 cv::Point
、cv::Rect
、cv::Size
等用于表示点、矩形和大小的结构。
常用的数据结构:
Mat类:
1.使用构造函数创建 Mat 对象:
cv::Mat image; // 创建一个空的 Mat 对象
2.从图像文件加载:
cv::Mat image = cv::imread("image.jpg");
3.指定大小和数据类型创建 Mat 对象:
int rows = 480; // 图像高度
int cols = 640; // 图像宽度
int type = CV_8UC3; // 8位无符号整数,3通道 (彩色图像)
cv::Mat image(rows, cols, type);
4.从已有的数据创建 Mat 对象:
int rows = 480;
int cols = 640;
int type = CV_8UC1; // 8位单通道图像
unsigned char* data = new unsigned char[rows * cols]; // 示例图像数据
cv::Mat image(rows, cols, type, data);
5.从其他 Mat 对象复制数据:
cv::Mat source = cv::imread("source.jpg");
cv::Mat copy = source.clone();
Mat的方法有create(m,n,type),row(i),col(i),rowRange(i,j),colRange(i,j),diag(),clone(),copyTo(),reshape(), t(),inv(),size()等,具体意思就不细讲了,与matlab,python差不多,用的时候再看参数。
Point:代表二维点
Point pt;
pt.x = 10;
pt.y = 8;
//或
Point pt = Point(10,8)
Scalar:代表4元素向量,一般用于表示RGB颜色值,其中opencv读图进入到内存的格式时BGR,所以Scalar(B,G,R),第4个参数用不到可以省略。
(2)图像加载和保存
Core 模块可以加载和保存各种图像格式以及显示图像,包括常见的图像文件格式(如 JPEG、PNG、BMP)。
imread(),namedWindow(),imshow(),imwrite(),waitKey(),getchar(),通常是配套使用的。
(3)数据类型转换
Core 模块提供了函数来进行不同数据类型之间的转换,例如从整数到浮点数,或者从一个颜色空间到另一个颜色空间的转换。
void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0)
src
:输入图像(cv::Mat
类型或其他适当的数据结构)。dst
:输出图像(cv::Mat
类型)。code
:颜色空间转换代码,表示从源颜色空间到目标颜色空间的转换。例如,cv::COLOR_BGR2GRAY
表示从 BGR 到灰度图,cv::COLOR_BGR2HSV
表示从 BGR 到 HSV。OpenCV 提供了许多这样的转换代码,以支持不同颜色空间之间的转换。dstCn
:目标图像的通道数。通常将其保留为默认值0。
(4)数学运算
使用 Core 模块进行各种数学运算,如矩阵乘法、矩阵加法、矩阵求逆等。
(5)随机数生成
Core 模块提供了随机数生成器,用于生成随机数或随机序列,这在许多图像处理和计算机视觉算法中很有用。
RNG产生随机数
(6)图像基本操作
包括图像的剪裁、缩放、旋转、平移、仿射变换等。
rect(x,y,width,height),resize(src,dst,size,fx,fy,interpolation),add(src,src2,dst,mask,dtype)
(7)通道的分离和合并
可以使用 Core 模块将多通道图像的通道分离成单独的通道,也可以将单通道图像的通道合并成多通道图像
(8)直方图操作
可以计算图像的直方图,用于图像处理任务,如直方图均衡化。
(9)线性代数操作
Core 模块包括线性代数函数,用于解线性方程组、矩阵分解等。
(10)图像和矩阵元素访问
Core 模块提供了一种灵活的方式来访问图像和矩阵中的像素值。
Mat img = imread(".....");
img.at<type>(x,y)[channel]
type是像素数据类型,x,y是像素坐标,channel是通道序号,灰度可以不加[ ],彩色可以指定。
(11)动态数据类型
创建动态数据类型,这使得图像处理和计算机视觉算法可以适应不同数据类型的图像。
附加:绘图函数,rectangle()矩形,ellipse()椭圆,circle()圆,fillpoly()多边形填充,line()直线,
2.HighGUI模块
OpenCV 的 HighGUI 模块是用于图形用户界面操作的模块,它提供了创建窗口、显示图像、响应鼠标和键盘事件等功能。这个模块用于创建简单的图形界面,以便用户可以与图像进行交互或进行视觉应用的实时演示。
以下是 HighGUI 模块的一些常见功能和函数:
-
创建窗口:
cv::namedWindow()
:用于创建一个窗口,可以在其中显示图像。cv::destroyWindow()
:用于关闭指定的窗口。
-
显示图像:
cv::imshow()
:用于在指定窗口中显示图像。cv::waitKey()
:用于等待用户按下键盘上的按键,并返回按下的按键的 ASCII 值。
-
处理鼠标事件:
cv::setMouseCallback()
:用于设置鼠标事件的回调函数,以便在用户单击、拖动或释放鼠标时执行自定义操作。
-
处理键盘事件:
cv::setKeyboardCallback()
:用于设置键盘事件的回调函数,以便在用户按下键盘上的按键时执行自定义操作。
-
控制图像显示:
cv::moveWindow()
:用于移动窗口的位置。cv::resizeWindow()
:用于更改窗口的大小。cv::setWindowTitle()
:用于设置窗口的标题。
-
绘制文本和形状:
cv::putText()
:用于在图像上绘制文本。cv::rectangle()
、cv::circle()
等:用于在图像上绘制矩形、圆形等形状。
-
保存图像:
cv::imwrite()
:用于将图像保存为文件。
HighGUI 模块允许您在图像处理应用中创建简单的交互式界面,使用户能够与图像进行互动,查看处理的结果,进行标记和测量等。这对于调试和演示视觉算法以及创建用户友好的应用程序非常有用。
3.ImgProc模块
OpenCV 的 ImgProc 模块(图像处理模块)提供了各种图像处理和计算机视觉功能,用于处理和分析图像。该模块包括了许多函数,用于执行各种图像操作,如滤波、边缘检测、形态学操作、直方图等。以下是一些 ImgProc 模块中常用的函数和功能:
-
图像滤波:
cv::GaussianBlur()
:应用高斯模糊滤波。cv::blur()
:应用均值滤波。cv::medianBlur()
:应用中值滤波。cv::bilateralFilter()
:应用双边滤波。
-
边缘检测:
cv::Canny()
:执行 Canny 边缘检测。cv::Sobel()
:执行 Sobel 边缘检测。cv::Scharr()
:执行 Scharr 边缘检测。cv::Laplacian()
:执行拉普拉斯边缘检测。
-
形态学操作:
cv::erode()
:腐蚀操作。cv::dilate()
:膨胀操作。cv::morphologyEx()
:执行自定义形态学操作,如开运算、闭运算等。- cv::getStructuring():返回结构性元素
- 形态梯度,用于寻找对象轮廓,morph_grad = dilate-erode
-
直方图操作:
cv::calcHist()
:计算图像的直方图。cv::equalizeHist()
:直方图均衡化,用于增强图像对比度。
-
图像转换和变换:
cv::resize()
:调整图像大小。cv::warpAffine()
:执行仿射变换。cv::warpPerspective()
:执行透视变换。
-
阈值处理:
cv::threshold()
:应用图像阈值处理。cv::adaptiveThreshold()
:应用自适应图像阈值处理。
-
轮廓检测:
cv::findContours()
:查找图像中的轮廓。cv::drawContours()
:在图像上绘制轮廓。
-
凸包检测:
cv::convexHull()
:查找轮廓的凸包。
-
图像模板匹配:
cv::matchTemplate()
:执行模板匹配。
-
霍夫变换:
cv::HoughLines()
:检测直线。cv::HoughCircles()
:检测圆。
图像金字塔,pryUP()上采样并模糊化,pryDown()下采样并模糊化.