6矩阵维度和通道
矩阵维度与通道
矩阵的格式与数组类似,在此以数组类比,理解什么是维度?什么是通道?
float pArr[18]={10,15,20,25,30,35,
40,45,50,55,60,65,
70,75,80,85,90,95};
上面是3行6列的数组。
维度:就是我们平常所说的坐标轴。二维:x,y。。三维:x,y,z。。
通道:就是某一坐标表示的数组有多少个。比如单通道:pArr[0][0]=10,在坐标(0,0)处只表示一个数组。同理双通道:pArr[0][0]={10,15},那么就是双通道。我们常用的RBG(255,255,255)就是三通道。
那么在opencv下如何表示单通道还是多通道?
cvInitMatHeader(&mat,3,6,CV_32FC1,pArr);
此函数的第四参数:CV_32FC1--------32表示32位,FC表示通道,1表示单通道(若2表示双通道)。
常用的函数如下:
注意:
1.具有Real的函数只能只用在单通道。
2.cvGet1D,cvGet2D等。。----2D表示维度。只用x、y坐标轴使用cvGet2D;有x、y、z坐标轴就使用cvGet3D。。。
下面用一个例子来说明:
第一种:把二维数组,以二维单通道方式输出
float pArr[18]={10,15,20,25,30,35,
40,45,50,55,60,65,
70,75,80,85,90,95};
int _tmain(int argc, _TCHAR* argv[])
{
CvMat mat;
cvInitMatHeader(&mat,3,6,CV_32FC1,pArr);
for(int y=0;y<mat.rows;++y)
{
for(int x=0;x<mat.cols;++x)
{
float Value=cvGetReal2D(&mat,y,x);
printf("%f ",Value);
}
printf("\n");
}
结果:
第二种:把二维数组,以二维双通道方式输出
此时要
一维单通道源代码: // cvND.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdio.h" #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" using namespace cv; float pArr[18]={10,15,20,25,30,35, 40,45,50,55,60,65, 70,75,80,85,90,95}; int _tmain(int argc, _TCHAR* argv[]) { CvMat mat; cvInitMatHeader(&mat,3,6,CV_32FC1,pArr); for(int y=0;y<mat.rows;++y) { for(int x=0;x<mat.cols;++x) { float Value=cvGetReal2D(&mat,y,x); printf("%f ",Value); } printf("\n"); } system("pause"); return 0; }
二维双通道源代码: // cvND.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdio.h" #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" using namespace cv; float pArr[18]={10,15,20,25,30,35, 40,45,50,55,60,65, 70,75,80,85,90,95}; int _tmain(int argc, _TCHAR* argv[]) { CvMat mat; cvInitMatHeader(&mat,3,3,CV_32FC2,pArr); for(int y=0;y<mat.rows;++y) { for(int x=0;x<mat.cols;++x) { CvScalar Value=cvGet2D(&mat,y,x); printf("(%f %f)",Value.val[0],Value.val[1]); } printf("\n"); } system("pause"); return 0; }