OpenCV
OpenCV Java/Kotlin
安装
Java/Kotlin 项目
方式一:Gradle方式,bytedeco 版本(推荐)
模块的 build.gradle.kts 文件中 dependencies 里添加如下代码:
初始化:
方式二:Gradle方式,openpnp 版本(版本较老,不推荐)
模块的 build.gradle.kts 文件中 dependencies 里添加如下代码:
初始化:
方式三:手动安装(操作略繁琐,不推荐)
进入 OpenCV Release ,选择Windows,等待下载完成后解压到合适的文件夹。
打开项目的build.gradle.kts文件,在dependices里添加
初始化:
Android 项目
libs.versions.toml :
模块的 build.gradle.kts :
初始化 :
使用到的图片预览

Hello World
在使用OpenCV前先要加载动态链接库 System.load("""【这里替换成OpenCV的根目录】\build\java\x64\opencv_java490.dll""")
颜色 color
对于OpenCV来说,一张彩色图等于三张灰度图。颜色顺序为BGR
灰度图:明暗程度(可以说是相机CMOS上光子数量的分布图)
蓝绿红通道和灰度图
纯色图
方式一:Mat(int rows, int cols, int type, Scalar s),它的参数是行数,列数,通道值,颜色值
方式二:Mat(Size(double width , double height,) int type, Scalar s),它的参数是Size(宽, 高),通道值,颜色值
方式三:将已有Mat对象设置为纯色图 Mat对象.setTo(Scalar s)
切割 crop
请注意 submat() 和 setTo()都是直接在原图上操作。要想不改变原图,请使用 clone()
绘制 draw
模糊 blur
特征点 corner
匹配模板 match
matchTemplate 匹配模板
Imgproc.matchTemplate 是 OpenCV Java 接口中的一个方法,属于 Imgproc 类的一部分。它用于图像模板匹配,即在图像中寻找与模板匹配的部分。该方法通常用于图像识别、图像定位等任务。
- Mat image:源图像(待搜索的图像, 必须是灰度图)。
- Mat templ:模板图像(用于匹配的图像, 必须是灰度图)。
- Mat result:结果存储的目标图像(匹配结果的图像)。
- int method:匹配方法
- TM_SQDIFF:平方差匹配法。计算平方差,值越小匹配度越高。
- TM_SQDIFF_NORMED:归一化平方差匹配法。
- TM_CCORR:相关匹配法。计算相关性,值越大匹配度越高。
- TM_CCORR_NORMED:归一化相关匹配法。
- TM_CCOEFF:相关系数匹配法。计算相关系数,值越大匹配度越高。
- TM_CCOEFF_NORMED:归一化相关系数匹配法。把待检测图像和模板都标准化,再计算匹配度,保证匹配结果不收光照强度的影响,匹配越接近1,说明匹配越准确。
minMaxLoc 查找矩阵中的最小值和最大值以及它们的位置
Core.minMaxLoc 是 OpenCV 库中的一个函数,用于查找矩阵或图像中元素的最小值和最大值及其位置。这个函数对分析图像数据非常有用,例如在图像处理和计算机视觉任务中,可以帮助找到特定特征的位置和数值范围。
src:输入矩阵(Mat),即要在其中查找最小值和最大值的图像或数据矩阵。mask(可选):操作掩码。它必须是与输入图像尺寸相同的 8 位单通道数组。它指定哪些元素将被包含在计算中。如果没有指定,则对所有元素进行计算。
该函数返回一个 MinMaxLocResult 对象,包含以下信息:
- minVal:输入矩阵中找到的最小值。
- maxVal:输入矩阵中找到的最大值。
- minLoc:最小值的位置(Point 类型)。
- maxLoc:最大值的位置(Point 类型)。
threshold 阈值
Imgproc.threshold 是 OpenCV Java 接口中的一个方法,属于 Imgproc 类的一部分。它用于图像阈值处理,这是图像处理中用来将灰度图像转换为二值图像的一种技术。
- src:输入图像(单通道灰度图像)。
- dst:结果存储的目标图像(二值图像)。
- thresh:阈值。
- maxval:与 THRESH_BINARY 和 THRESH_BINARY_INV 阈值类型一起使用的最大值。
- type:阈值类型,有以下几种选项:
- Imgproc.THRESH_BINARY:二进制阈值化。大于等于阈值的像素设为 maxval,小于阈值的设为 0。
- Imgproc.THRESH_BINARY_INV:反二进制阈值化。与二进制阈值化相反。
- Imgproc.THRESH_TRUNC:截断阈值化。大于阈值的像素设为阈值,小于阈值的保持不变。
- Imgproc.THRESH_TOZERO:阈值化为 0。大于阈值的像素保持不变,小于阈值的设为 0。
- Imgproc.THRESH_TOZERO_INV:反阈值化为 0。与阈值化为 0 相反。
- Imgproc.THRESH_OTSU:使用 Otsu 方法自动确定最佳阈值并应用阈值
findNonZero 查找非零元素
Core.findNonZero 是 OpenCV 库中的一个方法,用于查找非零像素的位置。此方法特别适用于二值图像(即包含黑白像素的图像),它可以返回所有非零像素的坐标列表。该方法通常用于图像处理和分析任务,例如对象检测、图像分割等。
- Mat src: 源图像,通常是一个单通道的二值图像。
- Mat dst: 目标 Mat 对象,用于存储非零像素的位置。这是一个单列矩阵,每行代表一个非零像素的位置。
groupRectangles 分组
用于将候选的矩形对象进行分组
- rectList 是一个包含候选矩形的列表。
- weights 是一个整数列表,用于存储每个矩形的权重。函数执行后,这个列表将被更新为每个矩形所在组的矩形数量。
- groupThreshold 是一个整数,表示一个组中需要的最小矩形数量1。只有当一个组中的矩形数量大于或等于groupThreshold时,该组才会被保留1。
- eps 是一个浮点数,用于控制矩形的相似度1。当eps为0时,不进行任何分组。默认值为 0.2
实战
-
查找最佳匹配的坐标
-
返回所有大于阈值的点
先匹配模板,再二值化,最后找出非零点
查找轮廓 findContours
Imgproc.findContours 是 OpenCV 库中的一个函数,用于检测图像中的轮廓。轮廓可以看作是连接具有相同颜色或强度的所有连续点的曲线。它在图像处理和计算机视觉中有着广泛的应用,比如物体检测、形状分析和图像分割。
参数说明
- image: 输入图像。必须是单通道的二值图像(例如,通过阈值化或边缘检测得到)。该图像在函数执行后会被修改,通常作为标记图像使用。
- contours: 用于存储检测到的轮廓的列表。每个轮廓都表示为一个 MatOfPoint,即点的集合。
- hierarchy: 用于存储轮廓的拓扑信息。它是一个 Mat 类型的矩阵。可以为空,但如果不为空,则其大小应该是 (n, 4),其中 n 是检测到的轮廓数量。
- mode: 轮廓检索模式。可以是以下值之一:
- RETR_EXTERNAL: 只检索最外层的轮廓。
- RETR_LIST: 检索所有的轮廓,但不建立任何层次关系。
- RETR_CCOMP: 检索所有的轮廓,并将它们组织成两层:顶层是外部边界,次层是空洞的边界。
- RETR_TREE: 检索所有的轮廓,并重建完整的层次结构。
- method: 轮廓近似方法。可以是以下值之一:
- CHAIN_APPROX_NONE: 存储所有的轮廓点。
- CHAIN_APPROX_SIMPLE: 仅存储轮廓的端点部分,从而可以大大减少需要存储的点数。
使用步骤
- 读取图像:使用 Imgcodecs.imread 读取输入图像。
- 转换为灰度图像:使用 Imgproc.cvtColor 将彩色图像转换为灰度图像。
- 应用阈值化:使用 Imgproc.threshold 将灰度图像转换为二值图像。
- 检测轮廓:使用 Imgproc.findContours 检测二值图像中的轮廓。
- 绘制轮廓:使用 Imgproc.drawContours 在原始图像上绘制检测到的轮廓。
- 显示结果:使用 HighGui.imshow 显示结果图像。
泛洪填充 floodFill
Imgproc.floodFill 是 OpenCV 中用于填充连接区域的函数,它可以用于图像分割、区域标记等应用。该函数类似于画图软件中的油漆桶工具,可以填充从某个种子点开始的所有相连区域。
参数说明
- image: 输入/输出图像。填充操作将在此图像上进行。该图像会被修改。
- mask: 掩码图像,用于控制填充操作的区域。可以为空。如果提供掩码图像,它的大小应比输入图像大两个像素(宽和高都要加2),并且应初始化为0。填充操作只在掩码图像中值为0的区域进行。
- seedPoint: 种子点,从此点开始进行填充。
- newVal: 填充颜色,用于填充区域。
- rect: 返回填充区域的最小边界矩形(可以为空)。
- loDiff: 当前像素与种子点或连接像素之间的亮度或颜色之差的下界。
- upDiff: 当前像素与种子点或连接像素之间的亮度或颜色之差的上界。
- flags: 用于指定填充模式的标志。可能的值包括:
- FLOODFILL_FIXED_RANGE:当前像素与种子像素比较,否则与邻域像素比较。
- FLOODFILL_MASK_ONLY:仅填充掩码图像,不修改输入图像。
梯度 gradient
阈值 threshold
阈值也即二值化

