如何通过C++在openCV中使用CNN

How to use CNN in openCV via C++?

本文关键字:CNN openCV 何通过 C++      更新时间:2023-10-16

这里 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()

以及如何为图像尺寸:60x162x1 的 setInput 函数创建垫子?我对数据使用 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);
}

在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;
}