繁体   English   中英

如何将OpenCV图像数据从Python转换为C ++?

[英]How to convert OpenCV image data from Python to C++?

如何将OpenCV 3映像从Python 3传递到C ++? 用技术术语来说,如何将NumPy数组转换为cv::Mat对象并返回?

为了使我的问题更具体,让我们假设:

  1. 我有一个使用OpenCV从网络摄像头捕获图像并显示它们的Python程序。 (在现实生活中,我正在为其中的其他功能制作原型,例如某些Web服务器功能。)

    cam.py

     import cv2 def main(): cam = cv2.VideoCapture(0) while True: _, img = cam.read() cv2.imshow('cam', img) # TODO: Call the C++ function from the sample below # img = helloWorld(img) cv2.waitKey(16) # let imshow do its work (16 ms -> 60 FPS) cv2.destroyAllWindows() if __name__ == '__main__': main() 

    运行python3 cam.py进行尝试。

  2. 我想使用某些C ++库中的现有helloWorld函数来处理OpenCV图像。 (在现实生活中,它会进行一些信号处理并从图像中提取信息。)为简单起见,我下面的示例函数只是水平镜像图像。 main功能是检查helloWorld按预期工作。

    cam.cpp

     #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; void helloWorld(Mat img) { flip(img, img, 1); } int main() { VideoCapture stream1(0); while (true) { Mat img; stream1.read(img); helloWorld(img); imshow("cam", img); waitKey(16); } return 0; } 

    要编译此代码,请运行g++ -std=c++11 -lopencv_core -lopencv_highgui -lopencv_videoio cam.cpp -o cam ,然后执行./cam进行尝试。

现在,我应该对代码进行哪些更改,以便可以从Python应用程序中调用helloWorld C ++函数? 幸运的是,我可以访问C ++源代码,因此可以在需要时进行扩展和重新编译。

在这里,您必须进行进程间通信,因为您有同时运行的python进程和c ++进程,因此,要实现所需的功能,而不是在C ++程序中调用函数,只需从放置该文件的共享内存页面文件中读取即可mat.data(),然后在C ++程序中检索它,只需确保在尝试访问共享存储区之前已创建它。

如果您确实想调用c ++函数,则可能必须考虑将C ++源函数/代码编译为dll,在运行时在python中加载该dll,然后再调用该函数。

有关创建允许您从Python调用C代码的模块的入门,请参阅Artanis的要旨Python C扩展Hello World

为了在Python 3 NumPy数组和C ++ Mat之间进行转换,至少有2个地方可以找到示例C ++代码:

  1. OpenCV存储库上的文件cv2.cpp包含其API中未公开的功能:

    • bool pyopencv_to(PyObject* o, UMat& um, const char* name)

    • PyObject* pyopencv_from(const Mat& m)

  2. pyboostcvconverter提供类似的独立转换器功能

    • PyObject* fromMatToNDArray(const Mat& m)
    • Mat fromNDArrayToMat(PyObject* o)

在调用其中任何一个之前,请确保一次调用NumPy函数import_array()以避免运行时出现Segmentation Fault: 11

我将所有内容汇总到GitHub上代码示例中 Python从相机获取图像,将其传递给C ++模块,然后C ++镜像该图像并将其传递回Python,最后Python显示该图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM