c# - 在 OpenCV 中将图像转换为 CvMat 以训练神经网络

标签 c# opencv bitmap neural-network opencvsharp

我正在编写一个程序,它使用 OpenCv 神经网络模块以及 C# 和 OpenCvSharp 库。它必须识别用户的脸,所以为了训练网络,我需要一组样本。问题是如何将样本图像转换为适合训练的数组。我得到的是 200x200 位图图像,以及具有 40000 个输入神经元、200 个隐藏神经元和一个输出的网络:

        CvMat layerSizes = Cv.CreateMat(3, 1, MatrixType.S32C1);
        layerSizes[0, 0] = 40000;
        layerSizes[1, 0] = 200;
        layerSizes[2, 0] = 1;
        Network = new CvANN_MLP(layerSizes,MLPActivationFunc.SigmoidSym,0.6,1);

那么我正在尝试将 BitMap 图像转换为 CvMat 数组:
private void getTrainingMat(int cell_count, CvMat trainMAt, CvMat responses)
    {
        CvMat res = Cv.CreateMat(cell_count, 10, MatrixType.F32C1);//10 is a number of samples
        responses = Cv.CreateMat(10, 1, MatrixType.F32C1);//array of supposed outputs
        int counter = 0;
        foreach (Bitmap b in trainSet)
        {
            IplImage img = BitmapConverter.ToIplImage(b);
            Mat imgMat = new Mat(img);
            for (int i=0;i<imgMat.Height;i++)
            {
                for (int j = 0; j < imgMat.Width; j++)
                {
                    int val =imgMat.Get<int>(i, j);
                    res[counter, 0] = imgMat.Get<int>(i, j);
                }
                responses[i, 0] = 1;
            }
            trainMAt = res;
        }
    }

然后,在尝试训练它时,我遇到了这个异常(exception):

输入训练数据应该是一个浮点矩阵,其行数等于训练样本数,列数等于第 0(输入)层的大小

培训代码:
        trainMAt = Cv.CreateMat(inp_layer_size, 10, MatrixType.F32C1);
        responses = Cv.CreateMat(inp_layer_size, 1, MatrixType.F32C1);
        getTrainingMat(inp_layer_size, trainMAt, responses);
        Network.Train(trainMAt, responses, new CvMat(),null, Parameters);

我是 OpenCV 的新手,我认为由于缺乏对 CvMat 结构的理解,我在转换时做错了。我的错误在哪里,还有其他转换位图的方法吗?

最佳答案

With the number of rows equal to the number of training samples



那是10个样本。

and the number of columns equal to the size of 0-th (input) layer



那是 inp_layer_size。
trainMAt = Cv.CreateMat(10, inp_layer_size, MatrixType.F32C1);
responses = Cv.CreateMat(10, 1, MatrixType.F32C1); // 10 labels for 10 samples

我主要做 C++,如果我有误解,请原谅我,但你的像素循环需要另外调整。

当您分配给 val 时,您的内部循环看起来已损坏,但永远不要使用它,也永远不要增加你的计数器。

此外,在您的外部循环中分配 trainMAt = res;对于每张图片似乎都不是一个好主意。

我相信你会让它正确运行,只要记住目标是将每个图像扁平化为一行,所以你最终得到 10 行和 inp_layer_size。列。

关于c# - 在 OpenCV 中将图像转换为 CvMat 以训练神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23661754/

相关文章:

visual-studio-2010 - OpenCV 和 VS2010 : Fatal error LNK1104: atal error LNK1104: cannot open file 'tbb_debug. 库

c# - 位图文件大小与字节 [] 大小

android - 如何生成重定向到 URL 的二维码?

c# - 通用数据链接 - 无法打开文件。确保它是一个有效的数据链接文件

c# - DropDownList 中的 ASP.NET 2 DataValuefield

c# - DataBindingComplete 上 DataGridView 中的单元格格式

c++ - 颜色转移 : What's wrong with my code in OpenCV C++

c++ - 通过 D2XX 库或 OPENCV 捕获相机(USB)

c# - C#中的异步图像处理

c# - 功能区按钮的 `onAction` 设计模式