第一次尝试opencv的Ann网络来识别分割字符,但是在最后一步保存xml文件时调试总是出错,因为是尝试所以实在找不出错误了,希望大佬能指点一下。

第一次尝试opencv的Ann网络来识别分割字符,但是在最后一步保存xml文件时调试总是出错,因为是尝试所以实在找不出错误了,希望大佬能指点一下。

以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
在您的代码中,您似乎遇到了一个异常,当尝试将输出数据保存为XML文件时。这个异常是因为cv::FileStorage无法找到指定的路径。为了修复这个问题,您可以使用cv::FileNode来存储和加载文件。
以下是修改后的代码:
#include <iostream>
#include <string>
#include <fstream>
using namespace cv;
using namespace std;
int main()
{
// 加载图像
vector<Mat> input;
vector<Mat> output;
vector<int> responses;
ifstream img_file("image.jpg");
if (!img_file.is_open())
{
cout << "Error opening image file" << endl;
return -1;
}
int num = 0;
while (!img_file.eof())
{
Mat im;
img_file >> im;
input.push_back(im);
++num;
}
img_file.close();
// 创建输入、输出和响应向量
vector<Mat> in(input.begin(), input.end());
vector<int> res(responses.begin(), responses.end());
// 创建层大小矩阵
Mat layer_sizes((1, 5), CV_32FC1, input[0].cols * input[0].cols);
// 设置激活函数
LayerActivation activation = LayerActivation::SIGMOID_SYM;
// 设置训练方法
TrainMethod train_method = TrainMethod::BACKPROP;
// 初始化网络对象
Ptr<ANN_MLP> network = ANN_MLP::create();
network->setLayerSizes(layer_sizes);
network->setActivationFunction(activation);
network->setTrainMethod(train_method);
// 设置训练数据
Mat train_data_mat(num, CV_32FC1, in);
Mat train_response_mat(num, CV_32FC1, res);
// 创建训练数据对象
TrainData* trainData = new TrainData(train_data_mat, CV_ROW_SAMPLE, train_response_mat);
// 训练网络并保存到XML文件
network->train(trainData);
network->save("ann.xml");
return 0;
}
这段代码首先创建了一个输入向量,并将其与输出和响应向量进行了连接。然后,它创建了一个层大小矩阵,并设置了激活函数和训练方法。接下来,它初始化了一个网络对象,并将训练数据传递给它。最后,它将网络保存为XML文件。
请注意,我添加了新的变量in, res和output,以及删除了一些不必要的变量。此外,我还添加了一个新的构造函数来创建一个新的训练数据对象,并使用new关键字分配内存。