Передача нескольких аргументов в C ++ в функцию общей библиотеки MatLab - PullRequest
1 голос
/ 28 октября 2019

Я реализую алгоритм соответствия функций для Matlab в моем приложении C ++ с использованием разделяемых библиотек. Проблема в том, что я получаю значения только для одного аргумента, хотя я передаю четыре аргумента функции.

Функция Matlab:

[c, d, e, f] = fm_test("C:\0.jpg", "C:\1.jpg");

function [FSC_1, FSC_2, NBCS_1, NBCS_2] = fm_test(path_im1, path_im2)
...
% Performed feature matching - output are 4 matrices with format n x 2 single
FSC_1 = matchedPoints1(inliersIndex, :);
FSC_2 = matchedPoints2(inliersIndex, :);  
NBCS_1 = matchedPoints1(inliers_NBCS, :);
NBCS_2 = matchedPoints2(inliers_NBCS, :);
end

Я использую библиотечный компилятор для создания общего ресурсабиблиотеки для C ++ и вызова функции:

mclmcrInitialize();
    //const char *args[] = { "-nojvm" };
    //const int count = sizeof(args) / sizeof(args[0]);
    if (!mclInitializeApplication(NULL, 0)) {

        std::cerr << "Could not initialize the application properly" << std::endl;
        return -1;
    }

    if (!fm_testInitialize()) {
        std::cerr << "Could not initialize the library properly" << std::endl;
        return -1;
    }
    else {
        try {
            for (size_t i = 0; i < cameras.size() - 1; ++i){

            mwArray FSC_1, FSC_2, NBCS_1, NBCS_2;
            mwArray path_1 = cameras[i].image_path.c_str();
            mwArray path_2 = cameras[i+1].image_path.c_str();
            fm_test(1, FSC_1, FSC_2, NBCS_1, NBCS_2, path_1, path_2);

            // Convert mwArray to vector<double>
            std::cout << " Printing sizes of mwArray" << std::endl;
            std::cout << FSC_1.NumberOfElements() << std::endl; 
            std::cout << FSC_2.NumberOfElements() << std::endl;
            std::cout << NBCS_1.NumberOfElements() << std::endl;
            std::cout << NBCS_2.NumberOfElements() << std::endl;
            }

        }
        catch (const mwException& e) {
            std::cerr << e.what() << std::endl;
            return -2;
        }
        catch (...) {
            std::cerr << "Unexpected error thrown" << std::endl;
            return -3;
        }
        fm_testTerminate();

    }

Результат, например:

Printing sizes of mwArray
100 
0
0
0

Возможно ли передать несколько аргументов функции? Должен ли я определить mwArray более конкретно?

1 Ответ

1 голос
/ 29 октября 2019

Мне нужно было передать другой первый аргумент функции в отличие от примера на веб-сайте Matlab. Функция определяется как:
extern LIB_fm_test_CPP_API void MW_CALL_CONV fm_test(int nargout, mwArray& FSC_1, mwArray& FSC_2, mwArray& NBCS_1, mwArray& NBCS_2, const mwArray& path_im1, const mwArray& path_im2);

Первый аргумент должен быть изменен на количество аргументов, которые я имею в качестве вывода (в моем случае 4). Правильный вызов функции:
fm_test(4, FSC_1, FSC_2, NBCS_1, NBCS_2, path_1, path_2);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...