[英]How to convert OpenCV image data from Python to C++?
如何将OpenCV 3映像从Python 3传递到C ++? 用技术术语来说,如何将NumPy数组转换为cv::Mat
对象并返回?
为了使我的问题更具体,让我们假设:
我有一个使用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
进行尝试。
我想使用某些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 ++代码:
OpenCV存储库上的文件cv2.cpp包含其API中未公开的功能:
bool pyopencv_to(PyObject* o, UMat& um, const char* name)
和
PyObject* pyopencv_from(const Mat& m)
。
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.