2017-02-17 38 views
4

Я экспортирую C++ API для кода python с помощью Cython. Приложение будет выполнено на Ubuntu. Файлы проекта присутствуют hereНе удалось выполнить Cython wrapped Python code

Функция, которую я обертываю, читает имя файла изображения и отображает изображение. Файл Show_Img.pyx выглядит следующим образом интерфейс ++

import cv2 

cdef public void Print_image(char* name): 
    img = cv2.imread(name) 
    cv2.imshow("Image", img) 
    while(True): 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

с генерироваться из Cython выглядит следующим образом

__PYX_EXTERN_C DL_IMPORT(void) Print_image(char *); 

заголовочный файл включен в мой algo.cpp, который вызывает функцию как ниже

#include<iostream> 
#include<Python.h> 
#include"Show_Img.h" 
using namespace std; 

int main(){ 
    char *name = "face.jpg"; 
    Py_Initialize(); 
    Print_image(name); 
    Py_Finalize(); 
    return 0; 
} 

С помощью приведенной ниже команды я также могу скомпилировать вышеуказанный код, а также сгенерировать приложение

g++ algo.cpp `pkg-config --libs --cflags python-2.7` `pkg-config --libs --cflags opencv` -L. -lShow_Img -o algo 

также путь к библиотеке LD_LIBRARY_PATH правильно

устанавливается После исполнения приложения, есть ошибка Segmentation fault (core dumped)

Почему я не могу выполнить приложение, есть ошибка в процесс генерации? или связывание библиотеки?

+0

Возможно, вам необходимо импортировать модуль. Если вы не используете материал в глобальном масштабе ('import cv2'), он не будет запущен. – DavidW

ответ

1

Чтобы следить за мой комментарий, Вы должны вызвать функцию init для модуля:

// ... 
Py_Initialize(); 
initShow_Img(); // for Python3 use PyInit_Show_Img instead 
Print_image(name); 
Py_Finalize(); 
// ... 

Причина в том, что это создает модуль, включают в себя выполнение линии import cv2. Без него не будут надежно работать такие вещи, как доступ к глобальным модулям (чтобы добраться до cv2). Это вероятная причина сбоя сегментации.

Это код the documentation example.

+0

Я попытался импортировать модуль cv2 внутри функции, но все равно не работает, я добавил 'import cv2' после строки' cdef public void Print_image (char * name): ' – Bharadwaj

+0

Ключевым изменением является добавление' initShow_Img () '. Вы не сделали этого. Он делает много вещей, необходимых для работы Cython, помимо «import cv2». – DavidW

+0

Да, я понял это сейчас, что я пропустил это заявление. So dumb of me – Bharadwaj

 Смежные вопросы

  • Нет связанных вопросов^_^