RoyalGao

要像一棵树栽在溪水旁,按时侯结果子,叶子也不枯干(诗篇)。
Mail: gaoquanning@163.com

导航

OpenCV学习笔记6_GetInCvMat_访问CvMat数据块

访问CvMat数据块

矩阵的维度与通道

GetInCvMat.c  

注:缺点:这个访问的效率是比较低,两个for()循环的原因,但是它很好的说明了维度和通道的含义

#include "stdafx.h"

#include "cv.h"
#include "highgui.h"
#include "cxcore.h"

int main()
{
    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);    //单通道排列输出
    //cvInitMatHeader(&mat,3,3,CV_32FC2,data);    //双通道排列输出
    //cvInitMatHeader(&mat,3,2,CV_32FC3,data);    //三通道排列输出
    
    /*
    int size[3] = {2, 2, 2};
    CvMatND mat_nd;
    cvInitMatNDHeader(&mat_nd,3,size,CV_32FC1,data);    //高维的单通道,比如3维1通道
    cvInitMatNDHeader(&mat_nd,3,size,CV_32FC2,data);*/    //高维的单通道,比如3维2通道



    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);//单通道

            /*CvScalar value = cvGet2D(&mat, y, x);
            printf("(%f  %f) ",value.val[0],value.val[1]);*/  //双通道
            /*CvScalar value = cvGet2D(&mat, y, x);
            printf("(%f  %f  %f)   ",value.val[0],value.val[1],value.val[2]);*/  //三通道
            /*CvScalar value = cvGet3D(&mat, z, y, x);
            printf("(%f  %f  %f)   ",value.val[0],value.val[1],value.val[2]);*/  //三维
            /*CvScalar value = cvGetRealND(&mat, z, y, x);
            printf("(%f  %f  %f)   ",value.val[0],value.val[1],value.val[2]);*/  //多维(三维)
        }
        printf("\n ");
    }
    return 0;
}

GetInCvMat.c  改进版,使用指针的偏移来访问矩阵元素,效率更高,采用。

#include "stdafx.h"

#include "cv.h"
#include "highgui.h"
#include "cxcore.h"

int main()
{
    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);    //单通道排列输出
    //cvInitMatHeader(&mat,3,3,CV_32FC2,data);    //双通道排列输出
    //cvInitMatHeader(&mat,3,2,CV_32FC3,data);    //三通道排列输出

    int y = 2, x = 3;
    //int nChannel = 2;双通道排列输出
    //int nChannel = 3;三通道排列输出

    for (int y = 0; y < mat.rows; y++)
    {
        float* p_float = (float*)(mat.data.ptr+y*mat.step); 

        for (int x = 0; x < mat.cols; x++)
        {    
            float value = *(p_float+x);
            /*float value[2];
            value[0] = *(p_float+x*nChannel)
            value[1] = *(p_float+x*nChannel + 1)*/    //双通道排列输出
            /*float value[3];
            value[0] = *(p_float+x*nChannel)
            value[1] = *(p_float+x*nChannel + 1)
            value[2] = *(p_float+x*nChannel + 2)*/    //三通道排列输出

            printf("( %f) ",value);//单通道
        }
            /*printf("(%f  %f) ",value.val[0],value.val[1]);*/  //双通道
            /*printf("(%f  %f  %f)   ",value.val[0],value.val[1],value.val[2]);*/  //三通道
        printf("\n ");
    }
    return 0;
}

 

 

posted on 2013-05-08 21:32  RoyalGao  阅读(346)  评论(0编辑  收藏  举报