如何将 cv::mat 对象从 python 模块传递给 c++ 函数并返回返回的 cv::mat 类型的对象?

Posted

技术标签:

【中文标题】如何将 cv::mat 对象从 python 模块传递给 c++ 函数并返回返回的 cv::mat 类型的对象?【英文标题】:How to pass cv::mat objects from a python module to a c++ function and give back returned object which is type cv::mat? 【发布时间】:2019-09-11 12:27:06 【问题描述】:

我尝试使用 Django 启动一个项目,其中一部分是关于显示一些图像。 您可能知道,c++ 比 python 快得多。所以我写了一个 c++ 函数,它接收两个 Mat 类型的输入并对它们进行一些预处理,最后返回一个 cv::mat 变量作为它的输出。

我想在我的 python 模块中调用这个函数并从我的 python 代码发送两个图像作为输入参数,并在我的 django 项目中显示 c++ 函数的结果。

我尝试使用 ctypes.CDLL 调用我的 c++ 函数,ctypes 可以使用简单的函数,但是对于此 c++ 代码会出现内存错误。

这是我的 c++ 函数:

extern "C" Mat watermark2(Mat source_img, Mat logo)

        // Simple watermark

        double alpha = 0.5;

        int width = logo.size().width;
        int height = logo.size().height;
        int x_pos = rand() % (source_img.size().width - width);
        int y_pos = rand() % (source_img.size().height - height);

        cv::Rect pos = cv::Rect(x_pos, y_pos, width, height);
        addWeighted(source_img(pos), alpha, logo, 1 - alpha, 0.0, source_img(pos));

        return source_img;

如您所见,这是一个简单的函数,不会占用大量内存。我测试了一些非常小的图片,我看到了同样的错误。

我在网上搜索了很多,发现了一些关于为 Python 包装 C/C++ 的说明。但我不确定它是否能帮助我。

因为我是 Django 的新手,谁能帮我从我的 python 代码中协商,我有两个图像,我的 c++ 函数对图像进行一些操作并将返回的输出保存在我的 Django 中?

【问题讨论】:

您可能需要包含一些 OpenCV Python 绑定的基础结构。您是否查看了该代码以了解其工作原理? @crisluengo 看看哪个代码? github.com/opencv/opencv/tree/master/modules/python/src2 这可能会对你有所帮助 -> 1, 2。恕我直言,您不会看到 C++ 和 Python 之间的函数有太大的性能差异,因为 OpenCV 曾使用 C 在后端优化其 python 函数。 @vencat 但我测试了 watermark c++ 函数与 python c++ 函数。他们有很大的不同。 c++ 函数需要 0.6 秒,但 python 代码需要将近 14 纳秒。 【参考方案1】:

也许可以考虑使用 Boost-Python 库来连接 Python 和 C++。

【讨论】:

以上是关于如何将 cv::mat 对象从 python 模块传递给 c++ 函数并返回返回的 cv::mat 类型的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 cv::Mat 类型从 CV_16UC1 转换为 CV_8UC1

如何从函数返回多维 Mat 数组

如何根据公差更改 cv :: Mat 值

如何将 cv::mat 标头和数据部分转换为单个 qbytearray?

opencv 将数据从 *Mat 复制到 Mat

如何从字节数组初始化 RGBA cv::Mat?