zoukankan      html  css  js  c++  java
  • opencv 数据训练

    #include <io.h>
    #include <string>
    #include <iostream>
    #include <opencv2opencv.hpp>
    #include <opencv2ml.hpp>
    using namespace cv;
    using namespace ml;
    int main()
    {
        //=========读取图片创建训练数据======//
        //将所有图片大小统一转化为8*16
        const int imageRows = 8;
        const int imageCols = 16;
        //图片共有10类
        const int classSum = 10;
        //每类共50张图片
        const int imagesSum = 50;
        //每一行一个训练图片
        float trainingData[classSum*imagesSum][imageRows*imageCols] = { {0} };
        //训练样本标签
        float labels[classSum*imagesSum][classSum] = { {0} };
        Mat src, resizeImg, trainImg;
        for (int i = 0; i < classSum; i++)
        {
            //目标文件夹路径
            std::string inPath = "E:\学习资料\阿拉伯数字\";
            char temp[256];
            int k = 0;
            sprintf_s(temp, "%d", i);
            inPath = inPath + temp + "\*.png";
            //用于查找的句柄
    
            long handle;
            struct _finddata_t fileinfo;
            //第一次查找
            handle = _findfirst(inPath.c_str(), &fileinfo);
            if (handle == -1)
                return -1;
            do
            {
                //找到的文件的文件名
                std::string imgname = "E:/学习资料/阿拉伯数字/";
                imgname = imgname + temp + "/" + fileinfo.name;
                src = imread(imgname, 0);
                if (src.empty())
                {
                    std::cout << "can not load image 
    " << std::endl;
                    return -1;
                }
                //将所有图片大小统一转化为8*16
                resize(src, resizeImg, Size(imageRows, imageCols), (0, 0), (0, 0), INTER_AREA);
                threshold(resizeImg, trainImg, 0, 255, THRESH_OTSU);
                for (int j = 0; j < imageRows*imageCols; j++)
                {
                    trainingData[i*imagesSum + k][j] = (float)trainImg.data[j];
                }
                // 设置标签数据
                for (int j = 0; j < classSum; j++)
                {
                    if (j == i)
                        labels[i*imagesSum + k][j] = 1;
                    else
                        labels[i*imagesSum + k][j] = 0;
                }
                k++;
    
            } while (_findfirst(inPath.c_str(), &fileinfo) && k <imagesSum);
            Mat labelsMat(classSum*imagesSum, classSum, CV_32FC1, labels);
        }
        //训练样本数据及对应标签
        Mat trainingDataMat(classSum*imagesSum, imageRows*imageCols, CV_32FC1, trainingData);
        Mat labelsMat(classSum*imagesSum, classSum, CV_32FC1, labels);
        //std::cout<<"trainingDataMat: 
    "<<trainingDataMat<<"
    "<<std::endl;
        //std::cout<<"labelsMat: 
    "<<labelsMat<<"
    "<<std::endl;
        //==========================训练部分==============================//
        Ptr<ANN_MLP>model = ANN_MLP::create();
        Mat layerSizes = (Mat_<int>(1, 5) << imageRows * imageCols, 128, 128, 128, classSum);
        model->setLayerSizes(layerSizes);
        model->setTrainMethod(ANN_MLP::BACKPROP, 0.001, 0.1);
        model->setActivationFunction(ANN_MLP::SIGMOID_SYM, 1.0, 1.0);
        model->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER | TermCriteria::EPS, 10000, 0.0001));
    
        Ptr<TrainData> trainData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
        std::cout << "训练中请稍后..." << std::endl;
        model->train(trainData);
        std::cout << "训练结束,保存结果中..." << std::endl;
        //保存训练结果
        model->save("E:/学习资料/阿拉伯数字/1/MLPModel.xml");
    return 0;
    }
  • 相关阅读:
    js判断时间间隔
    redis 常用命令
    Spring 启动 自动调用方法的两种形式
    多线程的异常处理
    多线程Monitor.TryEnter(有一个聪明的员工找老板。看到老板们在里面都掐成一团乱麻了,算了我还是撩吧)
    多线程中多个join的执行过程
    多线程之向线程传递参数
    ASP.Net Core下的安全(授权、身份验证、ASP.NET Core Identity)
    C# 中常用的索引器(转)
    《戏班的故事》C#基础之多线程之“前台线程-后台线程”
  • 原文地址:https://www.cnblogs.com/hsy1941/p/11495500.html
Copyright © 2011-2022 走看看