从Python调用c++函数并将OpenCV Mat转换为Numpy数组



背景情况

我试图通过Python绑定使用OpenCV拼接模块,但我得到一个错误:

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))

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

类似的人遭受这种痛苦:

  • https://stackoverflow.com/a/36646256/1253729
  • 如何使用opencv python与Stitcher类从无人机缝合图像
  • https://github.com/opencv/opencv/issues/6969

手头的问题

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

¿我如何调用numpy- openv转换器?我只有Boost。当运行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编译从源代码和虚拟环境。


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

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)

Makefile:

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 narray <=> c++ cv::Mat。我可以推荐这个GitHub Repo。它包含了一个应该适合你需要的例子。我在Ubuntu 15.10上使用Python 2.7/3.4和OpenCV 3.1的转换器。

相关内容

  • 没有找到相关文章

最新更新