【发布时间】:2018-12-06 04:13:27
【问题描述】:
如何将 OpenCV 3 图像从 Python 3 传递到 C++?用技术术语来说,如何将 NumPy 数组转换为 cv::Mat 对象并返回?
为了让我的问题更具体,我们假设:
-
我有一个 Python 程序,它使用 OpenCV 从网络摄像头捕获图像并显示它们。 (在现实生活中,我正在那里制作更多功能的原型,例如一些 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进行尝试。 -
我想使用处理 OpenCV 图像的某个 C++ 库中的现有
helloWorld函数。 (在现实生活中,它会进行一些信号处理并从图像中提取信息。)为了简单起见,我下面的示例函数只是水平镜像图像。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++ 源代码,因此我可以在必要时对其进行扩展和重新编译。
【问题讨论】:
-
见this link 加载共享库。
-
实际上,我发现我必须在我的 python setuptools 扩展中定义
libraries=['opencv_core', 'opencv_highgui'],以便 C++ 设法访问 OpenCV 函数。