opencv训练bp神经网络来识别数字的东西。但是程序发生异常

a152161157bn 2018-06-02 04:13:15
最近在看opencv训练bp神经网络来识别数字的东西。但是训练的时候遇到程序异常问题,不知道是什么原因,请大家帮忙看看。以下是我把训练部分单独拿出来的,方便代码查看。谢谢了


#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");
}

...全文
982 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-06-03
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧