OpenCV模块总述

本文详细介绍OpenCV在图像处理中的应用,包括图像处理基础、滤波器、边缘检测、特征点检测、摄像机校准等内容。同时介绍了OpenCV中常用的模块及函数,如Core模块、imgproc模块、feature2d模块等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人比较喜欢总分的方式处理问题,所以在处理一个个方法之前会做个总结,先看看都有那些方法,然后根据需求来进行选择,这里总结的虽然不是很全面,不过可以先看看,后面会对每个方法使用指出些例子:

*OpenCV模块*

Core模块(OpenCV基本数据结构)

图像求和:addWeighted
矩阵掩码:filter2D
绘图: line ->直线 ellipse->椭圆 rectangle ->矩形 circle ->圆 fillPoly-> 填充多边形
rng:随机数生成器

imgproc模块(OpenCV中图像处理函数)

平滑处理(模糊) 归一化滤波:blur
高斯模糊:GaussianBlur
中值滤波 :medianBlur
双边滤波:bilaterlFilter

腐蚀与膨胀
腐蚀:erode
膨胀:dilate

形态学变换
开运算 :先腐蚀再膨胀:Opening
闭运算 :先膨胀再腐蚀:Closing
形态梯度: 膨胀图与腐蚀图之差(保留物体边缘轮廓):Morphological Gradient
顶帽 : 原图像与开运算之差:Top Hat
黑帽 : 闭图像与原图像之差:Black Hat

图像金字塔
放大:pyrUp
缩小:pyrDown

阈值操作
二进制阈值化(THRESH_BINARY) -> 大于阈值为1 小于阈值为0
反二进制阈值化(THRESH_BINARY_INV) -> 大于阈值为0 小于阈值为1
截断阈值化(THRESH_TRUNC) -> 大于阈值为阈值,小于阈值不变
阈值化为0 (THRESH_TOZERO) -> 大于阈值的不变,小于阈值的全为0
反阈值化为0(THRESH_TOZERO_INV) -> 大于阈值为0,小于阈值不变

滤波器:filter2D

给图像添加边界:copyMakeBorder
使用常数填充边界 BORDER_CONSTANT
复制原图中最临近的行或者列 BORDER_REPLICATE

Sobel导数
Sobel算子是离散微分算子,计算图像灰度函数的近似梯度
Sobel算子结合了高斯平滑和微分求导

Laplace算子
使用二阶导数来检测边缘。因为图像是’二维’,所以我们要在两个方向求导
Laplace使用了图像梯度,在内部调用了Sobel算子

Canny边缘检测
多级边缘检测算法,被很多人认为是边缘检测的最优算法
低错误率,高定位性,最小响应

霍夫线变换 HoughLines,HoughLinesP
霍夫线变换是一种用来寻找直线的方法
是用霍夫线变换之前,首先要对图像进行边缘检测处理,也即霍夫线变换的直接输入只能是边缘二值图像

霍夫圆变换:HoughCircles
在图像中检测圆

重映射:Remapping

仿射变换 :任意一个仿射变换都能表示为乘以一个矩阵(线性变换)再加上一个向量(平移) 可以使用warpAffine来实现一些简单的重映射。使用getRotationMatrix2D来获得矩阵

直方图均衡化:直方图均值化是通过拉伸像素强度分布范围来增强对比度的一种方法,相当于给直方图进行了拉伸

直方图计算
split 将图像分割成单通道数组
直方图是对数据的集合统计,并将结果分布于一系列预定义的子区域(bin)中
calcHist 计算图像阵列的直方图
直方图的数据不仅仅指的是灰度图,统计数据可能是任何有效描述图像的特征
normalize归一化数组

直方图对比:compareHist
表达两个直方图的相似度的数值

反向投影
calcBackProject计算反射投影
反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式
即计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征

模板匹配
matchTemplate在模板块和输入图像之间寻找匹配,获得匹配结果图像
mixMaxLoc 在给定的矩阵中寻找最大和最小值(包括位置)

在图像中寻找轮廓
findContours 寻找轮廓
drawContours 绘制轮廓

计算物体的凸包:convexHull

创建包为轮廓的矩形和圆形边界
boundingRect 来计算包围轮廓的矩形框
minEnclosingCircle 来计算完全包为已有轮廓最小圆

创建课倾斜的边界框和椭圆
minAreaRect 计算最小包围区域
fitEllipse 用来计算最小包围椭圆

轮廓矩
moments 计算图像所有矩(最高到三阶)
contourArea 计算轮廓面积
arcLength 计算轮廓或曲线长度

多边形测试
pointPolygonTest 判断一个点是否在轮廓内

highgui模块(读取/保存图像/视频文件以及如何使用库的内置图形用户界面的)

为程序界面添加滑动条:createTrackbar
在窗口添加一个滑动条

calib3d模块(从2D图像中找到有关3D世界的信息)

使用棋盘格来进行摄像机标定
1.载入图片
2.findChessboardCorners来检测图片中的棋盘
3.定义容器,存放三维坐标
4.从XML/YAML文件中读取摄像机参数
5.执行solvePnP,找到棋盘姿势
6.计算投影误差,参照calibration(computeReprojectionErrors)

这个当时没做笔记,好像是用matlab得到的自己想要的参数,获得的内参还是外参的值,下面会写出摄像机校准的步骤,具体实践看看有没有时间吧,再继续做,当时没有完全做完。

使用OpenCV进行摄像机校准
考虑到径向和切向的因素,径向扭曲的存在表现为’桶’或’鱼眼’效应
由于摄像机不完全平行于成像平面,出现切向畸变
1.设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)
2.在图像中寻找角点
corners = cv2.findChessboardCorners(gray, (row, col), None)
3.在原角点中寻找亚像素角点
corners2 = cv2.cornerSubPix(gray, corners, (3, 3), (-1, -1), criteria)# 在原角点的基础上寻找亚像素角点
4.在图像中绘制角点
cv2.drawChessboardCorners(img, (row, col), corners, ret)
5.标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)
mtx : 内参矩阵
dist: 畸变系数5个
rvecs : 旋转向量,外参
tvecs : 平移向量,内参
6.畸变矫正
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
7.去除畸变(undistort)
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

上面的方法是Pycharm的,大家可以看下Pycharm的opencv方法
举个最通用的例子吧,图像处理中的读取图片,我们看下Pycharm这里的定义:
img = cv2.imread(“D:\test.png”)
python里面类型是不需要你去定义的,所以设置一个变量,然后让它等于后面方法的值就ok了
看如何使用这个方法,跳进定义方法里面:

Pycharm imread方法定义

这里我们看第三行,就是让我们用这个方法指定到一个变量上面去,后面等于的变量可能会有很多种,那么我举个例子(2个值的,多的同理):

test1,test2 = cv2.某一个方法(方法参数)
这里这样写就可以了

feature2d模块(OpenCV中的特征点检测,特征点描述,以及匹配算法)

Harris 角点检测
cornerHarris函数 通过 Harris-Stephens方法检测角点
因为角点是两个边缘的连接点,它代表了两个边缘变化的方向上的点。图像梯度有很高的变化。这种变化是可以用来帮助检测角点的。

Shi-Tomasi 角点检测
使用goodFeaturesToTrack来调用Shi-Tomasi方法检测角点

定制化创建检点检测
使用OpenCV函数cornerEigenValsAndVecs来计算像素对应的本征值和本征向量
来确定其是否是角点
使用OpenCV函数cornerMinEigenVal通过最小化本征值来进行角点检测实现一个
定制化的Harris detector ,类似Shi-Tomasi算子

亚像素级的角点检测
使用OpenCV函数cornerSubPix寻找更精确的角点位置
(不是整数类型的位置,而是更加精确的浮点类型位置)

特征点检测
使用FeatureDetector来发现感兴趣的点
使用SurfFeatureDetector以及detect来实现检测过程
使用函数drawKeypoints来绘制检测到的关键点

特征描述
使用DescriptorExtractor接口来寻找关键点对应的特征向量
使用SurfDescriptorExtracotr以及其函数compute来完成特定的计算
使用BruteForceMatcher来匹配特征向量
使用函数drawMatches来绘制检测到的匹配点

使用FLANN进行特征点匹配
使用FlannBasedMathcer接口以及FLANN实现快速高效匹配
(快速最近邻逼近搜索函数库(Fast Approximate Nearest Neighbor Search Library))

使用二维特征点(Features2D)和单映射(Homography)寻找已知物体
使用函数findHomography寻找匹配上的关键点的变换
使用函数perpectiveTransform来映射点

平面物体检测
使用features2d和calib3d模式来检测场景中的已知平面物体

video模块(视频流算法的使用,如:运动提取,特征跟踪和前景提取,图像差值法(二帧差,三帧差,光点检测法))

我这里没用Pycharm接入视频流,后面做些补充

objectect模块
级联分类器
使用CascadeClassifier类来检测视频流中的物体
特别地,我们将使用函数:load来加载一个.xml分类器文件。
它既可以是Harr特征也可以是LBP特征的分类器
detectMultiScale来进行图像的多尺度检测

ml模块 (机器学习:使用功能强大的机器学习类进行统计分类,回归和数据聚类)
暂时还没跟机器学习打交道,等有机会我做个实验尝试下,不然总感觉缺点啥。

<think>好的,用户问的是C++有没有图像识别的库。我需要先回忆一下常见的C++库,尤其是用于图像处理的部分。首先,OpenCV应该是比较常用的,它是一个开源的计算机视觉库,支持很多图像处理和机器学习的功能。然后,可能还有Dlib,这也是一个机器学习库,包含了一些图像识别的工具。另外,像TensorFlow和PyTorch虽然主要是Python用的,但它们的C++ API是否支持图像识别呢?可能需要确认一下。还有像Caffe,不过它现在可能不太活跃了。还有可能是一些专门用于深度学习的库,比如OpenCV的DNN模块,可以加载预训练的模型。用户可能需要知道这些库的功能、特点以及适用场景,比如实时性、易用性、社区支持等。另外,是否需要考虑跨平台支持?OpenCV在这方面做得不错。还有性能方面,C++的库通常效率较高,适合嵌入式或高性能需求的应用。可能还要提到一些具体的应用案例,比如人脸识别、物体检测等。需要确保回答结构清晰,分点说明每个库的特点,帮助用户做出选择。同时要注意用户可能对如何开始使用这些库有疑问,可以建议参考官方文档或教程。另外,是否需要安装步骤?可能用户是初学者,但问题本身可能不需要太详细,但可以提到安装方法。最后要总结一下,根据需求推荐不同的库,比如推荐OpenCV作为首选,然后其他库根据特定需求选择。需要检查是否有遗漏的重要库,比如可能还有Tesseract OCR,虽然主要用于文字识别,但也是图像相关。或者像VLFeat,但可能主要用MATLAB接口。所以主要应该是OpenCV、Dlib、TensorFlow C++ API、Caffe等。需要确保信息准确,比如OpenCV的DNN模块支持哪些框架的模型,比如TensorFlow、Caffe、ONNX等。还有,可能Boost库有一些图像处理的部分,但可能不够专门。所以重点放在前面提到的几个库上。还要注意中文表达,避免专业术语错误,比如“图像识别”对应的库是否准确。最后整理结构,先总述,再分点介绍每个库,最后总结建议。</think>C++ 拥有多个成熟的图像识别库,以下是主要推荐的工具及其特点: --- ### 一、**OpenCV(首选推荐)** - **定位**:开源计算机视觉库,覆盖图像处理、机器学习、深度学习等。 - **核心功能**: - 图像预处理(滤波、边缘检测、特征提取等) - 目标检测(Haar级联、HOG+SVM等传统方法) - 深度学习支持(通过 DNN 模块加载 TensorFlow/PyTorch/Caffe 模型) - **优势**: - 跨平台(Windows/Linux/macOS/嵌入式设备) - 完善的文档和社区支持 - 提供 Python、Java 等接口,但原生为 C++ 实现 - **典型应用**:人脸识别、车牌识别、AR开发 - **安装**:通过包管理器(如 `vcpkg`)或源码编译: ```bash vcpkg install opencv ``` --- ### 二、**Dlib** - **定位**:C++ 机器学习库,包含图像处理和深度学习工具。 - **核心功能**: - 人脸检测与关键点定位 - 支持传统机器学习算法(SVM、聚类等) - 轻量级深度学习模型(如 CNN 人脸识别) - **优势**: - 代码简洁,适合快速开发 - 提供预训练模型 - **示例代码**: ```cpp #include <dlib/image_processing.h> dlib::frontal_face_detector detector = dlib::get_frontal_face_detector(); ``` --- ### 三、**TensorFlow C++ API** - **定位**:Google 深度学习框架的 C++ 接口。 - **核心功能**: - 加载预训练模型(如 ResNet、YOLO) - 自定义模型推理 - **优势**: - 高性能推理(适合部署环境) - 与 Python 训练流程无缝衔接 - **局限**: - 安装配置较复杂 - 主要用于推理,训练推荐 Python 版本 --- ### 四、**Caffe(适用于传统项目)** - **定位**:老牌深度学习框架,C++ 实现。 - **特点**: - 支持 CNN 模型训练与推理 - 适合静态图像分类任务 - **现状**:社区活跃度下降,建议优先选择 OpenCV 或 TensorFlow --- ### 五、**Tesseract OCR(文字识别专用)** - **定位**:开源 OCR 引擎,专注于文字提取。 - **功能**: - 识别图像中的多语言文本 - 支持自定义字体训练 - **集成**:通常与 OpenCV 配合使用(预处理 + OCR) --- ### 六、**其他工具** - **OpenVINO**:Intel 的推理加速工具,优化 OpenCV/TensorFlow 模型在 CPU 上的性能。 - **TorchLib**:PyTorch 的 C++ 接口,灵活性高但文档较少。 --- ### **选择建议** 1. **通用场景**:优先使用 **OpenCV**,功能全面且易用。 2. **深度学习部署**:选择 **TensorFlow C++ API** 或 **OpenCV DNN 模块**。 3. **轻量级应用**:**Dlib** 适合快速实现人脸检测等任务。 4. **文字识别**:**Tesseract** + OpenCV 组合。 如需进一步学习,可参考官方文档和 GitHub 示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值