我试图从通过网络摄像头获得的图像中获取一个名为testdata的浮动矢量。一旦图像转换为单个浮动矢量,它就会传递给训练有素的神经网络。为了测试网络我使用函数float CvANN_MLP :: predict(const Mat& input,Mat& outputs)。这个函数需要一个测试样本,格式如下: -
输入向量的浮点矩阵,每行一个向量。
testdata向量定义如下: -
// 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存储在一行中。
文本文件已关闭。我重新打开相同的文本文件以提取要存储到vector 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)
的单个浮点向量中的最佳方法是什么?或者有一种简单的方法可以确保文件始终打开,基本上问题是否正确?
答案 0 :(得分:0)
理智的解决方案当然是直接在内存中转换值。正如您所怀疑的那样,整个文件中间体是一个令人难以置信的kludge。
如果您使用标准C ++类型,例如std::vector
,我们可以提供实际代码。与您的代码等效的简单算法是一次迭代2D图像一个像素,并将每个像素的值附加到1D向量的背面。
然而,无论如何,这对于网络摄像头图像的神经网络处理来说是个坏主意。如果您的输入向下移动一个像素 - 完全可能 - 整个1D向量会发生变化。因此,建议先将输入标准化。这可能需要先翻译,缩放和旋转图像。
[编辑] 标准C ++示例:
std::vector<std::vector<int>> Image2D;
std::vector<float> Vector1D;
for (auto const& row : Image2D) {
for (auto pixel : row) {
Vector1D.push_back(pixel);
}
}