64,654
社区成员
发帖
与我相关
我的任务
分享
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ml/ml.hpp>
#include <opencv2/video/background_segm.hpp>
#include<iostream>
#include<string.h>
#include<math.h>
#include<fstream>
using namespace cv;
using namespace std;
Mat projectHistogram(const Mat& img, int t) //水平或垂直直方图,0为按列统计
{ //1为按行统计
int sz = (t) ? img.rows : img.cols;
Mat mhist = Mat::zeros(1, sz, CV_32F);
for (int j = 0; j < sz; j++)
{
Mat data = (t) ? img.row(j) : img.col(j);
mhist.at<float>(j) = countNonZero(data);
}
double min, max;
minMaxLoc(mhist, &min, &max);
if (max > 0)
mhist.convertTo(mhist, -1, 1.0f / max, 0);
return mhist;
}
void features(const Mat & in, Mat & out)
{
Mat vhist = projectHistogram(in, 1); //水平直方图
Mat hhist = projectHistogram(in, 0); //垂直直方图
int numCols = vhist.cols + hhist.cols + in.rows * in.cols;
out = Mat::zeros(1, numCols, CV_32F);
int j = 0;
for (int i = 0; i<vhist.cols; ++i)
{
out.at<float>(j) = vhist.at<float>(i);
j++;
}
for (int i = 0; i < hhist.cols; ++i)
{
out.at<float>(j) = hhist.at<float>(i);
}
for (int x = 0; x<in.rows; ++x)
{
for (int y = 0; y < in.cols; ++y)
{
out.at<float>(j) = (float)in.at<unsigned char>(x, y);
j++;
}
}
}
int main(){
CvANN_MLP bp2;//创建神经网络
//int x1,x2,x3;
Mat layerSizes2 = (Mat_<int>(1, 3) << 560, 132, 31);//一个3层的神经网络,其中第一层结点数为x1,第二层结点数为x2,第三层结点数为x3
bp2.create(layerSizes2, CvANN_MLP::SIGMOID_SYM);//构造函数创建
CvANN_MLP_TrainParams params2;//神经网络训练参数
//终止条件,迭代次数和误差最小值,一旦有一个达到条件就终止训练。
params2.term_crit = cvTermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS, 10000, 0.001);//参数为终止条件类型和最大迭代次数和准确性。
params2.train_method = CvANN_MLP_TrainParams::BACKPROP; //设置反向传播算法
params2.bp_dw_scale = 0.07;//权值更新率
params2.bp_moment_scale = 0.07;//权值更新冲量
////////////////////////////////////自己更改数据集实验(以下)、、文字识别/////////////////////////////////////////
//神经网络的训练
Mat inputs2(1195, 560, CV_32FC1, Scalar(0));//1100行,560列。构建后用Scalar为其赋初值。
//初始化输入样本
ifstream file1("word.txt");
int imgindex2 = 0;
for (; imgindex2<1195; imgindex2++) //表示文件流的结尾
{
char txt_cont2[1195];//指针
file1.getline(txt_cont2, 1195); //从file1中读取最多1100个字符串存放于txt_cont2中。
char imgfile2[1195];
sprintf(imgfile2, "word/%s", txt_cont2); //连接字符串
Mat src2 = imread(imgfile2);//注意读取的图片被视为是真彩色图像
cvtColor(src2, src2, CV_BGR2GRAY);
resize(src2, src2, Size(32, 16));
threshold(src2, src2, 0, 255, CV_THRESH_OTSU + CV_THRESH_BINARY);
Mat charfeature2(1, 560, CV_32FC1, Scalar(0));
features(src2, charfeature2);
//Mat src1=src.reshape(0,1);
for (int i = 0; i<560; i++)
{
inputs2.at<float>(imgindex2, i) = charfeature2.at<float>(0, i);
}
}
//初始化输出样本
Mat outputs2(1195, 31, CV_32FC1, Scalar(0));
CvMLData mlData2;
mlData2.read_csv("wenzi.csv");//读取csv文件
outputs2 = Mat(mlData2.get_values(), true);
//训练函数的接口,输入矩阵, 预期输出矩阵,训练参数
bp2.train(inputs2, outputs2, Mat(), Mat(), params2);
bp2.save("mlp222222222222222.xml");
}