2016-11-30 10 views
1

В настоящее время я переношу некоторый код из Matlab в Octave. Некоторые из функций Matlab-кода используют Piotr's Computer Vision Matlab Toolbox (here), который включает в себя некоторые файлы mex. В Matlab, все работает как шарм, но когда я запускаю коды с Октавом, он выдает эту ошибку:Mex файл здание с Octave (выпуск с обертками)

error: 'imResampleMex' undefined near line 50 column 5 

Однако все внутренние пути в пределах панели инструментов должны быть хорошими. Я понял, что путь Matlab и Octave обрабатывать MEX файлы разные, и пытался построить один из MEX файлов из функции C++ в октаву, как это:

mkoctfile --mex imResampleMex.cpp 

Он терпит неудачу и бросает следующие сообщения об ошибках, связанных с C++ функция оберток:

In file included from imResampleMex.cpp:6:0: 
wrappers.hpp:21:24: error: 'wrCalloc' declared as an 'inline' variable 
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size); 
         ^
wrappers.hpp:21:24: error: 'size_t' was not declared in this scope 
wrappers.hpp:21:36: error: 'size_t' was not declared in this scope 
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size); 
            ^
wrappers.hpp:21:48: error: expression list treated as compound expression in initializer [-fpermissive] 
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size); 
               ^
wrappers.hpp:21:50: error: expected ',' or ';' before '{' token 
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size); 
               ^
wrappers.hpp:22:24: error: 'wrMalloc' declared as an 'inline' variable 
inline void* wrMalloc(size_t size) { return malloc(size); } 
         ^
wrappers.hpp:22:24: error: 'size_t' was not declared in this scope 
wrappers.hpp:22:38: error: expected ',' or ';' before '{' token 
inline void* wrMalloc(size_t size) { return malloc(size); } 
            ^
wrappers.hpp: In function 'void wrFree(void*)': 
wrappers.hpp:23:44: error: 'free' was not declared in this scope 
inline void wrFree(void * ptr) { free(ptr); } 
              ^
wrappers.hpp: At global scope: 
wrappers.hpp:28:17: error: 'size_t' was not declared in this scope 
void* alMalloc(size_t size, int alignment) { 
       ^
wrappers.hpp:28:30: error: expected primary-expression before 'int' 
void* alMalloc(size_t size, int alignment) { 
          ^
wrappers.hpp:28:44: error: expression list treated as compound expression in initializer [-fpermissive] 
void* alMalloc(size_t size, int alignment) { 
              ^
wrappers.hpp:28:46: error: expected ',' or ';' before '{' token 
void* alMalloc(size_t size, int alignment) { 
              ^
imResampleMex.cpp: In function 'void resampleCoef(int, int, int&, int*&, int*&, T*&, int*, int)': 
imResampleMex.cpp:21:39: error: 'alMalloc' cannot be used as a function 
    wts = (T*)alMalloc(nMax*sizeof(T),16); 
            ^
imResampleMex.cpp:22:43: error: 'alMalloc' cannot be used as a function 
    yas = (int*)alMalloc(nMax*sizeof(int),16); 
             ^
imResampleMex.cpp:23:43: error: 'alMalloc' cannot be used as a function 
    ybs = (int*)alMalloc(nMax*sizeof(int),16); 
             ^
imResampleMex.cpp: In function 'void resample(T*, T*, int, int, int, int, int, T)': 
imResampleMex.cpp:48:43: error: 'alMalloc' cannot be used as a function 
    T *C = (T*) alMalloc((ha+4)*sizeof(T),16); for(y=ha; y<ha+4; y++) C[y]=0; 
             ^
warning: mkoctfile: building exited with failure status 

файл wrappers.hpp выглядит так:

#ifndef _WRAPPERS_HPP_ 
#define _WRAPPERS_HPP_ 
#ifdef MATLAB_MEX_FILE 

// wrapper functions if compiling from Matlab 
#include "mex.h" 
inline void wrError(const char *errormsg) { mexErrMsgTxt(errormsg); } 
inline void* wrCalloc(size_t num, size_t size) { return mxCalloc(num,size); } 
inline void* wrMalloc(size_t size) { return mxMalloc(size); } 
inline void wrFree(void * ptr) { mxFree(ptr); } 

#else 

// wrapper functions if compiling from C/C++ 
inline void wrError(const char *errormsg) { throw errormsg; } 
inline void* wrCalloc(size_t num, size_t size) { return calloc(num,size); } 
inline void* wrMalloc(size_t size) { return malloc(size); } 
inline void wrFree(void * ptr) { free(ptr); } 

#endif 

// platform independent aligned memory allocation (see also alFree) 
void* alMalloc(size_t size, int alignment) { 
    const size_t pSize = sizeof(void*), a = alignment-1; 
    void *raw = wrMalloc(size + a + pSize); 
    void *aligned = (void*) (((size_t) raw + pSize + a) & ~a); 
    *(void**) ((size_t) aligned-pSize) = raw; 
    return aligned; 
} 

// platform independent alignned memory de-allocation (see also alMalloc) 
void alFree(void* aligned) { 
    void* raw = *(void**)((char*)aligned-sizeof(void*)); 
    wrFree(raw); 
} 

#endif 

Я полагаю, мне нужно изменить этот файл, но мое знание C++ nx из mex-файлов, близких к несуществующим, я изо всех сил пытаюсь найти выход из этой горы ошибок. Я даже не знаю, иду ли я в правильном направлении или нет ... Любая помощь приветствуется!

Edit 1:

Я изменил мой файл wrappers.hpp добавление #include <stdlib.h> к нему. Теперь создается файл mex. Однако, при выполнении функции вызова файла, теперь я получаю следующее сообщение об ошибке:

error: failed to install .mex file function 'imResampleMex' 
error: called from 
    imResample at line 50 column 4 
+1

Возможно, версия 'mex.h' Matlab вытаскивает некоторые стандартные заголовки библиотеки C, которых нет в версии Octave. Попробуйте добавить '#include ' в 'wrappers.hpp'. Это должно исправить ошибки 'size_t' и' free', не уверен, что все это исправит. – Praetorian

+0

@Praetorian Большое вам спасибо за ваш вклад! С этим добавлением создается mex-файл. Однако при запуске функции 'error: появляется ошибка: не удалось установить функцию .mex file 'imResampleMex''. Сейчас я редактирую свой вопрос. – Eskapp

+1

Я не очень хорошо знаком с ароматом мегаполиса Октава, поэтому я, возможно, не смогу помочь в этом. Поиск Google предполагает, что что-то не так с вашим файлом mex, например, 'mexFunction' не экспортируется правильно? Вы знаете, определяется ли 'MATLAB_MEX_FILE'? Удостоверьтесь, что это так, поэтому 'mex.h' входит в комплект. Как только вы его определите, вы можете обнаружить, что вам даже не нужно «#include » – Praetorian

ответ

3

Вот шаги, которые я использовал, чтобы решить вопрос о создании MEX файлов из Piotr в Computer Vision Matlab Toolbox для Октава (проблемы файлы cpp в папке channels).

Оригинальные файлы mex, поставляемые с панелью инструментов, построены для Matlab и не работают с Octave. При построении их из Octave выполняется вызов файла wrappers.hpp. Этот файл нужно изменить, добавив эти две строки в начале файла: #include <stdlib.h> и #include "mex.h".

Для построения MEX файл, в командной строке наберите Octave (в то же время в каталоге файла CPP):

mkoctfile --mex -DMATLAB_MEX_FILE the_file.cpp 

Таким образом, создается файл Октав совместимый MEX.

Редактировать 23/05/2017 - После получения большего количества вопросов от людей, имеющих проблемы с созданием этих файлов, я выпустил сгенерированные файлы на Github: https://github.com/Eskapp/Piotr_vision_extrafiles_Octave. Не стесняйтесь использовать их. Вам нужно будет добавить их вручную в панель инструментов Computer Vision.

+1

Привет @Eskapp Я сейчас делаю то же самое, что и вы. Matlab в Octave с mdp_tracker. После всего этого проблемы с файлом mex. еще некоторые проблемы с зависимостями matlab, такие как прерывание median.m. Мне просто интересно, есть ли у вас версия с открытым исходным кодом для этих октавных кодов? – pwan

+0

Эй @ Пван, я думаю, я мог бы нажать их на GitHub. Попробуй. Дайте мне день или два, чтобы найти эти файлы;) – Eskapp

+0

HI Eskapp !! Спасибо слишком много! Потому что я тоже его конвертировал и запускал демо. Но я думаю, что в моем коде могут быть некоторые ошибки. Ваш код поможет много. Вы успешно выполнили демо? – pwan

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

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