【问题标题】:How to use CNN in openCV via C++?如何通过 C++ 在 openCV 中使用 CNN?
【发布时间】:2019-11-20 10:49:51
【问题描述】:

这里https://stackoverflow.com/a/49817506/1277317 有一个如何在 OpenCV 中使用卷积网络的示例。但是这个例子是用 Python 编写的。 如何在 C++ 中做同样的事情? 即,如何在 C++ 中做到这一点:

net = cv.dnn.readNetFromTensorflow('model.pb')
net.setInput(inp.transpose(0, 3, 1, 2))
cv_out = net.forward()

?

以及如何为 setInput 函数创建图像大小为 60x162x1 的 Mat?我使用 float 作为数据,就像在 python 示例中一样。 现在我有了这段代码,它给出了不正确的结果:

Net net = readNet("e://xor.pb");

float x0[60][162];

for(int i=0;i<60;i++)
{
    for(int j=0;j<162;j++)
    {
        x0[i][j]=0;
    }
}
x0[5][59]=0.5;
x0[5][60]=1;
x0[5][61]=1;
x0[5][62]=0.5;

Mat aaa = cv::Mat(60,162, CV_32F, x0);

Mat inputBlob = dnn::blobFromImage(aaa, 1.0, Size(60,162));

net.setInput(inputBlob , "conv2d_input");

Mat prob = net.forward("activation_2/Softmax");

for(int i=0;i<prob.cols;i++)
{
    qDebug()<<i<<prob.at<float>(0,i);
}

【问题讨论】:

    标签: c++ opencv neural-network


    【解决方案1】:

    在 openCV 中,几乎所有函数都设计用于 3D 矩阵。所以我使用 CV_32F 4D 矩阵的最简单方法是直接使用它们。以下代码可以正确快速地运行:

    Net net = readNet("e://xor.pb");
    
    const int sizes[] = {1,1,60,162};
    Mat tenz = Mat::zeros(4, sizes, CV_32F);
    
    
    float* dataB=(float*)tenz.data;
    
    int x=1;
    int y=2;
    dataB[y*tenz.size[2]+x]=0.5f;
    
    x=1;
    y=3;
    dataB[y*tenz.size[2]+x]=1.0f;
    
    
    try
    {
        net.setInput(tenz , "input_layer_my_input_1");
    
        Mat prob = net.forward("output_layer_my/MatMul");
    }
    catch( cv::Exception& e )
    {
        const char* err_msg = e.what();
        qDebug()<<"err_msg"<<err_msg;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多