OpenCV ML 模块使用指南

server/2025/3/23 13:05:59/

一、模块概述

OpenCV 的 ML 模块提供了丰富的机器学习算法,可用于解决各种计算机视觉和数据分析问题。本指南将详细介绍该模块中主要的机器学习算法,包括支持向量机(SVM)、K 均值聚类(K-Means)和神经网络(ANN),并结合图像分类和聚类分析这两个典型应用场景进行代码实现与解释。

二、主要函数及类详解

(一)支持向量机(SVM):cv.ml.SVM_create()

功能

支持向量机(SVM)是一种强大的监督学习算法,可用于分类和回归任务。在 ML 模块中,cv.ml.SVM_create() 用于创建一个 SVM 对象,通过训练可以对新的数据进行分类。

使用步骤
  1. 创建 SVM 对象:使用 cv.ml.SVM_create() 创建一个 SVM 对象。
  2. 设置参数:根据具体问题设置 SVM 的参数,如核函数类型、惩罚因子等。
  3. 准备训练数据:将训练数据和对应的标签准备好。
  4. 训练模型:调用 train 方法对 SVM 模型进行训练。
  5. 进行预测:使用训练好的模型对新的数据进行预测。
示例代码

python

import cv2 as cv
import numpy as np# 创建 SVM 对象
svm = cv.ml.SVM_create()# 设置 SVM 参数
svm.setType(cv.ml.SVM_C_SVC)
svm.setKernel(cv.ml.SVM_LINEAR)
svm.setTermCriteria((cv.TERM_CRITERIA_MAX_ITER, 100, 1e-6))# 准备训练数据
trainData = np.array([[1, 2], [2, 3], [3, 1], [4, 2]], dtype=np.float32)
labels = np.array([0, 0, 1, 1], dtype=np.int32)# 训练模型
svm.train(trainData, cv.ml.ROW_SAMPLE, labels)# 进行预测
testData = np.array([[2.5, 2]], dtype=np.float32)
_, result = svm.predict(testData)print("预测结果:", result)
参数解释
  • setType:设置 SVM 的类型,如 cv.ml.SVM_C_SVC 表示 C 支持向量分类器。
  • setKernel:设置核函数类型,如 cv.ml.SVM_LINEAR 表示线性核函数。
  • setTermCriteria:设置迭代终止条件,包括最大迭代次数和误差阈值。

(二)K 均值聚类(K-Means):cv.kmeans()

功能

K 均值聚类是一种无监督学习算法,用于将数据划分为 K 个不同的簇。cv.kmeans() 函数可以对给定的数据进行 K 均值聚类。

使用步骤
  1. 准备数据:将待聚类的数据准备好。
  2. 设置参数:设置聚类的簇数 K、迭代终止条件等。
  3. 进行聚类:调用 cv.kmeans() 函数进行聚类。
  4. 获取聚类结果:获取每个数据点所属的簇标签。
示例代码

python

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 准备数据
data = np.random.randint(0, 100, (25, 2)).astype(np.float32)# 设置聚类的簇数
K = 3# 设置迭代终止条件
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)# 进行 K 均值聚类
_, labels, centers = cv.kmeans(data, K, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)# 绘制聚类结果
colors = ['r', 'g', 'b']
for i in range(K):cluster = data[labels.ravel() == i]plt.scatter(cluster[:, 0], cluster[:, 1], c=colors[i])
plt.scatter(centers[:, 0], centers[:, 1], s=200, c='y', marker='s')
plt.show()
参数解释
  • data:待聚类的数据,通常是一个二维数组。
  • K:聚类的簇数。
  • criteria:迭代终止条件,包括最大迭代次数和误差阈值。
  • flags:初始化聚类中心的方法,如 cv.KMEANS_RANDOM_CENTERS 表示随机初始化。

(三)神经网络(ANN):cv.ml.ANN_MLP_create()

功能

神经网络(ANN)是一种强大的机器学习模型,可用于分类和回归任务。在 ML 模块中,cv.ml.ANN_MLP_create() 用于创建一个多层感知器(MLP)神经网络对象。

使用步骤
  1. 创建 ANN 对象:使用 cv.ml.ANN_MLP_create() 创建一个 ANN 对象。
  2. 设置参数:设置神经网络的结构、激活函数、训练算法等参数。
  3. 准备训练数据:将训练数据和对应的标签准备好。
  4. 训练模型:调用 train 方法对神经网络模型进行训练。
  5. 进行预测:使用训练好的模型对新的数据进行预测。
示例代码

python

import cv2 as cv
import numpy as np# 创建 ANN 对象
ann = cv.ml.ANN_MLP_create()# 设置神经网络的结构
layer_sizes = np.int32([2, 3, 1])  # 输入层 2 个神经元,隐藏层 3 个神经元,输出层 1 个神经元
ann.setLayerSizes(layer_sizes)# 设置激活函数
ann.setActivationFunction(cv.ml.ANN_MLP_SIGMOID_SYM)# 设置训练算法和参数
ann.setTrainMethod(cv.ml.ANN_MLP_BACKPROP)
ann.setBackpropMomentumScale(0.1)
ann.setBackpropWeightScale(0.1)# 准备训练数据
trainData = np.array([[1, 2], [2, 3], [3, 1], [4, 2]], dtype=np.float32)
labels = np.array([[0], [0], [1], [1]], dtype=np.float32)# 训练模型
ann.train(trainData, cv.ml.ROW_SAMPLE, labels)# 进行预测
testData = np.array([[2.5, 2]], dtype=np.float32)
_, result = ann.predict(testData)print("预测结果:", result)
参数解释
  • setLayerSizes:设置神经网络的结构,通过一个数组指定各层的神经元数量。
  • setActivationFunction:设置激活函数,如 cv.ml.ANN_MLP_SIGMOID_SYM 表示对称 Sigmoid 函数。
  • setTrainMethod:设置训练算法,如 cv.ml.ANN_MLP_BACKPROP 表示反向传播算法。

三、应用场景实现

(一)图像分类

图像分类是将图像分为不同类别的任务。以下是一个使用 SVM 进行简单图像分类的示例,假设我们有两类图像,分别用 0 和 1 表示:

python

import cv2 as cv
import numpy as np
import os# 读取图像并提取特征(这里简单使用图像的均值作为特征)
def extract_features(image):return np.mean(image).reshape(1, -1).astype(np.float32)# 准备训练数据
trainData = []
labels = []
class0_folder = 'class0_images'
class1_folder = 'class1_images'for filename in os.listdir(class0_folder):image = cv.imread(os.path.join(class0_folder, filename), cv.IMREAD_GRAYSCALE)features = extract_features(image)trainData.append(features)labels.append(0)for filename in os.listdir(class1_folder):image = cv.imread(os.path.join(class1_folder, filename), cv.IMREAD_GRAYSCALE)features = extract_features(image)trainData.append(features)labels.append(1)trainData = np.vstack(trainData)
labels = np.array(labels, dtype=np.int32)# 创建 SVM 对象并设置参数
svm = cv.ml.SVM_create()
svm.setType(cv.ml.SVM_C_SVC)
svm.setKernel(cv.ml.SVM_LINEAR)
svm.setTermCriteria((cv.TERM_CRITERIA_MAX_ITER, 100, 1e-6))# 训练模型
svm.train(trainData, cv.ml.ROW_SAMPLE, labels)# 测试图像分类
test_image = cv.imread('test_image.jpg', cv.IMREAD_GRAYSCALE)
test_features = extract_features(test_image)
_, result = svm.predict(test_features)print("图像分类结果:", result)

(二)聚类分析

聚类分析是将相似的数据点划分为同一簇的任务。以下是一个使用 K 均值聚类对图像像素进行聚类的示例,将图像的像素根据颜色进行聚类:

python

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt# 读取图像
image = cv.imread('test_image.jpg')
image = cv.cvtColor(image, cv.COLOR_BGR2RGB)# 准备数据
pixels = image.reshape((-1, 3)).astype(np.float32)# 设置聚类的簇数
K = 3# 设置迭代终止条件
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 10, 1.0)# 进行 K 均值聚类
_, labels, centers = cv.kmeans(pixels, K, None, criteria, 10, cv.KMEANS_RANDOM_CENTERS)# 将聚类结果转换回图像
centers = np.uint8(centers)
segmented_image = centers[labels.flatten()]
segmented_image = segmented_image.reshape(image.shape)# 显示原始图像和聚类结果
plt.subplot(121), plt.imshow(image)
plt.title('Original Image')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(segmented_image)
plt.title('Segmented Image')
plt.xticks([]), plt.yticks([])
plt.show()

四、注意事项

  • 数据预处理:在使用机器学习算法之前,通常需要对数据进行预处理,如归一化、特征提取等,以提高模型的性能。
  • 参数调整:不同的算法有不同的参数,需要根据具体问题进行调整,以获得最佳的结果。
  • 模型评估:在训练模型后,需要使用测试数据对模型进行评估,以了解模型的性能。

通过以上内容,你可以了解 ML 模块的主要功能和使用方法,以及如何在图像分类和聚类分析等应用场景中运用该模块进行机器学习任务。


http://www.ppmy.cn/server/177020.html

相关文章

[AI建模] 使用Pinokio本地化部署混元2D到3D AI建模服务

近年来,AI驱动的2D转3D建模技术发展迅猛,而Pinokio作为一个强大的AI模型管理与部署平台,使得在本地部署这些复杂的AI模型变得更加简单高效。本文将介绍如何使用Pinokio在本地部署混元2D到3D AI建模服务,并快速生成带或不带Texture的3D模型。 1. 在Pinokio Discover页面找到…

ESP32学习 -从STM32工程架构进阶到ESP32架构

ESP32与STM32项目文件结构对比解析 以下是对你提供的ESP32项目文件结构的详细解释,并与STM32(以STM32CubeIDE为例)的常见结构进行对比,帮助你理解两者的差异: 1. ESP32项目文件解析 文件/目录作用STM32对应或差异set…

编写一个简单的chrome截图扩展

文件结构: screenshot |-- background.js ---> service_worker运行的js |-- images ---> 图片 | |-- logo-128x128.png | |-- logo-16x16.png | |-- logo-32x32.png | -- logo-48x48.png -- manifest.json --->…

【从零开始学习计算机科学】软件工程(六)软件质量

【从零开始学习计算机科学】软件工程(六)软件质量 软件质量软件质量控制(QC)软件评审软件测试软件测试的基本原则结构化软件测试面向对象软件测试测试的方法软件质量保证(QA)QA与QC的区别在于:软件质量 软件工程中的重要的要求之一便是提高软件质量。 GB/T 11457-2006…

[笔记] 数据结构-第九章-检索

线性表的检索 二分法检索 递归 给定的顺序表l int BinSearch(seqlist *l,int x,int left,int right){if(left>right){return 0;}int mid(leftright)/2;if(l->a[mid]x)return mid;if(l->a[mid]>x)return BinSearch(l,x,left,mid-1);elsereturn BinSearch(l,x,mi…

界面控件DevExpress WPF v25.1预览 - .NET开发效率提升

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

昆仑技术重构AI大模型落地范式,长期作“加法”迎来国产生态化“拐点”

作者 | 曾响铃 文 | 响铃说 DeepSeek的爆火,在业内迅速掀起了一场国产化的变革。“国产大模型国产算力”软硬协同的范式正在被重构,AI产业国产化的含金量持续提升,越来越多的企业在这一趋势下加速走上数智化转型路径。 其中,以…

Excel(进阶篇):powerquery详解、PowerQuery的各种用法,逆透视表格、双行表头如何制作透视表、不规则数据如何制作数据透视表

目录 PowerQuery工具基础修改现有数据理规则PowerQuery抓取数据的两种方式多文件合并透视不同表结构多表追加数据透视追加与合并整理横向表格:逆透视 数据用拆分工具整理数据算账龄 不等步长值组合合并文件夹中所有文件PowerQuery处理CSV文件双行表头、带合并单元格如何做数据…