【09】【矩阵数据访问】
【第一次,但电脑显示不出来,好像是电脑有问题】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
【第一次,但电脑显示不出来,好像是电脑有问题】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
int main(int argc,char*argv[])//这种方法访问矩阵不是很好
{
{
float data[18]=//3行6列
{30,60,40,60,50,40,
67,88,55,33,22,97,
59,69,32,46,25,45
};
CvMat mat;
cvInitMatHeader(&mat,3,6,CV_32FC1,data);//3代表维度大小,数据类型,size指数据范围
//int y=2,x=3;//矩阵指针便宜
{30,60,40,60,50,40,
67,88,55,33,22,97,
59,69,32,46,25,45
};
CvMat mat;
cvInitMatHeader(&mat,3,6,CV_32FC1,data);//3代表维度大小,数据类型,size指数据范围
//int y=2,x=3;//矩阵指针便宜
for(int y=0;y<mat.rows;y++)//row行
{
float* p_float=(float*)(mat.data.ptr+y*mat.step);//y=012,step=24.由于数据是float型,所以要把指针转成float型
{
float* p_float=(float*)(mat.data.ptr+y*mat.step);//y=012,step=24.由于数据是float型,所以要把指针转成float型
for(int x=0;x<mat.cols;x++)
{
float value=*(p_float+x); //每次偏移4个字节,char型一个字节
printf("(%f)",value);
}
printf("\n");
}
{
float value=*(p_float+x); //每次偏移4个字节,char型一个字节
printf("(%f)",value);
}
printf("\n");
}
return 0;
}
【第二次实验】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
【第二次实验】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
int main(int argc,char*argv[])//这种方法访问矩阵不是很好
{
{
float data[18]=//3行6列
{30,60,40,60,50,40,
67,88,55,33,22,97,
59,69,32,46,25,45
};
CvMat mat;
cvInitMatHeader(&mat,3,3,CV_32FC2,data);//2通道,一个位置2个数字
int nChannels=2;//标记通道数,后面偏移用
//int y=2,x=3;//矩阵指针偏移
{30,60,40,60,50,40,
67,88,55,33,22,97,
59,69,32,46,25,45
};
CvMat mat;
cvInitMatHeader(&mat,3,3,CV_32FC2,data);//2通道,一个位置2个数字
int nChannels=2;//标记通道数,后面偏移用
//int y=2,x=3;//矩阵指针偏移
for(int y=0;y<mat.rows;y++)//row行
{
float* p_float=(float*)(mat.data.ptr+y*mat.step);//y=012,step=24.由于数据是float型,所以要把指针转成float型
{
float* p_float=(float*)(mat.data.ptr+y*mat.step);//y=012,step=24.由于数据是float型,所以要把指针转成float型
for(int x=0;x<mat.cols;x++)
{
float value[2];
value[0]=*(p_float+x*nChannels); //每次偏移4个字节,char型一个字节
value[1]=*(p_float+x*nChannels+1); //每次偏移4个字节,char型一个字节,按照float型偏移
printf("(%f %f)",value[0],value[1]);
}
printf("\n");
}
{
float value[2];
value[0]=*(p_float+x*nChannels); //每次偏移4个字节,char型一个字节
value[1]=*(p_float+x*nChannels+1); //每次偏移4个字节,char型一个字节,按照float型偏移
printf("(%f %f)",value[0],value[1]);
}
printf("\n");
}
return 0;
}
【第三次】
#include"stdafx.h"
#include <stdio.h>
//#include"cxtypes.h"
#include"highgui.h"
#include"cxcore.h"
#include"cv.h"
#include"stdafx.h"
#include <stdio.h>
//#include"cxtypes.h"
#include"highgui.h"
#include"cxcore.h"
#include"cv.h"
int main(int argc,char*argv[])
{
float data[18]=
{
30,40,60,50,40,44,
67,88,55,33,22,97,
59,69,32,46,25,45,
};
CvMat mat;
cvInitMatHeader(&mat,3,1,CV_32FC3,data);//根据通道数,mat后面3,6变3,3;本例讲的从1-3通道,换系数
int nChannels=3;;
float data[18]=
{
30,40,60,50,40,44,
67,88,55,33,22,97,
59,69,32,46,25,45,
};
CvMat mat;
cvInitMatHeader(&mat,3,1,CV_32FC3,data);//根据通道数,mat后面3,6变3,3;本例讲的从1-3通道,换系数
int nChannels=3;;
mat.data.ptr;
int y,x;
for(y=0;y<mat.rows;y++)
{
float*p_float=(float*)(mat.data.ptr+y*mat.step);//偏移地址是一行的字节数,访问第几行,用y乘以几;通道数变化不改变y偏移方法
int y,x;
for(y=0;y<mat.rows;y++)
{
float*p_float=(float*)(mat.data.ptr+y*mat.step);//偏移地址是一行的字节数,访问第几行,用y乘以几;通道数变化不改变y偏移方法
for(x=0;x<mat.cols;x++)
{ float value[3];
value[0]=*(p_float+x*nChannels);
value[1]=*(p_float+x*nChannels+1);
value[2]=*(p_float+x*nChannels+2);
printf("(%f %f %f)",value[0],value[1],value[2]);
{ float value[3];
value[0]=*(p_float+x*nChannels);
value[1]=*(p_float+x*nChannels+1);
value[2]=*(p_float+x*nChannels+2);
printf("(%f %f %f)",value[0],value[1],value[2]);
}
}
}
return 0;
}