矩阵与维度通道
1.cvInitMatHeader(&-1,3,6,CV-32FC1,data);创建一个三行六列的矩阵mat-1,并用data数组的初值初始化它,CV-32FC1表示这个矩阵里面的元素是32味float型的,并且是单通道的。
2.单通道用 float value,cvGetReal2D获取行列数和维度, 双通道和三通到用CvScalar, cvGet2D获取行列数和维度(其中D代表维度)。
(单通道)
#include"highgui.h"
{
float data[18] =
{
23,34.,56,67,97,98,
13,43,45,65,76,78,
23,45,56,79,90,76
};
CvMat mat;
cvInitMatHeader(&mat, 3, 6, CV_32FC1, data); // CV_32FC1 是代表的是32位的单通道的 (3*6*1=18)
for (int y = 0; y < mat.rows; y++)
{
for (int x = 0; x < mat.cols; x++)
{
float value = cvGetReal2D(&mat, y, x); // 加Real的就是单通道的访问,这个是一个二维的矩阵,维是代表的一个点用几个坐标表示,
printf("%f", value);}
printf("\n");
}
return 0;
}
运行结果如下:
23.00000034.00000056.00000067.00000097.00000098.000000
13.00000043.00000045.00000065.00000076.00000078.000000
23.00000045.00000056.00000079.00000090.00000076.000000
(三通道)
#include "highgui.h"
#include "cv.h"
#include"cxcore.h"#include"stdio.h"
#include"stdlib.h"
int main(int argc, char* argv[])
{
float data[18] =
{ 30,60,40,48,50,40,
67,65,12,69,28,97,
56,87,99,49,25,45 };
CvMat mat;
cvInitMatHeader(&mat, 3, 2, CV_32FC3, data); //由于是三通道3×2×3=18
for (int y = 0; y<mat.rows; y++)
{
for (int x = 0; x<mat.cols; x++)
{
CvScalar value = cvGet2D(&mat, y, x); //取y行 x列 2维的
printf("(%f %f %f)", value.val[0], value.val[1], value.val[2]); //每个坐标点打印三个值;并且用括号括起来
}
printf("\n");
}
return 0;
}
运行结果如下:
(30.000000 60.000000 40.000000)(48.000000 50.000000 40.000000)
(67.000000 65.000000 12.000000)(69.000000 28.000000 97.000000)
(56.000000 87.000000 99.000000)(49.000000 25.000000 45.000000)