【问题标题】:Call a C++ function from Python and convert a OpenCV Mat to a Numpy array从 Python 调用 C++ 函数并将 OpenCV Mat 转换为 Numpy 数组
【发布时间】:2016-12-30 19:59:54
【问题描述】:

背景情况

我正在尝试通过 Python 绑定使用 OpenCV Stitching 模块,但出现错误:

import cv2
stitcher = cv2.createStitcher(False)

imageL = cv2.imread("imageL.jpg")
imageC = cv2.imread("imageC.jpg")
imageR = cv2.imread("imageR.jpg")

stitcher.stitch((imageL, imageC))

错误:/home/user/OpenCV3.1.0/opencv/modules/python/src2/cv2.cpp:163:错误:(-215)数据通常应该为NULL!在函数中分配

遭受这种痛苦的类似人:

手头的问题

所以我决定使用官方的 C++ OpenCV 拼接示例,并使用 Python 使用 Boost.Python 调用它。但是,我仍然无法弄清楚如何正确使用 Boost.Python + numpy-opencv-converter 来处理 C++ Mat vs Numpy 数组转换。

¿如何调用 numpy-opencv-converter? 我只有 Boost.Python,在运行我的 python 函数来调用 C++ 文件时,我得到了这个(预期)结果:

$ python python_caller.py 
Traceback (most recent call last):
  File "python_caller.py", line 10, in <module>
    visualize(A)
Boost.Python.ArgumentError: Python argument types in
    testing.visualize(numpy.ndarray)
did not match C++ signature:
    visualize(cv::Mat)

谢谢。

PD:我在 Ubuntu 14.04、Python 2.7.4 中使用从源代码编译的 OpenCV 3.1.0 并在 virtualenv 中。


这些是我正在使用的文件。

testing.cpp:

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <boost/python.hpp>

using namespace cv;

int main(){}

Mat visualize(const cv::Mat input_image)
{
    cv::Mat image;
    image = input_image;

    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);
    waitKey(0);

    return image;
}

using namespace boost::python;
BOOST_PYTHON_MODULE(testing) // file name
{   
    def("visualize", visualize); //function name
}

python_caller.py:

import cv2
import numpy as np
from testing import visualize

A = cv2.imread("imageL.jpg")

visualize(A)

生成文件:

CFLAGS=`pkg-config --cflags opencv`

LDFLAGS=`pkg-config --libs opencv`

testing.so: testing.o
    g++ -shared -Wl,--export-dynamic -o testing.so testing.o -L/usr/lib -lboost_python -L/usr/lib/python2.7/config -lpython2.7 -L/usr/lib/x86_64-linux-gnu/ -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab 

testing.o: testing.cpp
    g++ -I/usr/include/python2.7 -I/usr/include -fPIC -c testing.cpp

【问题讨论】:

    标签: python c++ opencv numpy boost


    【解决方案1】:

    您需要转换 Python NDArray C++ cv::Mat。我可以推荐这个GitHub Repo。它包含一个应该适合您需求的示例。我在带有 Python 2.7/3.4 和 OpenCV 3.1 的 Ubuntu 15.10 上使用转换器。

    【讨论】:

    • 让我知道是否可以帮助您编写代码 sn-ps、示例或类似的东西,但我认为 github 上的示例非常好(我刚刚克隆了它并替换了方法)
    • 我在 python_module.cpp 文件中添加了一个简单的函数,还包含 opencv 文件并在 boost.python 位置定义函数。但我收到一个错误“ImportError: ./pbcvt.so: undefined symbol: _ZN2cv11namedWindowERKNS_6StringEi”
    • 这是我的功能:cv::Mat visualize(cv::Mat input_image){ cv::Mat image; image = input_image; cv::namedWindow("Display Image", cv::WINDOW_AUTOSIZE ); cv::imshow("Display Image", image); cv::waitKey(0); return image; }
    • 嗯,明天我会尝试重现您的错误。如果您先尝试更简单的方法,例如cv::Mat test(cv::Mat p_image) { return p_image/2 },会发生什么?
    • 可能是您必须编辑第 27 行中的 CMakeLists.txt find_package(OpenCV COMPONENTS core REQUIRED) 并添加更多组件,例如 find_package(OpenCV COMPONENTS core imgproc highgui REQUIRED)
    猜你喜欢
    • 2015-06-27
    • 2012-11-24
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多