opencv学习 机器学习

Kmeans

double cv::kmeans(InputArray dataint k  InputOutputArray bestLabels //输出的所有样本的标签数组TermCriteria criteriaint attempts //采样不同初始化标签的尝试次数int flag // 中心点初始化方法,支持KMEANS_RANDOM_CENTERS//KMEANS_PP_CENTERS//KMEANS_USE_INITIAL_LABELSOutputArray centers=noArray()
)

kmeans实现图像语义分割示例代码:

void MLoperatorsDemo::kmeans_segmentation_demo(Mat &image) {Scalar colorTab[] = {Scalar(0, 0, 255),Scalar(0, 255, 0),Scalar(255, 0, 0),Scalar(0, 255, 255),Scalar(255, 0, 255)};int width = image.cols;int height = image.rows;int dims = image.channels();// 初始化定义int sampleCount = width*height;int clusterCount = 5;Mat labels;Mat centers;// RGB 数据转换到样本数据Mat sample_data = image.reshape(3, sampleCount);Mat data;sample_data.convertTo(data, CV_32F);// 运行K-MeansTermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1);kmeans(data, clusterCount, labels, criteria, clusterCount, KMEANS_PP_CENTERS, centers);// 显示图像分割结果int index = 0;Mat result = Mat::zeros(image.size(), image.type());for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {index = row*width + col;int label = labels.at<int>(index, 0);result.at<Vec3b>(row, col)[0] = colorTab[label][0];result.at<Vec3b>(row, col)[1] = colorTab[label][1];result.at<Vec3b>(row, col)[2] = colorTab[label][2];}}imshow("KMeans图像分割", result);
}

KNN分类

KNN实现手写数字识别:

void MLoperatorsDemo::knn_digit_train(Mat &image) {Mat gray;cvtColor(image, gray, COLOR_BGR2GRAY);// 分割为5000个cellsMat images = Mat::zeros(5000, 400, CV_8UC1);Mat labels = Mat::zeros(5000, 1, CV_8UC1);int index = 0;Rect roi;roi.x = 0;roi.height = 1;roi.width = 400;for (int row = 0; row < 50; row++) {int label = row / 5;int offsety = row * 20;for (int col = 0; col < 100; col++) {int offsetx = col * 20;Mat digit = Mat::zeros(Size(20, 20), CV_8UC1);for (int sr = 0; sr < 20; sr++) {for (int sc = 0; sc < 20; sc++) {digit.at<uchar>(sr, sc) = gray.at<uchar>(sr + offsety, sc + offsetx);}}Mat one_row = digit.reshape(1, 1);roi.y = index;one_row.copyTo(images(roi));labels.at<uchar>(index, 0) = label;index++;}}printf("load sample hand-writing data...\n");// 转换为浮点数images.convertTo(images, CV_32FC1);labels.convertTo(labels, CV_32SC1);printf("load sample hand-writing data...\n");// 开始KNN训练printf("Start to knn train...\n");Ptr<ml::KNearest> knn = ml::KNearest::create();knn->setDefaultK(5);knn->setIsClassifier(true);Ptr<ml::TrainData> tdata = ml::TrainData::create(images, ml::ROW_SAMPLE, labels);knn->train(tdata);knn->save("D:/vcworkspaces/knn_knowledge.yml");printf("Finished KNN...\n");
}void MLoperatorsDemo::knn_digit_test() {// real test itMat t1 = imread(rootdir + "knn_01.png", IMREAD_GRAYSCALE);Mat t2 = imread(rootdir + "knn_02.png", IMREAD_GRAYSCALE);namedWindow("t1", WINDOW_FREERATIO);namedWindow("t2", WINDOW_FREERATIO);imshow("t1", t1);imshow("t2", t2);Mat m1, m2;resize(t1, m1, Size(20, 20));resize(t2, m2, Size(20, 20));Mat testdata = Mat::zeros(2, 400, CV_8UC1);Mat testlabels = Mat::zeros(2, 1, CV_32SC1);Rect rect;rect.x = 0;rect.y = 0;rect.height = 1;rect.width = 400;Mat one = m1.reshape(1, 1);Mat two = m2.reshape(1, 1);one.copyTo(testdata(rect));rect.y = 1;two.copyTo(testdata(rect));testlabels.at<int>(0, 0) = 1;testlabels.at<int>(1, 0) = 2;testdata.convertTo(testdata, CV_32F);// 加载KNN分类器Ptr<ml::KNearest> knn = Algorithm::load<ml::KNearest>("D:/vcworkspaces/knn_knowledge.yml");Mat result;knn->findNearest(testdata, 5, result);for (int i = 0; i< result.rows; i++) {int predict = result.at<float>(i, 0);printf("knn t%d predict : %d, actual label :%d \n", (i + 1), predict, testlabels.at<int>(i, 0));}
}

SVM与HOG实现对象检测:

void MLoperatorsDemo::get_hog_descriptor(Mat &image, vector<float> &desc) {HOGDescriptor hog;int h = image.rows;int w = image.cols;float rate = 64.0 / w;Mat img, gray;resize(image, img, Size(64, int(rate*h)));  //宽设置为64且图像的宽高比不变cvtColor(img, gray, COLOR_BGR2GRAY);Mat result = Mat::zeros(Size(64, 128), CV_8UC1);result = Scalar(127);Rect roi;roi.x = 0;roi.width = 64;roi.y = (128 - gray.rows) / 2;roi.height = gray.rows;gray.copyTo(result(roi)); //图像resize之后对缺失部分进行灰度填充,所以hog.compute不能直接用gray(宽高比不对)hog.compute(result, desc, Size(8, 8), Size(0, 0));
}void MLoperatorsDemo::train_ele_watch(std::string positive_dir, std::string negative_dir) {// 创建变量Mat trainData = Mat::zeros(Size(3780, 26), CV_32FC1);Mat labels = Mat::zeros(Size(1, 26), CV_32SC1);vector<string> images;glob(positive_dir, images);int pos_num = images.size();// 生成正负样本数据for (int i = 0; i < images.size(); i++) {Mat image = imread(images[i].c_str());vector<float> fv;get_hog_descriptor(image, fv);printf("image path : %s, feature data length: %d \n", images[i].c_str(), fv.size());for (int j = 0; j < fv.size(); j++) {trainData.at<float>(i, j) = fv[j];}labels.at<int>(i, 0) = 1;}images.clear();glob(negative_dir, images);for (int i = 0; i < images.size(); i++) {Mat image = imread(images[i].c_str());vector<float> fv;get_hog_descriptor(image, fv);printf("image path : %s, feature data length: %d \n", images[i].c_str(), fv.size());for (int j = 0; j < fv.size(); j++) {trainData.at<float>(i + pos_num, j) = fv[j];}labels.at<int>(i + pos_num, 0) = -1;}// 训练SVM仪表分类器printf("\n start SVM training... \n");Ptr< ml::SVM > svm = ml::SVM::create();svm->setKernel(ml::SVM::LINEAR);svm->setC(2.0);svm->setType(ml::SVM::C_SVC);svm->train(trainData, ml::ROW_SAMPLE, labels);clog << "...[done]" << endl;// save xmlsvm->save("D:/vcworkspaces/svm_hog_elec.yml");
}void MLoperatorsDemo::hog_svm_detector_demo(Mat &image) {// 创建HOG与加载SVM训练数据HOGDescriptor hog;Ptr<ml::SVM> svm = ml::SVM::load("D:/vcworkspaces/svm_hog_elec.yml");Mat sv = svm->getSupportVectors();Mat alpha, svidx;double rho = svm->getDecisionFunction(0, alpha, svidx);// 构建detectorvector<float> svmDetector;svmDetector.clear();svmDetector.resize(sv.cols + 1);for (int j = 0; j < sv.cols; j++) {//sv.cols=3780=fv.sizesvmDetector[j] = -sv.at<float>(0, j);}svmDetector[sv.cols] = (float)rho;hog.setSVMDetector(svmDetector);vector<Rect> objects;hog.detectMultiScale(image, objects, 0.1, Size(8, 8), Size(32, 32), 1.25);for (int i = 0; i < objects.size(); i++) {rectangle(image, objects[i], Scalar(0, 0, 255), 2, 8, 0);}namedWindow("SVM+HOG对象检测演示", WINDOW_FREERATIO);imshow("SVM+HOG对象检测演示", image);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA高端项目:Xilinx Zynq7020系列FPGA 多路视频缩放拼接 工程解决方案 提供4套工程源码+技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我这里已有的FPGA图像缩放方案我已有的FPGA视频拼接叠加融合方案本方案的Xilinx Kintex7系列FPGA上的ov5640版本本方案的Xilinx Kintex7系列FPGA上的HDMI版本本方案的Xilinx Artix7系列…

【SVN在Linux下的常用指令】

windows下的TortoiseSVN是资源管理器的一个插件&#xff0c;以覆盖图标表示文件状态&#xff0c;几乎所以命令都有图形界面支持&#xff0c;比较好用&#xff0c;这里就不多说。主要说说linux下svn的使用&#xff0c;因为linux下大部分的操作都是通过命令行来进行&#xff0c;所…

深度解读 BigANN 2023 四大赛题,向量搜索还有更好的解决方案?

近年来&#xff0c;向量搜索大赛 BigANN 一直是行业关注的焦点。原因在于&#xff0c;BigANN 不仅是在向量搜索领域具有强大影响力的比赛&#xff0c;开发者在赛后贡献出的相关解决方案更是行业进步与发展的重要动力。 向量检索大赛 BigANN 旨在提升大规模 ANN 的研究创新和生产…

Django如何调用机器学习模型进行预测

Django是一个流行的Python Web框架,它可以很方便地集成机器学习模型,进行预测和推理。我将介绍如何在Django项目中调用训练好的机器学习模型,并实现一个预测接口。 准备工作 首先我们需要一个训练好的机器学习模型。这里我们使用Scikit-Learn训练一个简单的线性回归模型作为示…

Django模型(八)

一、修改数据 先获取对象,通过对象属性更新数据,再保存 (更新单一数据)通过QuerySet的update函数更新数据 (更新多条数据) #单条记录修改 save c = Cook.objects.get(pk=1) c.name = 安妮 c.save()# 更新多个值 update Cook.objects.filter(sect=粤菜).update(level=5)1.1、…

Methodot低代码实战教程(一)——熟悉可视化Echart组件

一、产品介绍&#xff1a; Methodot是行云创新旗下一款面向研发使用的一站式云原生开发及应用托管平台&#xff0c;产品内有大量开箱即用的服务和开发工具&#xff0c;例如&#xff1a; 支持开发团队进行微服务架构设计&#xff08;例如一个袜子商店管理系统&#xff09;&…

win11安装MySql5.7

1、下载 打开下载链接&#xff1a;MySQL :: Download MySQL Installer 2、安装 2.1、安装界面 2.2、选择自定义安装 2.3、根据自己系统的位数进行选择是X64还是X86 2.4、选择安装路径 2.5、继续下一步 2.6、选择服务器专用&#xff0c;端口是3306 2.7、设置密码 2.8、设置服…

2024美赛数学建模E题思路源码

比赛当天第一时间更新&#xff01; 赛题目的 赛题目的&#xff1a; 问题描述&#xff1a; 解题的关键&#xff1a; 问题一. 问题分析 问题解答 问题二. 问题分析 问题解答 问题三. 问题分析 问题解答 问题四. 问题分析 问题解答 问题五. 问题分析 问题解答

Python系列-字典

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” ​ 目录 ​ 字典是什么 创建字典 查找key 新增/修改元素 删除元素 遍历字典元素 取出所有的key和value 合成的key类型 ​编辑 小结 字典是什么 字典是一种存储键值对的结…

开箱即用的Linux系统

经常会遇到这样的场景&#xff0c;临时需要演示一下linux环境&#xff0c;安装虚拟机耗时耗资源&#xff0c;如果有一个开箱即用的linux&#xff0c;而且还能包括主流的linux环境就好了。instantbox 是一个这样的项目&#xff0c;几秒内启动一个主流的 Linux 系统&#xff0c;支…

船员投保的数学模型(MATLAB求解)

1.问题描述 劳动工伤事故&#xff0c;即我们平时所说的“工伤事故”&#xff0c;也称职业伤害&#xff0c;是指劳动者在生产岗位上&#xff0c;从事与生产劳动有关的工作中发生的人身伤害事故、急性中毒事故或职业病。船员劳动工伤事故是指船员在船舶生产岗位上&#xff0c;从…

第七讲_JavaScript的Iterator和Generator

JavaScript的Iterator和Generator 1. Iterator1.2 for-of语法糖 2. Generator2.1 定义一个生成器函数2.2 常用的方法2.3 基本用法2.4 传参的用法2.5 异步的用法 1. Iterator ES6 中&#xff0c;默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性。一个数据结构只要拥…

字节跳动新一代云原生消息队列实践

作者&#xff1a;火山引擎云原生计算研发工程师&#xff5c;雷丽媛 上文我们了解了在字节跳动内部业务快速增长的推动下&#xff0c;经典消息队列 Kafka 的劣势开始逐渐暴露&#xff0c;在弹性、规模、成本及运维方面都无法满足业务需求。因此字节消息队列团队研发了计算存储分…

RISC-V指令集之RV32I

RISC-V指令集之RV32I 1 RV32I的寄存器2 RV32I的指令2.1 算术运算指令2.2 逻辑运算指令2.3 移位运算指令2.4 内存读写指令2.5 分支与跳转指令 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 RV32I的寄存器 如下图&#xff0c;列出了RV32I 寄存器…

力扣hot100 数据流的中位数 大小根堆

Problem: 295. 数据流的中位数 文章目录 思路复杂度&#x1f496; Code 思路 &#x1f468;‍&#x1f3eb; 参考 大根堆维护较小值&#xff08;堆顶即中位数&#xff09;&#xff0c;小根堆维护较大值&#xff08;堆顶可能是中位数之一&#xff09;维护小堆长度较长&#x…

idea搭建spring5.3.x源码环境

1.写在前面的话 碰到了不少想阅读或者学习spring源码的同学&#xff0c;但是第一步搭建这个源码阅读环境就能难倒了一大批人。下面我就以spring5.3.x这个源码分支&#xff0c;来具体演示一下搭建过程。 2. 下载源码 下载源码这一步&#xff0c;说实话&#xff0c;由于某些原…

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址&#xff1a;https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本&#xff1a; [rootmaster1 kube-state-metrics]# ll 总用量 …

并查集(高阶数据结构)

目录 一、并查集的原理 二、并查集的实现 2.1 并查集的初始化 2.2 查找元素所在的集合 2.3 判断两个元素是否在同一个集合 2.4 合并两个元素所在的集合 2.5 获取并查集中集合的个数 2.6 并查集的路径压缩 2.7 元素的编号问题 三、并查集题目 3.1 省份的数量 3.2 等…

R-kknn包-类别插值可视化绘制

前面的推文我们介绍了使用scikit-learn结合分类散点数据&#xff0c;构建机器学习分类模型并将模型结果可视化展示&#xff0c;具体链接如下&#xff1a; 机器学习和可视化还能一起这样用&#xff1f;Python教你全搞定。今天这篇推文&#xff0c;我们就使用R语言的kknn包进行类…

【2023地理设计组一等奖】基于机器学习的地下水仿真与时空分析

作品介绍 1 设计思想 1.1 作品背景 华北平原是我国最重要的粮棉产地之一,然而近年来农业的低效用水以及过度压采正逐步加剧其地下水资源的紧张性,为经济可持续发展带来重大风险。而地下水动态变化与人为干预、全球气候波动呈现出高度相关性,因此,地下水的仿真模拟对保障粮…