Ошибка сегментации при использовании PyArray_SimpleNewFromData при преобразовании mat в numpyarray - PullRequest
0 голосов
/ 26 октября 2018

Странная ошибка сегментации в PyArray_SimpleNewFromData

Ошибка сегментации в PyArray_SimpleNewFromData

Я отправляю этот вопрос после того, как попробовал все возможные решения в двухпосты, упомянутые выше, я все еще сталкиваюсь с сегментацией.Мой код довольно прост и понятен, но я не знаю, как от этого избавиться.Любые решения для этого были бы очень полезны.

Мой код:

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <Python.h>
#include <boost/python.hpp>
#include <boost/python/numpy.hpp>
#include <numpy/arrayobject.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <vector>
using namespace boost::python;
using namespace boost::python::numpy;
using namespace cv;

PyObject* process(PyObject* arr,int rows,int cols)
{
    void* img_arr = PyArray_DATA((PyArrayObject*)arr);
    Mat image(rows, cols , CV_8UC3, img_arr);

    Mat median_blur;
    medianBlur(image, median_blur, 15);

    npy_intp dimensions[3] = {median_blur.rows, median_blur.cols, median_blur.channels()};
    return PyArray_SimpleNewFromData(median_blur.dims + 1, &dimensions[0], NPY_UINT8, median_blur.data);
}

BOOST_PYTHON_MODULE(PyWrap_CPPM)
{ 
    boost::python::numeric::array::set_module_and_type("numpy", "ndarray");
    def("process", process);
}

Если я пытаюсь добавить import_array (), я получаю еще одну ошибку, сообщающую следующее:

In file included from /usr/include/signal.h:316:0,
                 from /usr/include/numpy/npy_interrupt.h:84,
                 from /usr/include/numpy/arrayobject.h:5,
                 from /home/adminspin/srcs/Harish_Programs/numpy_pass_c++/PyWrap_CppMod.cpp:5:
/home/adminspin/srcs/Harish_Programs/numpy_pass_c++/PyWrap_CppMod.cpp: In function ‘void init_module_PyWrap_CPPM()’:
/home/adminspin/srcs/Harish_Programs/numpy_pass_c++/PyWrap_CppMod.cpp:27:2: error: return-statement with a value, in function returning 'void' [-fpermissive]
  import_array();
  ^
CMakeFiles/PyWrap_CPPM.dir/build.make:62: recipe for target 'CMakeFiles/PyWrap_CPPM.dir/PyWrap_CppMod.cpp.o' failed
make[2]: *** [CMakeFiles/PyWrap_CPPM.dir/PyWrap_CppMod.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/PyWrap_CPPM.dir/all' failed
make[1]: *** [CMakeFiles/PyWrap_CPPM.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

И мой файл Cmake:

cmake_minimum_required(VERSION 3.0)

set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11")
set(_Boost_NUMPY_DEPENDENCIES python${component_python_version})

project(boost_try_ex)

set(Boost_LIBS
 filesystem
 thread
 date_time
 chrono
 system
 timer
 serialization
 python3
 numpy3 
)

find_package(Boost REQUIRED COMPONENTS "${Boost_LIBS}")
add_definitions(-DBOOST_ALL_DYN_LINK)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIR})

find_package(PythonLibs 3 REQUIRED)
include_directories(${PYTHON_INCLUDE_PATH})

FIND_PACKAGE( OpenCV REQUIRED )                                
INCLUDE_DIRECTORIES( ${OpenCV_INCLUDE_DIRS} )

add_library(PyWrap_CPPM SHARED PyWrap_CppMod.cpp)
target_link_libraries(PyWrap_CPPM ${Boost_LIBRARIES} ${OpenCV_LIBRARIES})
set_target_properties(PyWrap_CPPM PROPERTIES PREFIX "" COMPILE_FLAGS "-DPYTHON_INTERFACE")
...