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!