OpenCV神经网络进行分类


openCV提供了多种机器学习算法如SVM,adaboost,decision tree等,今天研究了一下神经网络,

写了一个简单的例子,以备忘。


问题描述:现有平面上100个随机点,如下图,以红色和蓝色标记为两类,现根据这些点训练一个BP神经网络分类器,将平面上的点分类。

OpenCV神经网络进行分类_第1张图片

代码如下:

	//从文件载入数据
	ifstream fid("E:\\code\\SmokeDetector\\data.dat",ios::binary);
	float* data = new float[200];
	fid.read((char*)data,sizeof(float)*200);
	Mat trainData(100,2,CV_32FC1,data);
	fid.close();
	//dispMat(trainData);

	ifstream fid2("E:\\code\\SmokeDetector\\label.dat",ios::binary);
	float* label = new float[100];
	fid2.read((char*)label,sizeof(float)*100);
	Mat trainLabel(100,1,CV_32FC1,label);
	fid2.close();
	//dispMat(trainLabel);

	CvANN_MLP bp;
	CvANN_MLP_TrainParams param;
	param.term_crit = cvTermCriteria(CV_TERMCRIT_ITER,10000,0.001);  //设置结束条件
	param.train_method = CvANN_MLP_TrainParams::BACKPROP;		//训练方法采用BackProgation
	param.bp_dw_scale=0.1;
	param.bp_moment_scale=0.1;

	//设置为3层神经网络,1个隐藏层(8个触发节点)
	int layers[3] = {2,8,1}; 
	Mat_<int> layerSize(1,3);
	memcpy(layerSize.data,layers,sizeof(int)*3);


	bp.create(layerSize,CvANN_MLP::SIGMOID_SYM);
	bp.train(trainData,trainLabel,Mat(),Mat(),param);
	bp.save("bpModel.xml"); //save classifier


	Mat testImg(256,256,CV_8UC3);
	Mat sample(1,2,CV_32FC1);
	Mat res;
	Vec3b red(0,0,255),blue(255,0,0);

	for(int i=0;i<testImg.rows;i++)
	{
		for(int j=0;j<testImg.cols;j++)
		{
			
			sample.at<float>(0,0) = i/float(testImg.rows);
			sample.at<float>(0,1) = j/float(testImg.cols);
			bp.predict(sample,res);
			float tmp = ((float*)res.data)[0];;
			if(tmp<0)
				testImg.at<Vec3b>(i,j) = red;
			else
				testImg.at<Vec3b>(i,j) = blue;
		}
	}
	imshow("result",testImg);
	imwrite("result.jpg",testImg);
	cvWaitKey(0);


结果如下:

OpenCV神经网络进行分类_第2张图片

包含头:

#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
using namespace cv;



你可能感兴趣的:(机器学习,opencv,神经网络,CvANN_MLP)