访问矩阵中的数据的两种方法

   摘要:访问矩阵中的数据的两种方法:简单的方法和麻烦的方法

  关键词 : CV_MAT_ELEM()   CV_MAT_ELEM_PTR()    cvPtr*D  cvGet*D    

1.CV_MAT_ELEM():这个宏包含4个参数,分别是传入矩阵,待提取的元素的类型,行数和列数。

2.CV_MAT_ELEM_PTR()  : CV_MAT_ELEM_PTR宏包含3个参数,分别是传入矩阵,行数和列数,返回指定元素的指针。与CV_MAT_ELEM相比,后者在解引用之前将其转换成适当的数据类型,可以同时实现读取和设置元素的功能。

3.cvPtr*D:cvPtr*D用来获取cvMat矩阵中指定索引值的数据。cvPtr*D族包括cvPtr*1D(),cvPtr23D()和cvPtrND()...前三个中的每一个都输入一个矩阵指针参数CvArr*,接着是一个适当的整型数值为指示,返回一个感兴趣元素的指针。

4.cvGet*D : 仅仅读取数据时,可以使用外有函数cvGet*D,返回的是矩阵元素的实际值。



实验一:简单的方法(利用CV_MAT_ELEM()宏存取矩阵,CV_MAT_ELEM_PRT()为矩阵设置一个值)

#include"highgui.h"
#include"opencv2/opencv.hpp"
int main()
{
float data[16] =
{
30, 60, 40, 23, 
67, 88, 55, 23,
59, 69, 32, 45,
};
CvMat  mat;
cvInitMatHeader(&mat, 4, 4, CV_32FC1, data);//创建一个4行4列(32位float型)的矩阵mat,并用data数组的初值初始化它
float element_1 = CV_MAT_ELEM(mat, float, 0, 2);//读取1行第3列的值(行列数都是从零开始)
float element= 5.3;  //设置一个数值,传入矩阵
        float c= CV_MAT_ELEM(mat, float, 2, 3);//待返回函数在第3行第4列
std::cout << element_1 << std::endl;//输出读取的值
std::cout << c << std::endl;//输出所写的矩阵的值
return 0;
}

运行结果如下图图一




实验二:麻烦的方法

#include"highgui.h"
#include"opencv2/opencv.hpp"
int  main()
{
float   arr[2][3] = { 3,5,89,98,67,45};//创建一个维数组
//创建一个2行3列的32位浮点型单通道               
CvMat* a = cvCreateMat(2, 3, CV_32FC1);
cvInitMatHeader
(
a,
2,
3,
CV_32FC1,
arr
);
float *r= (float*)cvPtr2D(a, 1, 2);//指针访问第2行第3个数
std::cout<< *r<< std::endl;//输出访问结果
return 0;

}


运行结果如下图图二



图一


图二

参考文献:《opencv的学习》

猜你喜欢

转载自blog.csdn.net/HHCCWWlxy/article/details/78229791