opencv 矩阵数据的遍历:单通道
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
//数据
float data[18] =
{
1,2,3,4, 5,6,
7,8,9,10,11,12,
13,14,15,16,17,18
};
//矩阵的声明
CvMat mat;
cvInitMatHeader(&mat,3,6,CV_32FC1,data);
int y ,x;
//对行 进行便利
for(y=0;y<mat.rows;y++)
{
//对第y行的 元素进行遍历
for(x=0;x<mat.cols;x++)
{
float value=cvGetReal2D(&mat,y,x);
printf(" %f " ,value);
}
printf("\n");
}
return 0;
}
opencv 矩阵数据的遍历:双通道(每2个值组成 一个元素)
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
//数据
float data[18] =
{
1,2,3,4, 5,6,
7,8,9,10,11,12,
13,14,15,16,17,18
};
//矩阵的声明
CvMat mat;
cvInitMatHeader(&mat,3,3,CV_32FC2,data);
int y ,x;
//对行 进行便利
for(y=0;y<mat.rows;y++)
{
//对第y行的 元素进行遍历
for(x=0;x<mat.cols;x++)
{
CvScalar value=cvGet2D(&mat,y,x);
printf("(%f %f) " ,value.val[0],value.val[1]);
}
printf("\n");
}
return 0;
}
效果:
opencv 矩阵数据的遍历:DEMO
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
//数据
float data[18] =
{
1,2,3,4, 5,6,
7,8,9,10,11,12,
13,14,15,16,17,18
};
//矩阵的声明
CvMat mat_1Chanel, mat_2Chanel , mat_3Chanel;
//单通道矩阵
cvInitMatHeader(&mat_1Chanel,3,6,CV_32FC1,data);
//2通道矩阵
cvInitMatHeader(&mat_2Chanel,3,3,CV_32FC2,data);
//3通道矩阵
cvInitMatHeader(&mat_3Chanel,3,2,CV_32FC3,data);
//高维矩阵的创建
int nd = 3; //维度 3维的矩阵
int size[3] = {2,2,2}; //每一维的大小 是2
CvMatND mat_nd; //声明高维矩阵
cvInitMatNDHeader(&mat_nd , 3 , size , CV_32FC1,data); //从数组的数据 创建高维矩阵
//通过指针访问矩阵的数据
int y ,x;
int nChannels = 3;//通道数
//对行 进行便利
//
///单通道遍历
//
for(y=0;y<mat_1Chanel.rows;y++)
{
//对第y行的 元素进行遍历
for(x=0;x<mat_1Chanel.cols;x++)
{
float value=cvGetReal2D(&mat_1Chanel,y,x);
printf(" %f " ,value);
}
printf("\n");
}
printf("\n");
//
///双通道遍历
//
for(y=0;y<mat_2Chanel.rows;y++)
{
//对第y行的 元素进行遍历
for(x=0;x<mat_2Chanel.cols;x++)
{
CvScalar value=cvGet2D(&mat_2Chanel,y,x);
printf("(%f %f) " ,value.val[0],value.val[1]);
}
printf("\n");
}
printf("\n");
//
///三通道遍历
//
for(y=0;y<mat_3Chanel.rows;y++)
{
//将指针偏移到第y行 的起始处
float* p_float = (float*)(mat_3Chanel.data.ptr + y*mat_3Chanel.step) ;
//对第y行的 元素进行遍历
for(x=0;x<mat_3Chanel.cols;x++)
{
float value[3];
value[0] = *(p_float+x*nChannels); //指针偏移到第y行的第x个元素的起始处
value[1] = *(p_float+x*nChannels + 1);
value[2] = *(p_float+x*nChannels + 2);
printf("(%f %f %f) " ,value[0],value[1],value[2]);
}
printf("\n");
}
return 0;
}
效果: