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

最佳答案

由于它们都存储在连续位置的内存中,因此可以使用命令“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矩阵,则应转置矩阵。

关于c++ - cv::Mat如何从/到glm::mat4转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44409443/

10-13 00:06