我试图从通过网络摄像头获得的图像中获取一个名为 testdata 的单个浮动向量。一旦将图像转换为单个浮动向量,它就会传递给经过训练的神经网络。为了测试网络,我使用函数 float CvANN_MLP::predict (const Mat& 输入,Mat& 输出)。此功能需要格式如下的测试样本:-
输入向量的浮点矩阵,每行一个向量。
测试数据向量定义如下:-
// define testing data storage matrices
//NumberOfTestingSamples is 1 and AttributesPerSample is number of rows *number of columns
Mat testing_data = Mat(NumberOfTestingSamples, AttributesPerSample, CV_32FC1);
要以 CSV 格式存储图像的每一行,我执行以下操作:-
Formatted row0= format(Image.row(0),"CSV" ); //Get all rows to store in a single vector
Formatted row1= format(Image.row(1),"CSV" ); //Get all rows to store in a single vector
Formatted row2= format(Image.row(2),"CSV" ); //Get all rows to store in a single vector
Formatted row3= format(Image.row(3),"CSV" ); //Get all rows to store in a single vector
然后,我将存储在 row0 到 row3 中的所有格式化行输出到文本文件中,如下所示:-
store_in_file<<row0<<", "<<row1<<", "<<row2<<", "<<row3<<endl;
这会将整个 Mat 存储在一行中。
文本文件已关闭。我重新打开相同的文本文件以提取数据以存储到向量 testdata
// if we can't read the input file then return 0
FILE* Loadpixel = fopen( "txtFileValue.txt", "r" );
if(!Loadpixel) // file didn't open
{
cout<<"ERROR: cannot read file \n";
return 0; // all not OK;
}
for(int attribute = 0; attribute < AttributesPerSample; attribute++)
{
fscanf(Loadpixel, "%f,",&colour_value);//Reads a single attribute and stores it in colour_value
testdata.at<float>(0, attribute) = colour_value;
}
这有效,但是在一段时间后文件没有打开并显示错误消息:“错误:无法读取文件”。这种方法有很多限制,需要花费不必要的时间存储在文本文件中,然后重新打开和提取。将图像(Mat)存储到类似于的单个浮点向量中的最佳方法是testdata.at<float>(0, attribute)
什么?或者有没有一种简单的方法来确保文件总是打开,基本上是正确的问题?