0

我试图从通过网络摄像头获得的图像中获取一个名为 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)什么?或者有没有一种简单的方法来确保文件总是打开,基本上是正确的问题?

4

1 回答 1

0

理智的解决方案当然是直接在内存中转换值。正如您所怀疑的,整个文件中间体是一个令人难以置信的组合。

如果您使用标准 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);
  }
}
于 2013-10-04T09:50:15.113 回答