【09】【矩阵数据访问】详细注释

【09】【矩阵数据访问】
【第一次,但电脑显示不出来,好像是电脑有问题】
#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;//矩阵指针便宜
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型
 for(int x=0;x<mat.cols;x++)
 {
  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"
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;//矩阵指针偏移
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型
 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");
}
return 0;
}
【第三次】
#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;;
  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偏移方法
   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]);
   }
  }
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值