`
rys5851968
  • 浏览: 155751 次
社区版块
存档分类
最新评论

OpenCV矩阵操作(二)2010-06-09 19:59OpenCV矩阵操作(二)

 
阅读更多

OpenCV矩阵操作(二)

#include "stdafx.h"
/*
功能:说明矩阵的一些操作方法
*/
#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(); // 二维序列排序

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 反馀弦变换

分享到:
评论

相关推荐

    opencv-4.1.2-android-sdk - Copy.rar

    5. **使用OpenCV API**:一旦OpenCV成功加载,你就可以通过它的Java或C++接口访问各种函数和类,进行图像处理操作。 6. **运行示例**:解压的文件中很可能包含了示例代码,你可以将它们导入到Android Studio中,...

    opencv-4.4.0-android-sdk.zip opencv Android版官网下载

    例如,你可以使用`Core`模块进行基本的矩阵操作,如像素级别的图像处理;使用`Imgproc`模块进行图像变换,如旋转、缩放、平移等;或者使用`Feature2D`模块进行特征点检测和匹配。 **示例应用** 在`OpenCV-android-...

    opencv-4.4.0-androidopencv-4.5.0-android-sdk

    OpenCV(开源计算机视觉库)是计算机视觉和机器学习领域的一个强大工具,广泛应用于图像处理、图像分析和识别等任务。在Android平台上,OpenCV提供了专门的SDK(软件开发工具包),使得开发者能够轻松地在Android...

    音视频资料-图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现.rar

    本资料“音视频资料-图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现”主要讲解了如何利用OpenCV和Python进行图像的仿射变换,并涉及组合变换矩阵的计算与应用。 首先,我们需要理解仿射变换的基本概念。在二...

    OpenCV矩阵操作借鉴.pdf

    OpenCV是一个广泛应用于计算机视觉和图像处理的开源库,它提供了丰富的函数来处理矩阵操作。在OpenCV中,矩阵是核心数据结构之一,用于表示图像或者其他多维数据。本篇文章将详细阐述OpenCV中涉及矩阵操作的一些关键...

    OpenCV-Python图像透视变换处理:魔变车牌案例.rar

    在OpenCV-Python图像处理领域,透视变换是一种强大的技术,常用于将图像转换为不同的视图,例如模拟鸟瞰图、纠正倾斜的图像或者在本案例中,改变图像的几何形状,比如对车牌进行“魔变”效果。透视变换允许我们将四...

    OpenCV常用的图像和矩阵操作总结

    OpenCV图像和矩阵操作总结 OpenCV是计算机视觉和机器学习领域中广泛应用的开源库,提供了大量的图像和矩阵操作函数。学习和掌握这些函数是编程和开发计算机视觉应用的基础。本文将对OpenCV中常用的图像和矩阵操作...

    opencv-2.4.9-0.8-linux(jar包).zip

    OpenCV的Java API提供了丰富的功能,如`HighGui`模块用于图像显示,`Core`模块提供了基本的矩阵操作,而`Imgproc`模块则包含了各种图像处理函数,如滤波、边缘检测和形态学操作。此外,`Feature2D`模块可以用来进行...

    OpenCV stitching_detailed.cpp解读

    在OpenCV库中,`stitching_detailed.cpp`是一个示例程序,它演示了如何使用OpenCV的图像拼接功能。本文将深入解析该程序的运行流程、接口选项以及代码分析。 一、stitching_detail程序运行流程 1. **命令行调用**...

    opencv 2.4.13.1 函数文档

    ### opencv 2.4.13.1 函数文档概览 #### 一、引言 本文档为OpenCV 2.4.13.1版本的参考手册,涵盖了该版本的所有核心功能与模块。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,支持多种...

    opencv中矩阵总结

    #### 一、OpenCV矩阵基础 **OpenCV**(Open Source Computer Vision Library)是一款开源的计算机视觉库,它包含了大量用于图像处理、视频分析及机器视觉的功能。其中,矩阵是OpenCV中最常用的数据结构之一,主要...

    OpenCvSharp调试图片可视化插件-OpenCvSharp.DebuggerVisualizers-v4.7-VS2022

    它是一个多维数组,可以表示单通道或多通道图像,支持各种图像操作如矩阵运算、滤波、变换等。在调试过程中,直接查看Mat对象可能很困难,因为它们通常包含大量的像素数据,不易理解。 DebuggerVisualizers是Visual...

    opencv-4.10.0-Linux-aarch64

    1. 基本模块:包括数据结构、数组操作、矩阵操作、图像处理、视频处理、图形处理等。 2. 高级模块:涵盖了对象检测、特征提取、人脸识别、动作识别、运动分析等。 3. 2D特征模块:提供了角点检测、边缘检测、特征...

    opencv-4.8.1-windows.exe

    这个"opencv-4.8.1-windows.exe"文件是OpenCV的4.8.1版本,针对Windows操作系统的预编译二进制安装程序。通过运行这个exe文件,用户可以在Windows环境下快速便捷地安装OpenCV库,无需手动编译源代码。 OpenCV包含了...

    Hands-On-GPU-Accelerated-Computer-Vision-with-OpenCV-and-CUDA-master.zip

    《实战GPU加速计算机视觉:基于OpenCV与CUDA》是一本深度探讨如何利用现代GPU的强大计算能力来提升计算机视觉算法性能的书籍。通过使用OpenCV库和CUDA编程接口,读者可以学习到如何编写高效的并行代码,实现图像处理...

    OpenCV 2.2 Reference Manual

    ### OpenCV 2.2 参考手册:核心功能与数组操作详解 #### 一、OpenCV 2.2 概览 OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉库,广泛应用于图像处理、视频分析、模式识别等领域。OpenCV ...

    OpenCV Reference Manual v2.1 (March 18, 2010)

    ### OpenCV v2.1 参考手册知识点详解 #### 一、基本概念与结构 **1.1 基本结构** OpenCV(Open Source Computer Vision Library)是一款开源计算机视觉库,支持多种编程语言,如C++、Python等。在OpenCV中,基本...

Global site tag (gtag.js) - Google Analytics