Вызов функции C++ с Python и преобразовать в формате OpenCV мат в массив NumPy


Фоновая ситуация

Я пытаюсь использовать модуль сшивания OpenCV через привязки Python, но я получаю ошибку:

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

Ошибка: /главная/пользователя/OpenCV3.1.0/использованием OpenCV/модули/питон/параметре src2/cv2.cpp: 163: error: (-215) данные обычно должны быть нулевыми! в функции распределения

Подобные люди страдают этим:

Проблема под рукой

Поэтому я решил использовать официальный пример сшивания C++ OpenCV и использовать Python, чтобы вызвать его с помощью Boost.Питон. Однако я все еще не могу понять, как правильно использовать Boost.Python + numpy-opencv-конвертер для обработки преобразования массива C++ Mat vs Numpy.

¿Как мне вызвать numpy-opencv-конвертер? У меня есть только импульс.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.


Это те файлы, которые я использую.

Тестирование.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
1 5

1 ответ:

Вам нужно преобразовать Python NDArray C++ cv:: Mat. Я могу порекомендовать этотGitHub Repo . Он содержит пример, который должен соответствовать вашим потребностям. Я использую конвертер на Ubuntu 15.10 с Python 2.7 / 3.4 и OpenCV 3.1.