cv::Mat 如何将 from/to 翻译成 glm::mat4
How a cv::Mat translate from/to a glm::mat4
我们在OpenCV中计算位置和旋转,然后用OpenGL渲染。那么我们如何在这两种矩阵(cv::Mat
glm::mat4
)或向量之间进行转换呢?
由于它们都存储在内存中的连续位置,您可以使用命令“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 矩阵,则应转置矩阵。
别忘了转置!!!!!!这个 FxxKING 几乎要了我的命
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;
}
我们在OpenCV中计算位置和旋转,然后用OpenGL渲染。那么我们如何在这两种矩阵(cv::Mat
glm::mat4
)或向量之间进行转换呢?
由于它们都存储在内存中的连续位置,您可以使用命令“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 矩阵,则应转置矩阵。
别忘了转置!!!!!!这个 FxxKING 几乎要了我的命
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;
}