Конвертировать из cv :: Mat в arma :: mat - PullRequest
1 голос
/ 12 октября 2019

Здравствуйте, ребята, я делаю программу, которая вычисляет собственные значения и собственные векторы изображения. Для этого я использую библиотеки OpenCV и Armadillo, в OpenCV я загружаю изображение в свою программу, а в Armadillo я вычисляю собственные значения и собственные векторы.

Мне нужно преобразовать cv :: Mat в arma ::Чтобы иметь возможность вычислить собственные значения и собственные векторы, для этого я делаю следующее на основе предыдущего ответа:

arma::mat arma_mat(reinterpret_cast<double*>(image.data), image.rows, image.cols);

Полный код здесь:

#include<armadillo>
#include<opencv2/opencv.hpp>
#include<iostream>

int main()
{
    cv::Mat image = cv::imread("Imgs/face.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    if(!image.data){
        std::cout << "No se pudo cargar la imágen\n";
        return -1;
    }

    arma::mat arma_mat(reinterpret_cast<double*>(image.data), image.rows, image.cols);

    return 0;
}

Код имеетнет проблем с компиляцией, но когда он выполняется, когда он достигает строки, где он конвертирует из cv :: Mat в arma :: mat, выполнение останавливается и появляется консоль (выходное значение: -1) Кто-нибудь знает, почему это происходит?

1 Ответ

0 голосов
/ 12 октября 2019

Не используйте переосмысление приведений, если вы действительно не знаете, что делаете. См. Принятый ответ на этот вопрос для хорошего объяснения того, что он делает.


У меня нет опыта работы с opencv, только с броненосцем. Глядя на документацию opencv , я вижу, что image.data - это uchar. Вы не можете просто переосмыслить значения, чтобы удвоить. Это неопределенное поведение и определенно неправильное в этом случае.

Матричный класс броненосца (arma::Mat) является шаблоном. Вы можете создать Mat<uchar> и использовать конструктор Mat<uchar>(ptr_aux_mem, n_rows, n_cols, copy_aux_mem = true, strict = false), чтобы избежать копирования элементов. Конечно, вы также можете использовать другие типы броненосцев, но в этом случае вам нужно будет скопировать элементы, чтобы преобразовать их в другой тип (например, в arma::mat, который является псевдонимом arma::Mat<double>). В этом случае вы бы использовали другой конструктор.

...