cv :: Mat如何从/转换为glm :: mat4

时间:2017-06-07 09:59:49

标签: c++ opencv opengl glm-math

我们在OpenCV中计算位置和旋转,并使用OpenGL渲染它。那么我们如何在这两种矩阵(cv::Mat glm::mat4)或向量之间进行转换呢?

2 个答案:

答案 0 :(得分:3)

由于它们都存储在连续位置的内存中,因此您可以使用命令“ memcpy ”从一个对象转换为另一个对象。

您必须确保定义两个具有相同类型的矩阵(在本例中为float)。

您可以使用这些函数进行转换(总是4x4矩阵):

void fromCV2GLM(const cv::Mat& cvmat, glm::mat4* glmmat) {
    if (cvmat.cols != 4 || cvmat.rows != 4 || cvmat.type() != CV_32FC1) {
        cout << "Matrix conversion error!" << endl;
        return;
    }
    memcpy(glm::value_ptr(*glmmat), cvmat.data, 16 * sizeof(float));
}

void fromGLM2CV(const glm::mat4& glmmat, cv::Mat* cvmat) {
    if (cvmat->cols != 4 || cvmat->rows != 4) {
        (*cvmat) = cv::Mat(4, 4, CV_32F);
    }
    memcpy(cvmat->data, glm::value_ptr(glmmat), 16 * sizeof(float));
}

这些函数仅用于转换数据类型,但数据结构不会更改。如果必须在基于OpenCV的方法中使用glm矩阵,则应该转置矩阵。

答案 1 :(得分:0)

不要忘记转移!!!!!!这几乎不会导致我死亡

bool fromCV2GLM(const cv::Mat& cvmat, glm::mat4* glmmat) {
    if (cvmat.cols != 4 || cvmat.rows != 4 || cvmat.type() != CV_32FC1) {
        SysUtil::errorOutput("PanoDataGenerator::Mat_CV2GLM Matrix conversion error!");
        return false;
    }
    memcpy(glm::value_ptr(*glmmat), cvmat.data, 16 * sizeof(float));
    *glmmat = glm::transpose(*glmmat);
    return true;
}

bool fromGLM2CV(const glm::mat4& glmmat, cv::Mat* cvmat) {
    if (cvmat->cols != 4 || cvmat->rows != 4) {
        (*cvmat) = cv::Mat(4, 4, CV_32F);
    }
    memcpy(cvmat->data, glm::value_ptr(glmmat), 16 * sizeof(float));
    *cvmat = cvmat->t();
    return true;
}