• CvMat 矩阵的使用方法和简单程序


    一:CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type,void* data=NULL, int step=CV_AUTOSTEP );
    mat  指针指向要被初始化的矩阵头.
    rows  矩阵的行数.
    cols 矩阵的列数.
    type 矩阵元素类型.
    data 可选的,将指向数据指针分配给矩阵头.
    step 排列后的数据的整个行宽。默认状态下。使用 STEP 的最小可能值。比如假定矩阵的行与行之间无隙

    double a[] = { 1, 2, 3, 4

    5, 6, 7, 8,
    9, 10, 11, 12 };
    double b[] = { 1, 5, 9,
    2, 6, 10,
    3, 7, 11,
    4, 8, 12 };
    double c[9];// c 数组存贮 a(3x4) 和 b(4x3) 矩阵的积
    CvMat Ma, Mb, Mc ;
    cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a );//创建矩阵,按行存储的
    cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b );
    cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c );

    cvMatMulAdd( &Ma, &Mb, 0, &Mc );

    cvReleaseMat(&Ma);

    cvReleaseMat(&Mb);

    cvReleaseMat(&Mc);

    还有一种初始化矩阵:

    double a[] = { 1,   2,   3,   4,

                    5,   6,   7,   8,

    9, 10, 11, 12 };

    CvMat Ma=cvMat(3, 4, CV_64FC1, a);


    二:

    cvMat存储矩阵的方法

    cvGetRealND();返回单通道数组的指定元素

    double cvGetReal1D( const CvArr* arr, int idx0 );
    double cvGetReal2D( const CvArr* arr, int idx0, int idx1 );
    double cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 );
    double cvGetRealND( const CvArr* arr, int* idx );
    arr
    输入数组,必须是单通道.
    idx0
    元素下标的第一个成员,以 0 为基准
    idx1
    元素下标的第二个成员。以 0 为基准
    idx2
    元素下标的第三个成员。以 0 为基准
    idx
    元素下标数组

    返回特殊的数组元素

     cvSetRealND();//改动指定数组元素值

    void cvSetReal1D( CvArr* arr, int idx0, double value );
    void cvSetReal2D( CvArr* arr, int idx0, int idx1, double value );
    void cvSetReal3D( CvArr* arr, int idx0, int idx1, int idx2, double value );
    void cvSetRealND( CvArr* arr, int* idx, double value );
    arr
    输入数组.
    idx0
    元素下标的第一个成员。以 0 为基点
    idx1
    元素下标的第二个成员。以 0 为基点
    idx2
    元素下标的第三个成员,以 0 为基点
    idx
    元素下标数组
    value
    指派的值


    cvGetND();//返回特殊的数组元素 多通道的
    CvScalar cvGet1D( const CvArr* arr, int idx0 );
    CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
    CvScalar cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 );
    CvScalar cvGetND( const CvArr* arr, int* idx );
    arr
    输入数组.
    idx0
    元素下标第一个以 0 为基准的成员
    idx1
    元素下标第二个以 0 为基准的成员
    idx2
    元素下标第三个以 0 为基准的成员
    idx
    元素下标数组

    cvSetND();//改动指定的数组?多通道的

    void cvSet1D( CvArr* arr, int idx0, CvScalar value );
    void cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );
    void cvSet3D( CvArr* arr, int idx0, int idx1, int idx2, CvScalar value );
    void cvSetND( CvArr* arr, int* idx, CvScalar value );
    arr
    输入数组
    idx0
    元素下标的第一个成员,以 0 为基点
    idx1
    元素下标的第二个成员,以 0 为基点
    idx2
    元素下标的第三个成员,以 0 为基点
    idx
    元素下标数组
    value
    指派的值


    voidcvmSet( CvMat* mat, int row, int col, double value );//设置单通道浮点矩阵的指定元素
    mat
    矩阵.
    row
    行下标,以 0 为基点.
    col
    列下标,以 0 为基点.
    value
    矩阵元素的新值


    doublecvmGet( const CvMat* mat, int row, int col );//返回单通道浮点矩阵指定元素
    mat
    输入矩阵.
    row
    行下标。以 0 为基点.
    col
    列下标,以 0 为基点






    #include "cv.h"  
    #include "highgui.h"  
    #include <stdio.h> 
    #include <math.h>  
    #include <string.h>


    #pragma comment(lib, "cv.lib")  
    #pragma comment(lib, "cxcore.lib")  
    #pragma comment(lib, "highgui.lib")  


    main()
    {  
    CvMat Ma;
    CvMat Mb;
    CvMat *Mc;
    int i,j;
    double a[] = { 1,    2,    3,    4};
    double b[] = { 1,    2,    3,    4 };
    double c[]={0};
    Mc=cvCreateMat(2,2,CV_64FC1);
      Ma=cvMat(2, 2, CV_64FC1, a);  
      Mb=cvMat(2, 2, CV_64FC1, b); 
      //cvTranspose(&Ma, Mc);//Ma的转置存储在Mc中,不能对自己进行转置
      cvMatMul(&Ma, &Mb, Mc);
      cvmSet(Mc,1,1,3);//设置2行2列的值为3
    //cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a,CV_AUTOSTEP);
    for(i=0;i<2;i++)
    for(j=0;j<2;j++)
    printf("%f ",cvGetReal2D(Mc,i,j));
    //printf("%f ",cvGet2D(Mc,i,j));
    }

  • 相关阅读:
    可变长参数列表
    《Android深入透析》之广播(Broadcast)
    android设计模式资源集合
    Android内存性能优化
    Java 对象的生命周期
    Android 打印java堆栈的几种方法
    Android下打印调试堆栈方法
    UML类图几种关系的总结
    【转】Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
    查看Android设备的CPU架构信息
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5412262.html
Copyright © 2020-2023  润新知