C ++ Konvertierung von NumPy Array nach Mat (OpenCV)

Ich schreibe einen dünnen Wrapper um die ArUco Augmented Reality-Bibliothek (die auf OpenCV basiert). Eine Schnittstelle, die ich zu erstellen versuche, ist sehr einfach:

Python übergibt das Bild an C ++ - Code. C ++ - Code erkennt Markierungen und gibt ihre Positionen und andere Informationen als Tupel von Dikten an Python zurück.

Ich konnte jedoch nicht herausfinden, wie ein Bild in Python dargestellt wird, um es an C ++ zu übergeben. Für das GUI- und Kameramanagement werde ich PyQt verwenden, anfangs also QImage, aber ich kann es nicht einfach an OpenCV weitergeben (oder?). Zuerst habe ich versucht, verschachtelte Tupel zu verwenden, um die Zeilen, Spalten und Farben der einzelnen Pixel darzustellen. Am Ende habe ich diesen Beispielcode erhalten:

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

Es stellte sich heraus, dass es schmerzhaft langsam war (ein paar Sekunden für ein einzelnes Bild), also googelte ich und fand eine Lösung, die viel schneller sein sollte: Verwenden Sie NumPy-Arrays, damit der Code ungefähr so aussieht:

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

Ich habe jedoch keine Ahnung, wie ich NumPy Array (das in C ++ nur ein Python-Objekt ist) in OpenCV Mat konvertieren soll. Ich würde mich über jede Hilfe hier freuen.

Alternativ wird NumPy möglicherweise nicht wirklich benötigt, sodass ich das QImage-Python-Objekt einfach direkt an die C ++ - Ebene übergeben kann. Oder gibt es einen anderen Ansatz für dieses Problem? Jeder Rat ist willkommen!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage