用固定数据创建CvMat矩阵并打印

1、  题目:用固定数据创建CvMat矩阵并打印。

2、  有两种方法用固定数据创建CvMat矩阵:

CvMat mat;

cvInitMatHeader(&mat, 2, 2, CV_32FC1, vals);

 

CvMat mat = cvMat( 2, 2, CV_32FC1, vals);

 

两种方法本质上一样,“函数 cvMat 是个一快速内联函数,替代函数 cvInitMatHeader”( http://www.opencv.org.cn/index.php/Cxcore数组操作#InitMatHeader

 

3、  打印时有两种获取数据的方法:

#include "stdafx.h" #include "stdio.h" //#include "highgui.h" #include "cv.h" #include "cxtypes.h" int main(int argc, char* argv[]) { float vals[] = { 0.866025, -0.500000, 0.500000, 0.866025 }; // CvMat mat; // cvInitMatHeader(&mat, 2, 2, CV_32FC1, vals); CvMat mat = cvMat( 2, 2, CV_32FC1, vals); for(int i = 0; i < mat.rows; i++) { // const float* ptr = (const float*)(mat.data.ptr + i * mat.step); for(int j = 0; j < mat.cols; j++) { // printf("mat[%d][%d] = %f/n", i, j, *(ptr+j) ); printf("mat[%d][%d] = %f/n", i, j, *(mat.data.fl + j + i * mat.rows) ); } } return 0; }

 

 

#include "stdafx.h" #include "stdio.h" //#include "highgui.h" #include "cv.h" #include "cxtypes.h" int main(int argc, char* argv[]) { float vals[] = { 0.866025, -0.500000, 0.500000, 0.866025 }; CvMat mat; cvInitMatHeader(&mat, 2, 2, CV_32FC1, vals); // CvMat mat = cvMat( 2, 2, CV_32FC1, vals); for(int i = 0; i < mat.rows; i++) { const float* ptr = (const float*)(mat.data.ptr + i * mat.step);//step是字节数,所以首地址mat.data要用uchar*类型(即mat.data.ptr), //计算后的行地址再转换成实际的数据类型(float*),供后面计算 for(int j = 0; j < mat.cols; j++) { printf("mat[%d][%d] = %f/n", i, j, *(ptr+j) ); // printf("mat[%d][%d] = %f/n", i, j, *(mat.data.fl + j + i * mat.rows) ); } } return 0; }

 

第一种方法很直观,第二种方法用到mat.step,主要考虑到有的数据未必排列紧凑(因为有四字节对齐),但要注意行首地址要转换成实际数据类型。第二种方法准确。

你可能感兴趣的:(用固定数据创建CvMat矩阵并打印)