当前位置: 首页 > 面试题库 >

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

金泉
2023-03-14
问题内容

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

  • Python将图像传递给C ++代码;
  • C ++代码检测标记并将标记的位置和其他信息作为字典元组返回给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);
}

事实证明,它非常慢(一个帧只有几秒钟),所以我进行了谷歌搜索,发现应该更快的解决方案:使用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数组进行操作-您甚至不需要知道在“跨越c ++ <->
python边界”时将这些数组转换为cv :: Mat对象。为简单类型编写此类转换器非常容易,但是为cv ::
Mat创建转换器并不容易。幸运的是,其他人已经做到了-这是OpenCV
2.x的版本,这里是3.x的版本。如果您不熟悉boost
:: python转换器,那么本文将为您提供帮助。
希望对您有所帮助,如果您有任何问题,请告诉我们。



 类似资料:
  • 问题内容: 我正在尝试将代表黑白图像的2D Numpy数组转换为3通道OpenCV数组(即RGB图像)。 基于代码示例和文档,我正尝试通过Python执行此操作,例如: 但是,对CvtColor()的调用将引发以下cpp级异常: 我究竟做错了什么? 问题答案: 您的代码可以固定如下: 简短说明: 数据类型不受OpenCV的支持(它支持,,,,,,) 无法处理numpy数组,因此必须将两个参数都转换

  • 注意:在转换之后,我不再打算使用OpenCV中的12bit值,然后我需要提取原始值,并将它们发送到另一个单独的进程。

  • 问题内容: 注意: 这要求与通常的元组到数组的转换相反。 我必须将一个参数传递给(包装的c ++)函数作为嵌套元组。例如,以下作品 而以下 不 不幸的是,我想使用的参数是一个numpy数组。对于某些N,该阵列的尺寸始终为2xN,这可能会很大。 有没有简单的方法可以将其转换为元组?我知道我可以循环遍历,创建一个新的元组,但是如果numpy数组提供了一些不错的访问权限,我会更喜欢。 如果不可能如我所愿

  • 问题内容: 给定一个NumPy数组,如何将其转换为 原位 ?所以基本上,我想做 而不复制阵列。好大 这样做的原因是我有两种算法来计算。其中一个返回一个数组,另一个返回一个数组(这是两种不同算法所固有的)。所有进一步的计算都假定是的数组。 目前,我在通过调用的C函数中进行了转换。有没有办法在Python中做到这一点? 问题答案: 您可以使用其他dtype创建视图,然后就地复制到视图中: 产量 要显示

  • 问题内容: 我有一个标准化的浮点数数组(即数组中最大的数字是1),我想将其用作图形的颜色索引。在使用matplotlib使用灰度时,这需要使用0到1之间的字符串,因此我想将float数组转换为字符串数组。我试图通过使用“ astype(’str’)”来执行此操作,但这似乎会创建一些与原始值不相同(甚至接近)的值。 我注意到这一点是因为matplotlib抱怨在数组中找到数字8,这很奇怪,因为它被标

  • 我正在使用一个从csv文件中获取值的包。如果我打印出结果,我会得到。我检查了类型,它是