当前位置: 首页 > article >正文

OpenCV机器学习(4)k-近邻算法(k-Nearest Neighbors, KNN)cv::ml::KNearest类

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::ml::KNearest 是 OpenCV 机器学习模块中的一部分,它提供了实现 k-近邻算法(k-Nearest Neighbors, KNN)的方法。KNN 是一种简单但功能强大的分类和回归算法,基于实例的学习方法,即根据最近邻的类别来预测新样本的类别。

主要特点

  • 分类与回归:既可以用于分类任务也可以用于回归任务。
  • 参数设置:可以指定邻居的数量(k)、是否使用投票机制(对于分类)或平均值(对于回归)等。
  • 距离度量:支持不同的距离度量方式,默认为欧几里得距离。

常用成员函数

以下是一些常用的 cv::ml::KNearest 类成员函数:

  • 创建模型实例:
    create():创建一个新的 KNearest 模型实例。
  • 训练模型:
    • train(const Ptr& trainData, int flags=0):使用提供的训练数据进行训练。
    • train(const Mat& samples, int layout, const Mat& responses):另一种形式的训练函数,直接接受样本和响应矩阵作为输入。
  • 预测:
  • findNearest(InputArray samples, int k, OutputArray results, OutputArray neighborResponses=noArray(), OutputArray dist=noArray()) -
    -const:找到最近的 k 个邻居,并返回结果、邻居的响应及距离(可选)。
  • 保存与加载模型:
    • save(const String& filename):将模型保存到文件。
    • load(const String& filename):从文件加载模型。

使用步骤

  • 准备数据:准备好你的训练数据集,包括特征向量及其对应的标签(对于分类任务)或目标值(对于回归任务)。
  • 初始化 KNearest 模型:使用 cv::ml::KNearest::create() 创建一个新的 KNearest 模型实例,并根据需要设置参数。
  • 训练模型:调用 train() 方法,传入你的训练数据来进行模型训练。
  • 评估模型:可以通过交叉验证或者在独立的测试集上评估模型性能。
  • 预测新数据:使用训练好的模型对新的未见过的数据进行预测,并获取其所属类别的概率分布或回归值。

代码示例

include <iostream>
#include <opencv2/ml.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::ml;
using namespace std;int main()
{// 准备训练数据Mat samples = ( Mat_< float >( 4, 2 ) << 0.5, 1.0, 1.0, 1.5, 2.0, 0.5, 1.5, 0.0 );Mat responses = ( Mat_< int >( 4, 1 ) << 0, 0, 1, 1 );// 创建并配置 KNearest 模型Ptr< KNearest > knn_model = KNearest::create();knn_model->setDefaultK( 3 );         // 设置默认的邻居数量为3knn_model->setIsClassifier( true );  // 设置为分类模式// 训练模型bool ok = knn_model->train( samples, ROW_SAMPLE, responses );if ( ok ){// 保存模型knn_model->save( "knn_model.yml" );// 对新样本进行预测Mat sample = ( Mat_< float >( 1, 2 ) << 1.6, 0.7 );Mat result, neighborResponses, dist;float response = knn_model->findNearest( sample, 3, result, neighborResponses, dist );cout << "The predicted response for the sample is: " << response << endl;cout << "Neighbor responses: " << neighborResponses << endl;cout << "Distances: " << dist << endl;}else{cerr << "Training failed!" << endl;}return 0;
}

运行结果

The predicted response for the sample is: 1
Neighbor responses: [1, 1, 0]
Distances: [0.19999997, 0.49999997, 1]

相关文章:

OpenCV机器学习(4)k-近邻算法(k-Nearest Neighbors, KNN)cv::ml::KNearest类

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::KNearest 是 OpenCV 机器学习模块中的一部分&#xff0c;它提供了实现 k-近邻算法&#xff08;k-Nearest Neighbors, KNN&#xff09;的…...

在nodejs中使用RabbitMQ(三)Routing、Topics、Headers

示例一、Routing exchange类型direct&#xff0c;根据消息的routekey将消息直接转发到指定队列。producer.ts 生产者主要发送消息&#xff0c;consumer.ts负责接收消息&#xff0c;同时也都可以创建exchange交换机&#xff0c;创建队列&#xff0c;为队列绑定exchange&#xff…...

浏览器扩展实现网址自动替换

作为一个开发爱好者&#xff0c;不能顺畅访问github是很痛苦的&#xff0c;这种状况不知道何时能彻底解决。 目前也有很多方案可以对应这种囧况&#xff0c;我此前知道有一个网站kkgithub&#xff0c;基本上把github的静态内容都搬了过来&#xff0c;我们如果需要访问某个githu…...

《open3d qt 网格泊松采样成点云》

open3d qt 网格泊松采样成点云 效果展示二、流程三、代码效果展示 效果好一点,速度慢一点。 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionMeshPossionSample_triggered()//泊松采样 void MainWindow::...

从算法到落地:DeepSeek如何突破AI工具的同质化竞争困局

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…...

阿里云一键部署DeepSeek-V3、DeepSeek-R1模型

目录 支持的模型列表 模型部署 模型调用 WebUI使用 在线调试 API调用 关于成本 FAQ 点击部署后服务长时间等待 服务部署成功后&#xff0c;调用API返回404 请求太长导致EAS网关超时 部署完成后&#xff0c;如何在EAS的在线调试页面调试 模型部署之后没有“联网搜索…...

python学opencv|读取图像(六十六)使用cv2.minEnclosingCircle函数实现图像轮廓圆形标注

【1】引言 前序学习过程中&#xff0c;已经掌握了使用cv2.boundingRect()函数实现图像轮廓矩形标注&#xff0c;相关文章链接为&#xff1a;python学opencv|读取图像&#xff08;六十五&#xff09;使用cv2.boundingRect()函数实现图像轮廓矩形标注-CSDN博客 这篇文章成功在图…...

嵌入式经常用到串口,如何判断串口数据接收完成?

说起通信&#xff0c;首先想到的肯定是串口&#xff0c;日常中232和485的使用比比皆是&#xff0c;数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。 空闲中断断帧 一些mcu&#xff08;如&#xff1a;stm32f103&#xff09;在出厂时就已经在…...

面试真题 | B站C++渲染引擎

一、基础与语法 自我介绍 请简要介绍自己的背景、专业技能和工作经验。实习介绍 详细描述你在实习期间参与的项目、职责和成果。二、智能指针相关问题回答 unique_ptr 是如何实现的?它有哪些特点和优势? unique_ptr 是C++11引入的一种智能指针,用于管理动态分配的内存资源…...

系统不是基于UEFI的win11,硬盘格式MBR,我如何更改为GPT模式添加UEFI启动?

我的系统不是基于UEFI的win11&#xff0c;硬盘格式MBR&#xff0c;我如何更改为GPT模式添加UEFI启动&#xff1f; 相当于你的Windows 11系统从MBR转换为GPT&#xff0c;并添加UEFI启动支持&#xff0c;你需要执行以下步骤&#xff1a; 备份数据 首先&#xff0c;强烈建议你备份…...

Vue2/Vue3分别如何使用computed

computed 是 Vue 中用于定义计算属性的功能&#xff0c;它会根据依赖的数据动态计算并缓存结果。Vue 2 和 Vue 3 中的 computed 使用方式有所不同&#xff0c;以下是详细说明&#xff1a; Vue2中的computed 在 Vue 2 中&#xff0c;computed 是通过选项式 API 实现的&#xff…...

操作系统知识速记:实现线程同步的方式

操作系统知识速记&#xff1a;实现线程同步的方式 在当今的多核和多线程世界里&#xff0c;线程同步是确保数据一致性和提高系统性能的关键。 互斥锁&#xff08;Mutex&#xff09; 互斥锁是实现线程安全的基础。它通过确保同一时间只有一个线程能访问共享资源来防止数据竞争。…...

用vue3写一个好看的wiki前端页面

以下是一个使用 Vue 3 Element Plus 实现的 Wiki 风格前端页面示例&#xff0c;包含现代设计、响应式布局和常用功能&#xff1a; <template><div class"wiki-container"><!-- 头部导航 --><el-header class"wiki-header"><d…...

从图像中提取的每行数字作为一张完整的图片,而不是每个数字单独成为一张图片

具体实现思路&#xff1a; 提取行区域&#xff1a;先通过轮廓或空白区域分割出每行数字。确保每行是一个整体&#xff1a;在提取每行时&#xff0c;确保提取区域的宽度包含该行所有的数字&#xff08;即避免单独分割每个数字&#xff09;。保存每一行作为一张图片&#xff1a;…...

【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段

在 Elasticsearch 中&#xff0c;Override field values at query time是指通过运行时字段&#xff08;runtime fields&#xff09;在查询阶段动态覆盖索引字段的值&#xff0c;而无需修改原始索引数据。这种功能特别适用于以下场景&#xff1a; 1. 动态修改字段值&#xff1a…...

文心一言4月起全面免费,6月底开源新模型:AI竞争进入新阶段?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、文心一言免费化的背后&#xff1a;AI成本与应用的双重驱动1️⃣成本下降&#xff0c;推动文心一言普及2…...

基于斜坡单元的机器学习模型预测滑坡易发性,考虑条件因素的异质性

&#xff11;、引用 Chang Z, Catani F, Huang F, et al. Landslide susceptibility prediction using slope unit-based machine learning models considering the heterogeneity of conditioning factors[J]. Journal of Rock Mechanics and Geotechnical Engineering, 2023…...

面向对象程序设计-实验七

6-1 计算捐款总量 这里需要设计一个捐款人类Donator及一个相关函数getMaxName( )&#xff0c;Donator类中包含捐款人的姓名及其捐款额 代码清单&#xff1a; #include <iostream> using namespace std; class Donator { private: string name; float money; //单位&…...

如何学习Elasticsearch(ES):从入门到精通的完整指南

如何学习Elasticsearch&#xff08;ES&#xff09;&#xff1a;从入门到精通的完整指南 嘿&#xff0c;小伙伴们&#xff01;如果你对大数据搜索和分析感兴趣&#xff0c;并且想要掌握Elasticsearch这一强大的分布式搜索引擎&#xff0c;那么你来对地方了&#xff01;本文将为…...

Java面试宝典:说下Spring Bean的生命周期?

Java面试宝典专栏范围&#xff1a;JAVA基础&#xff0c;面向对象编程&#xff08;OOP&#xff09;&#xff0c;异常处理&#xff0c;集合框架&#xff0c;Java I/O&#xff0c;多线程编程&#xff0c;设计模式&#xff0c;网络编程&#xff0c;框架和工具等全方位面试题详解 每…...

early bird inject

基本原理 本质是利用windows系统的apc机制&#xff0c;以及涉及到windows进程启动的流程. 因为线程初始化阶段LdrInitializeThunk函数会调用NtTestAlert函数,这个函数执行后,所有apc队列中的例程都会执行.因此我们在主线程初始化之前向主线程的apc队列中加入恶意代码即可实现…...

Spring Boot 的约定优于配置:简化开发的艺术

# Spring Boot 的约定优于配置&#xff1a;简化开发的艺术 在现代软件开发中&#xff0c;Spring Boot 凭借其“约定优于配置”&#xff08;Convention Over Configuration&#xff0c;简称 CoC&#xff09;的理念&#xff0c;极大地简化了 Spring 应用的开发流程。本文将深入探…...

WSL Ubuntu 安装 CUDA 教程

WSL Ubuntu 安装 CUDA 教程 1. 概述2. 准备工作3. 删除旧的 GPG 密钥4. 安装 CUDA Toolkit4.1 使用 WSL-Ubuntu 包安装&#xff08;推荐&#xff09; 5. 设置环境变量6. 注意事项7. 参考链接8. 总结 1. 概述 随着 WSL 2 的推出&#xff0c;Windows 用户现在可以在 Windows 子系…...

docker运行perplexica

序 本文主要研究一下如何用docker运行perplexica 步骤 git clone git clone https://github.com/ItzCrazyKns/Perplexica.gitapp.dockerfile FROM docker.1ms.run/node:20.18.0-alpineARG NEXT_PUBLIC_WS_URLws://127.0.0.1:3001 ARG NEXT_PUBLIC_API_URLhttp://127.0.0.1…...

15、Python面试题解析:列表推导式-条件推导与嵌套推导

1. 列表推导式简介 列表推导式&#xff08;List Comprehension&#xff09;是 Python 中一种简洁的创建列表的方式。它允许我们通过一行代码生成列表&#xff0c;通常比传统的 for 循环更简洁、更易读。 基本语法 [表达式 for 元素 in 可迭代对象]表达式&#xff1a;对元素的…...

uvm错误记录4

如下所示&#xff0c;奇怪的是penable莫名其妙的出X。可问题&#xff0c;我发送激励了。 仔细定位发现&#xff0c;39行用的是vif中的penable, 问题是都是赋值&#xff0c;却出现同时赋值多次&#xff0c;这是因为nonblocking和blocking同时触发导致的&#xff0c;因此&#xf…...

正则表达式(Regular expresssion)

正则表达式 匹配单次 . &#xff1a;匹配任意一个字符 [ ] &#xff1a;匹配[ ]里举例的任意一个字符 /d &#xff1a;匹配数字0-9 /D &#xff1a;匹配非数字 /s &#xff1a;匹配空白或tab建 /S &#xff1a;匹配非空白 /w &#xff1a;…...

React 中级教程

1. useState 与 setState 深入理解 import React, { useState } from react;const Counter = () => {const [count, setCount] = useState(0);const increment = () => {setCount(count + 1); // setState 会异步更新};return (<div><p>Count: {count}</…...

3dtiles——Cesium ion for Autodesk Revit Add-In插件

一、说明&#xff1a; Cesium已经支持3dtiles的模型格式转换&#xff1b; 可以从Cesium官方Aesset中上传gltf等格式文件转换为3dtiles&#xff1b; 也可以下载插件&#xff08;例如revit-cesium插件&#xff09;转换并自动上传到Cesium官方Aseet中。 Revit转3dtiles插件使用…...

高级 Conda 使用:环境导出、共享与优化

1. 引言 在 Conda 的基础包管理功能中&#xff0c;我们了解了如何安装、更新和卸载包。但对于开发者来说&#xff0c;如何更好地管理环境、导出环境配置、共享环境&#xff0c;以及如何优化 Conda 的使用效率&#xff0c;才是提高工作效率的关键。本篇博客将进一步深入 Conda …...