zoukankan      html  css  js  c++  java
  • 【OpenCV学习】矩阵运算和操作2

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    #include "cv.h"
    #include "highgui.h"
    #include <stdio.h>
    void PrintMat(CvMat *A);//显示矩阵
    void GenRandn(CvMat *arr,int seed);//生成正态分布的随机矩阵
    void GenRand(CvMat *arr,int seed);//生成[0,1]均匀分布的随机矩阵
    static int cmp_func(const void * _a,const void * _b,void * userdata);//比较函数
    void Test_Multiply();//测试矩阵乘法
    void Test_cvGetRawData();//将缓存数据填入CvMat数组中
    void Test_DCT();//计算DCT变换
    void Test_Rand();//生成随机数
    void Test_SeqSort();//二维序列排序
    int main(void)
    {
        Test_Multiply();
        Test_cvGetRawData();
        Test_DCT();
        Test_Rand();
        Test_SeqSort();
        return 0;
    }
    /*矩阵乘法*/
    void Test_Multiply()
    {
        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];
        CvMat Ma,Mb,Mc;
        printf("/n=== Test Multiply ===/n");
        cvInitMatHeader(&Ma,3,4,CV_64FC1,a,CV_AUTOSTEP);
        cvInitMatHeader(&Mb,4,3,CV_64FC1,b,CV_AUTOSTEP);
        cvInitMatHeader(&Mc,3,3,CV_64FC1,c,CV_AUTOSTEP);
        cvMatMulAdd(&Ma,&Mb,0,&Mc);
        PrintMat(&Ma);
        PrintMat(&Mb);
        PrintMat(&Mc);
    }
    void Test_cvGetRawData()
    {
        float *data;
        int step;
        float a[]={ 1,2,3,4,
                    -5,6,7,8,
                    9,-10,-11,12
        };
        CvMat array;
        CvSize size;
        int x,y;
        printf("/n ===Test get raw dara! ===/n");
        cvInitMatHeader(&array,3,4,CV_32FC1,a,CV_AUTOSTEP);
        cvGetRawData(&array,(uchar **)&data,&step,&size);//得到矩阵的信息
        step/=sizeof(data[0]);
        printf("/nCvMat = ");
        PrintMat(&array);
        printf("/nData = ");
        for (y=0;y<size.height;y++,data+=step)
        {
            printf("/n");
            for (x=0;x<size.width;x++)
            {
                data[x]=(float)fabs(data[x]);
                printf("%8.2f",data[x]);
            }
            printf("/n");
        }
    }
    void Test_DCT()
    {
        float data[]={1,2,3,4,5,6,7,8};
        CvMat a;
        a = cvMat(2,4,CV_32FC1,data);
       
        printf("/n === Test DCT ===");
        printf("/nOriginal Matrix = ");
        PrintMat(&a);
        cvDCT(&a,&a,CV_DXT_FORWARD);
        printf("/n2-D DCT = ");
        PrintMat(&a);
        cvDCT(&a,&a,CV_DXT_INVERSE);
        printf("/n2-D IDCT = ");
        PrintMat(&a);
    }
    void Test_Rand()
    {
        CvMat *a=cvCreateMat(10,6,CV_32F);
        int i;
        printf("/n === Test generating random matrix === ");
        for (i=0;i<5;i++)
        {
            GenRandn(a,i);
            PrintMat(a);
        }
        cvReleaseMat(&a);
    }
    void GenRand(CvMat *arr,int seed)
    {
        CvRandState rng;
        rng.state =cvRNG(0xffffffff);
        cvRandInit(&rng,
            0,1,    /* 现在使用虚参数以后再调整 */
            seed,    /* 使用一个种子  */
            CV_RAND_UNI    /* 指定为均匀分布类型 */
            );
        cvRandArr(&rng.state,arr,CV_RAND_UNI,cvRealScalar(0),cvRealScalar(1));
    }
    void GenRandn(CvMat *arr,int seed)
    {
        CvRandState rng;
        rng.state =cvRNG(0xffffffff);
        cvRandInit(&rng,
            0,1,    /* 现在使用虚参数以后再调整 */
            seed,    /* 使用一个种子  */
            CV_RAND_NORMAL    /* 指定为均匀分布类型 */
            );
        cvRandArr(&rng.state,arr,CV_RAND_NORMAL,cvRealScalar(0),cvRealScalar(1));   
    }
    void PrintMat(CvMat *A)
    {
        int i,j;
        for (i=0;i<A->rows;i++)
        {
            printf("/n");
            switch(CV_MAT_DEPTH(A->type))
            {
                case CV_32F:
                case CV_64F:
                    for (j=0;j<A->cols;j++)
                        printf("%9.3f",(float)cvGetReal2D(A,i,j));
                    break;
                case CV_8U:
                case CV_16U:
                    for (j=0;j<A->cols;j++)
                        printf("%6d",(int)cvGetReal2D(A,i,j));
                    break;
                default:
                    break;
            }
        }
        printf("/n");
    }
    void Test_SeqSort()
    {
        CvMemStorage *storage = cvCreateMemStorage(0);
        CvSeq *seq=cvCreateSeq(CV_32SC2,sizeof(CvSeq),sizeof(CvPoint),storage);
        int i;
        printf("/n=== Test Sequence sorting! === ");
        for (i=0;i<10;i++)
        {
            CvPoint pt;
            pt.x= rand()%1000; // 得到1000以内的随机数
            pt.y= rand()%1000;
            cvSeqPush(seq,&pt);//添加元素到序列末尾
        }
        printf("/nOriginal point set:/n");
        for (i=0;i<seq->total;i++)
        {
            CvPoint *pt =(CvPoint *)cvGetSeqElem(seq,i);
            printf("(%d,%d)/n",pt->x,pt->y);
        }
        cvSeqSort(seq,cmp_func,0);
        printf("/nAfter sorting: /n");
        for (i=0;i<seq->total;i++)
        {
            CvPoint *pt =(CvPoint *)cvGetSeqElem(seq,i);
            printf("(%d,%d)/n",pt->x,pt->y);
        }
        cvClearSeq(seq);
        cvReleaseMemStorage(&storage);
    }
    static int cmp_func(const void * _a,const void * _b,void * userdata)
    {
        CvPoint *a=(CvPoint *)_a;
        CvPoint *b=(CvPoint *)_b;
        int y_diff=a->y-b->y;
        int x_diff=a->x-b->x;
        return y_diff?y_diff:x_diff;
    }
    
    							


                   作者:gnuhpc
                   出处:http://www.cnblogs.com/gnuhpc/
                   除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    redis命令
    eclipse error pages 打红X的解决方法
    探究adroid活动
    Javascript基本算法演练 Seek and Destroy
    c语言结构体排序示例
    android studio 环境配置
    git学习
    栈用于2进制转换10进制
    html和js
    js
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2573824.html
Copyright © 2011-2022 走看看