如何将 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