opencv 数据训练

#include <io.h>
#include <string>
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\ml.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 \n" << 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: \n"<<trainingDataMat<<"\n"<<std::endl;
    //std::cout<<"labelsMat: \n"<<labelsMat<<"\n"<<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;
}

 

转载于:https://www.cnblogs.com/hsy1941/p/11495500.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值