图像处理之 opencv 学习---矩阵的操作

OpenCV的一些操作,如生成随机矩阵,高斯矩阵,矩阵相乘之类的

/*
功能:说明矩阵一些操作方法
*/
#include "cv.h"//该头文件包含了#include "cxcore.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(); // 二维序列排序

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

int main()
{
    Test_Multiply();        // pass
    Test_cvGetRawData();    // pass
    Test_DCT();             //pass
    Test_Rand();     // pass
    Test_SeqSort(); // pass
    return 0;
}
// Testing: Sort 2d points in top-to-bottom left-to-right order.
//给二维序列排序
void Test_SeqSort()
{
    //创建内存块,为0表示当前默认大小为64k
    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++ )
    {
        // cvGetSeqElem---返回索引所指定的元素指针
        CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
        printf( "(%d,%d)\n", pt->x, pt->y );
    }
    //使用特定的比较函数对序列中的元素进行排序
    cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ );

/* print out the sorted sequence */
    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 );   // Sequence clearing should be done before storage clearing
    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;
}
// 生成随机矩阵
void Test_Rand()
{
    CvMat* a = cvCreateMat( 10, 6, CV_32F ); //生成10x6矩阵
    int i;
    printf("\n=== Test generating random matrix ===");
    for(i=0;i<5;i++)
    {
        GenRandn(a, i); //调用
        PrintMat(a);
    }
    cvReleaseMat(&a);
}
// 显示矩阵
void PrintMat(CvMat* A)
{
    int i,j;
    //printf("\nMatrix = :");
    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++) //列
                //获取2维数组的元素
                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");
}
//生成[0,1]区间均匀分布的随机矩阵
void GenRand(CvMat* arr, int seed)
{
    // let‘s noisy_screen be the floating-point 2d array that is to be "crapped" 
    CvRandState rng;

// initialize random generator
    rng.state = cvRNG(0xffffffff);
    cvRandInit( &rng,
        0, 1,      // use dummy parameters now and adjust them further 
        seed, // use input seed here 
        CV_RAND_UNI // specify uniform type 
        );
    //用随机数填充矩阵
    cvRandArr( &rng.state, arr, CV_RAND_UNI, cvRealScalar(0), cvRealScalar(1) );
    // RNG state does not need to be deallocated 
}
//生成标准正态分布的随机矩阵
void GenRandn(CvMat* arr, int seed)
{
    // let‘s noisy_screen be the floating-point 2d array that is to be "crapped" 
    CvRandState rng;

// modify RNG to make it produce normally distributed values
    rng.state = cvRNG(0xffffffff);
    cvRandInit( &rng,
        0, 1,      // use dummy parameters now and adjust them further 
        seed, // use input seed here 
        CV_RAND_NORMAL // specify uniform type 
        );
    // fill random numbers to arr, with mean zero and variance one 
    //注意标志CV_RAND_NORMAL是表示正态分布或高斯分布
    cvRandArr( &rng.state, arr, CV_RAND_NORMAL,
        cvRealScalar(0), // average intensity
        cvRealScalar(1)   // deviation of the intensity
        );
    // RNG state does not need to be deallocated 
}
// Test matrix multiply
void Test_Multiply() //main()函数第一个被调用
{
    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 ===");
    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);
    return;
}
// Get raw data from data buffer and pass them to a matrix
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 data ===");
    //cvInitMatHeader 初始化矩阵
    //CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type,void* data=NULL, int step=CV_AUTOSTEP );
    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++ )
        {
            //fabs---Calculates the absolute value of the floating-point argument
            //求绝对值
            data[x] = (float)fabs(data[x]);
            printf("%8.2f",data[x]);
        }
    }
    printf("\n");
    return;
}
// test 1-d and 2-d dct transform
void Test_DCT()
{
    float data[] = { 1, 2, 3, 4, 5, 6, 7, 8 };

CvMat a;
    a = cvMat(2,4,CV_32FC1,data);//2×4数组
    printf("\n=== Test DCT ===");
    printf("\nOriginal matrix = ");
    PrintMat(&a); //调用

//cvDCT 执行一维或者二维浮点数组的离散馀弦变换或者离散反馀弦变换
    cvDCT(&a, &a, CV_DXT_FORWARD);
    printf("\n2-D DCT = "); PrintMat(&a);//1D 或者 2D 馀弦变换

cvDCT(&a, &a, CV_DXT_INVERSE);
    printf("\n2-D IDCT = "); PrintMat(&a);//1D or 2D 反馀弦变换
}

http://www.verydemo.com/demo_c291_i6212.html

http://blog.csdn.net/cc1949/article/details/22476251 矩阵相乘multi

http://www.cnblogs.com/DreamUp/archive/2010/07/27/1786225.html  矩阵相乘的一些运算acm题 pku

时间: 2024-10-31 15:17:15

图像处理之 opencv 学习---矩阵的操作的相关文章

OpenCV 学习(像素操作 Manipuating the Pixels)

OpenCV 学习(像素操作 Manipuating the Pixels) OpenCV 虽然提供了许多类型的图像处理函数,可以对图像进行各种常见的处理,但是总会有些操作时没有的,这时我们就需要自己来操纵像素,实现我们需要的功能.今天就来讲讲 OpenCV 进行像素级操作的几种方法,并做个比较. 在 OpenCV 中,图像用矩阵来表示,对应的数据类型为 cv::Mat . cv::Mat 功能很强大,矩阵的元素可以为字节.字.浮点数.数组等多种形式.对于灰度图像,每个像素用一个 8 bit 字

OpenCV 学习(像素操作 2)

在上一个学习笔记中,简单介绍了访问图像像素的几种方法,并对这几种方法的效率进行了些简单的比较.但是更多的情况是我们要同时访问多个像素,经过较为复杂的运算才能得到我们希望的结果.今天就来讲讲这种情况如何处理. 同时访问多行像素数据 下面我们以laplace 锐化为例,Laplacian 算子写为矩阵形式如下: ???0?10?15?10?10??? 可以看到,计算当前点的输出时需要上下左右 4 邻近点的值.这时最简单的想法就是同时用三个指针,分别指向当前行.上一行和下一行.下面是个例子代码: vo

图像处理之 opencv 学习---opencv 中的常用算法

http://blog.csdn.net/lindazhou2005/article/details/1534234 文中有提到鲁棒性 http://blog.csdn.net/chary8088/article/details/24935559

OpenCV学习(3)--Mat矩阵的操作

CvMat的矩阵结构 1 typedef struct CvMat 2 { 3 //矩阵中元素的类型 4 int type; 5 //行数据长度 6 int step; 7 8 /* for internal use only */ 9 int* refcount; 10 int hdr_refcount; 11 12 //指向数据的指针 13 union 14 { 15 uchar* ptr; 16 short* s; 17 int* i; 18 float* fl; 19 double* d

opencv学习笔记(01)——操作图像的像素

1 #include <opencv2\core\core.hpp> 2 #include <opencv2\highgui\highgui.hpp> 3 #include <opencv2\imgproc\imgproc.hpp> 4 #include <iostream> 5 6 7 void salt(cv::Mat& image, int n) 8 { 9 10 for(int k=0; k<n; k++) 11 { 12 13 int

OpenCV 学习笔记(模板匹配)

OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够高时,就认为找到了我们的目标. 在 OpenCV 中,提供了相应的函数完成这个操作. matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置 在具体介绍这两个函数之前呢,我们还要介绍一个概念,就是如何来评价两

OpenCV学习笔记[5]FLANN特征匹配

OpenCV学习笔记:FLANN特征匹配 本次给出FLANN特征匹配的Java实现. [简介] 特征匹配记录下目标图像与待匹配图像的特征点(KeyPoint),并根据特征点集合构造特征量(descriptor),对这个特征量进行比较.筛选,最终得到一个匹配点的映射集合.我们也可以根据这个集合的大小来衡量两幅图片的匹配程度. 特征匹配与模板匹配不同,由于是计算特征点集合的相关度,转置操作对匹配影响不大,但它容易受到失真.缩放的影响. [特征匹配] FeatureMatching.java: imp

opencv学习笔记(七)SVM+HOG

opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度直方图来构成特征.Hog特征结合SVM分类器已经被广泛用于图像识别中,尤其在行人检测中获得了极大的成功.需要提醒的是,HOG+SVM进行行人检测的方法是法国研究院Dalal在2005的CVPR上提出的. 最近在做车标识别相关的研究,用到了SVM+HOG的方法进行识

OpenCV 学习(利用滤波器进行边缘提取)

OpenCV 学习(利用滤波器进行边缘提取) 通过低通滤波器,我们可以将图像平滑,相反的,利用高通滤波器可以提取出图像的边缘. Sobel 滤波器 Sobel 滤波器是一种有方向性的滤波器,可以作用在 X 方向或 Y 方向. 关于这种滤波器的理论介绍可以参考: https://en.wikipedia.org/wiki/Sobel_operator 函数原型如下: void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, i