编程语言
首页 > 编程语言> > python – 从NumPy数组到Mat(OpenCV)的C转换

python – 从NumPy数组到Mat(OpenCV)的C转换

作者:互联网

我正在围绕ArUco增强现实库(基于OpenCV)编写一个薄的包装器.我想要构建的接口非常简单:

> Python将图像传递给C代码;
> C代码检测标记并将其位置和其他信息作为dicts元组返回给Python.

但是,我无法弄清楚如何在Python中表示图像以将其传递给C.对于GUI和相机管理,我将使用PyQt,所以最初它将是QImage,但我不能简单地将它传递给OpenCV(或者我可以?).起初,我尝试使用嵌套元组来表示每个像素的行,列和颜色,所以我最终得到了这个示例代码:

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

结果是痛苦的慢(单帧几秒钟),所以我去google搜索并找到了应该更快的解决方案:使用NumPy数组,所以代码看起来像这样:

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

但是,我不知道如何将NumPy数组(在C级别只是一个Python对象)转换为OpenCV Mat.我很感激这里的任何帮助.

或者,也许真的不需要NumPy,所以我可以直接将QImage Python对象传递给C层?或者可能有不同的方法解决这个问题?任何建议表示赞赏!

解决方法:

您遇到的最佳解决方案是为cv :: Mat对象使用自定义boost :: python转换器. OpenCV有Python包装器,当你使用这个包装器时,你在Numpy数组上运行 – 你甚至不需要知道那些数组转换为cv :: Mat对象,而“穿过c< - > python border” .为简单类型编写这样的转换器非常容易,但是为cv :: Mat创建转换器并不简单.幸运的是其他人已经这样做了 – here是OpenCV 2.x版本,here版本是3.x.如果您不熟悉boost :: python转换器,this article应该可以帮到您.
希望它有所帮助,如果您有任何问题,请告诉我们.

标签:boost-python,python,c,numpy,opencv
来源: https://codeday.me/bug/20190927/1823978.html