簡體   English   中英

如何通過C ++在openCV中使用CNN?

[英]How to use CNN in openCV via C++?

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函數創建Mat? 就像在python示例中一樣,我將float用於數據。 現在,我有了這段代碼,它給出了錯誤的結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM