ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-09-27 15:55:39  阅读:2674  来源: 互联网

标签:boost-python python c numpy opencv


我正在围绕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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有