首页 > 其他分享 >基于opencv的特征值分类

基于opencv的特征值分类

时间:2024-07-29 15:29:11浏览次数:17  
标签:tmp 特征值 基于 Mat opencv train str images include

opencv可以很方便对图像求hog特征值,然后使用SVM进行分离,最终达到特定物体识别的功能。下面的示例

#include <opencv2/opencv.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"  
#include<opencv2/imgproc/imgproc.hpp>  
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp>  // OpenCV window I/O
#include <opencv2/imgproc/types_c.h>
#include <opencv2/core/utils/logger.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <iostream>  
#include <thread>
using namespace std;
using namespace cv;

void train()
{
    //定义加载正样本数据和负样本数据的文件路径
    string positive_path = "e:/media/src/msk/"; 
    string negative_path = "e:/media/src/ok/";
    //通过glob()将路径下的所有图像文件以string类型读取进来
    vector<string> positive_images_str, negative_images_str;
    glob(positive_path, positive_images_str);
    glob(negative_path, negative_images_str);


    HOGDescriptor* hog_train = new HOGDescriptor;
    vector<vector<float>> train_descriptors;
    vector<int> labels;
    for (int i = 0; i < positive_images_str.size(); i++)
    {
        Mat tmp = imread(positive_images_str[i]);
        resize(tmp, tmp, Size(64, 128));

        Mat gray;
        cvtColor(tmp, gray, COLOR_BGR2GRAY);            //计算HOG描述子时需要使用灰度图像
        vector<float> descriptor;
        hog_train->compute(gray, descriptor, Size(8, 8), Size(0, 0));
        train_descriptors.push_back(descriptor);
        labels.push_back(1);
    }
    for (int i = 0; i < negative_images_str.size(); i++)
    {
        Mat tmp = imread(negative_images_str[i]);
        resize(tmp, tmp, Size(64, 128));

        Mat gray;
        cvtColor(tmp, gray, COLOR_BGR2GRAY);            //计算HOG描述子时需要使用灰度图像
        vector<float> descriptor;
        hog_train->compute(gray, descriptor, Size(8, 8), Size(0, 0));
        train_descriptors.push_back(descriptor);
        labels.push_back(-1);
    }
    //将训练数据vector转换为Mat对象,每一行为一个描述子,行数即为样本数
    int width = train_descriptors[0].size();
    int height = train_descriptors.size();
    Mat train_data = Mat::zeros(Size(width, height), CV_32F);
    for (int r = 0; r < height; r++)
    {
        for (int c = 0; c < width; c++)
        {
            train_data.at<float>(r, c) = train_descriptors[r][c];
        }
    }
    //使用最优参数训练SVM分类器,并保存到与代码同目录下
    auto train_svm = ml::SVM::create();
    train_svm->trainAuto(train_data, ml::ROW_SAMPLE, labels);
    train_svm->save("model.xml");
    hog_train->~HOGDescriptor();
    train_svm->clear();
}
void demo()
{
    auto test_svm = ml::SVM::load("model.xml");
    Mat frame = imread("src.jpg");
    Mat dst;
    resize(frame, dst, Size(64, 128));//规范图像尺寸


    HOGDescriptor hog;
    vector<float> des;//HOG特征向量
    hog.compute(dst, des);//计算hog特征
    float result=test_svm->predict(des);//这里要么是1要么是-1 1表示训练中是正值
    printf("ret=%.1f\n", result);
}
int main()
{
    train();//这个进行训练,训练好就可以不调用了。
    demo();//加载模型 进行分类
    return 0;
}

 

标签:tmp,特征值,基于,Mat,opencv,train,str,images,include
From: https://www.cnblogs.com/yuandaozhe/p/18330184

相关文章

  • 【资料分享】基于TI Sitara系列AM3352/AM3354/AM3359核心板规格书
    1核心板简介创龙科技SOM-TL335x-S是一款基于TISitara系列AM3352/AM3354/AM3359ARMCortex-A8高性能低功耗处理器设计的低成本工业级核心板,通过邮票孔连接方式引出千兆网口、LCD、GPMC等接口。核心板经过专业的PCBLayout和高低温测试验证,稳定可靠,可满足各种工业应用环境。......
  • 毕业设计:基于Springboot的农产品预售平台【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SpringBoot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能商户管理:负责商户信息的注册、审核、编辑与注销,确保......
  • CompressGraph: 基于规则的高效并行图分析压缩方法
    背景随着数据爆炸式增长,图数据分析在社交网络、科学计算和数据挖掘等领域变得越来越重要。然而,处理大规模图数据面临着存储和计算资源的挑战。传统的图压缩方法可能会丢失重要信息,影响分析结果的准确性。CompressGraph框架旨在通过规则基压缩技术,在有效压缩图数据的同......
  • 基于 TI Sitara系列 AM64x核心板——程序自启动说明
    前言本文主要介绍AM64x的Cortex-A53、Cortex-M4F和Cortex-R5F核心程序自启动使用说明。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。本说明文档适用开发环境如下:Windows开发环境:Windows764bit、Windows1064bit虚拟机:VMware15.5.5Linux开发环境:Ubuntu18.04.4......
  • 医学成像控制卡:268-基于FMC接口的DSP TMS320C6657子卡模块
    基于FMC接口的DSPTMS320C6657子卡模块一、概述       FMC连接器是一种高速多pin的互连器件,广泛应用于板卡对接的设备中,特别是在xilinx公司的所有开发板中都使用。该DSP子卡模块以TI强大性能DSPTMS320C6657作为主芯片,专门针对xilinx开发板设计的标准板卡,用于关键任务,医......
  • 基于Android平台开发,仿头条新闻app新闻分类分类列表实现(四)
    1.项目涉及到的技术点列表控件RecyclerView的使用调用API获取网络数据Glide加载图片Handler的使用okhttp的使用2.代码实现过程在上集中,已经使用TabLayout+ViewPager2把新闻分类滑动实现了,这集具体实现新闻列表新闻布局fragment_tab_news.xml<?xmlversion="1.0"en......
  • 基于funasr+pyaudio实现电脑本地麦克风实时语音识别项目语音转文本python实现
    【框架地址】https://github.com/modelscope/FunASR【简单介绍】FunASR是一个功能全面的语音识别工具包,支持多种预训练模型的推理和微调,提供高精度和高效能的语音识别服务。结合PyAudio库,可以实现电脑本地麦克风实时语音识别项目。该项目首先通过PyAudio库捕获麦克风输入的......
  • 将基于系统时间的循环系统更改为简单的 time.sleep()
    所以我试图修改我见过的游戏代码......这只是一个较大代码的片段。不过我发现很有趣,这段代码使用OCR,它会截取屏幕截图并上传一般概述,以与Webhooks的使用不一致。我发现它使用的系统是通过读取我的系统(计算机)时间...我想将其更改为一种更简单的方法来创建一个循环来每“x”分钟......
  • 912、基于51单片机的温度控制(PID,模拟控制,除雾器)
    完整资料或代做滴滴我(有偿)目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能设计中镜片除雾器,当温度过低时启动镜片上的加热膜进行加热,从而实现对镜片上温度的控制,实现只能除雾;保持镜片温度为25度。二、proteus仿真三......
  • 911、基于51单片机的温度报警(上下限,LCD)
    完整资料或代做滴滴我(有偿)目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能温度报警系统1、实时显示当前温度2、对上下限进行设定,通过按键设置3、温度高于上限或低于下限显示屏有相应提示,蜂鸣器响二、proteus仿真三......