Conversão C ++ da matriz NumPy para Mat (OpenCV)

Estou escrevendo um invólucro fino em torno da biblioteca de realidade aumentada da ArUco (que é baseada no OpenCV). Uma interface que estou tentando criar é muito simples:

Python passa a imagem para o código C ++;O código C ++ detecta marcadores e retorna seus locais e outras informações ao Python como tupla de ditados.

No entanto, não consegui descobrir como representar uma imagem no Python para passá-la ao C ++. Para gerenciamento de GUI e câmera, vou usar o PyQt, então inicialmente será o QImage, mas não posso simplesmente passá-lo para o OpenCV (ou posso?). No começo, tentei usar tuplas aninhadas para representar linha, coluna e cor de cada pixel, então acabei com este código de exemplo:

using namespace cv;
namespace py = boost::python;

void display(py::tuple pix)
{
    /*
        Receive image from Python and display it.
    */
    Mat img(py::len(pix), py::len(pix[0]), CV_8UC3, Scalar(0, 0, 255));
    for (int y = 0; y < py::len(pix); y++)
        for (int x = 0; x < py::len(pix[y]); x++)
        {
            Vec3b rgb;
            for (int i = 0; i < 3; i++)
                rgb[i] = py::extract<int>(pix[y][x][i]);
            img.at<Vec3b>(Point(x, y)) = rgb;
        }
    imshow("Image", img);
    waitKey(0);
}

BOOST_PYTHON_MODULE(aruco)
{
    py::def("display", display);
}

Acabou sendo dolorosamente lento (alguns segundos para um único quadro), então pesquisei no Google e encontrei uma solução que deveria ser muito mais rápida: use matrizes NumPy, para que o código fique assim:

void display(py::object array)
{
    Mat img;
    // ... some magic here to convert NumPy array to Mat ...
    imshow("Image", img);
    waitKey(0);
}

No entanto, não tenho idéia de como converter NumPy Array (que no nível C ++ é apenas um objeto Python) para OpenCV Mat. Eu apreciaria qualquer ajuda aqui.

Como alternativa, talvez o NumPy não seja realmente necessário, então eu poderia passar o objeto QImage Python diretamente para a camada C ++? Ou talvez haja uma abordagem diferente para esse problema? Qualquer conselho é apreciado!

questionAnswers(2)

yourAnswerToTheQuestion