zl程序教程

您现在的位置是:首页 >  其它

当前栏目

6矩阵维度和通道

矩阵 通道 维度
2023-09-11 14:21:07 时间

矩阵维度与通道

 

矩阵的格式与数组类似,在此以数组类比,理解什么是维度?什么是通道?

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;
}