Как использовать CNN в openCV через C ++? - PullRequest
0 голосов
/ 10 июля 2019

Здесь 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()

?

И как создать Mat для функции setInput для размера изображения: 60x162x1?Я использую 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);
}

1 Ответ

0 голосов
/ 12 июля 2019

В 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...