文档视界 最新最全的文档下载
当前位置:文档视界 › OpenCV学习之CvMat的用法详解及实例

OpenCV学习之CvMat的用法详解及实例

OpenCV学习之CvMat的用法详解及实例
OpenCV学习之CvMat的用法详解及实例

OpenCV学习之CvMat的用法详解及实例

目录

1.初始化矩阵: (2)

2.IplImage 到cvMat的转换 (2)

3.cvArr(IplImage或者cvMat)转化为cvMat (2)

4.图像直接操作 (3)

5.cvMat的直接操作 (3)

6.间接访问cvMat (5)

7.修改矩阵的形状——cvReshape的操作 (6)

8.计算色彩距离 (8)

CvMat是OpenCV比较基础的函数。初学者应该掌握并熟练应用。但是我认为计算机专业学习的方法是,不断的总结并且提炼,同时还要做大量的实践,如编码,才能记忆深刻,体会深刻,从而引导自己想更高层次迈进。

1.初始化矩阵:

方式一、逐点赋值式:

CvMat* mat = cvCreateMat( 2, 2, CV_64FC1 );

cvZero( mat );

cvmSet( mat, 0, 0, 1 );

cvmSet( mat, 0, 1, 2 );

cvmSet( mat, 1, 0, 3 );

cvmSet( mat, 2, 2, 4 );

cvReleaseMat( &mat );

方式二、连接现有数组式:

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

5, 6, 7, 8,

9, 10, 11, 12 };

CvMat mat = cvMat( 3, 4, CV_64FC1, a ); // 64FC1 for double

// 不需要cvReleaseMat,因为数据内存分配是由double定义的数组进行的。

2.IplImage 到cvMat的转换

方式一、cvGetMat方式:

CvMat mathdr, *mat = cvGetMat( img, &mathdr );

方式二、cvConvert方式:

CvMat *mat = cvCreateMat( img->height, img->width, CV_64FC3 ); cvConvert( img, mat );

// #define cvConvert( src, dst ) cvConvertScale( (src), (dst), 1, 0 ) 3.cvArr(IplImage或者cvMat)转化为cvMat

方式一、cvGetMat方式:

int coi = 0;

cvMat *mat = (CvMat*)arr;

if( !CV_IS_MAT(mat) )

{

mat = cvGetMat( mat, &matstub, &coi );

if (coi != 0) reutn; // CV_ERROR_FROM_CODE(CV_BadCOI);

}

写成函数为:

// This is just an example of function

// to support both IplImage and cvMat as an input

CVAPI( void ) cvIamArr( const CvArr* arr )

{

CV_FUNCNAME( "cvIamArr" );

__BEGIN__;

CV_ASSERT( mat == NULL );

CvMat matstub, *mat = (CvMat*)arr;

int coi = 0;

if( !CV_IS_MAT(mat) )

{

CV_CALL( mat = cvGetMat( mat, &matstub, &coi ) );

if (coi != 0) CV_ERROR_FROM_CODE(CV_BadCOI);

}

// Process as cvMat

__END__;

}

4.图像直接操作

方式一:直接数组操作 int col, row, z;

uchar b, g, r;

for( y = 0; row < img->height; y++ )

{

for ( col = 0; col < img->width; col++ )

{

b = img->imageData[img->widthStep * row + col * 3]

g = img->imageData[img->widthStep * row + col * 3 + 1];

r = img->imageData[img->widthStep * row + col * 3 + 2];

}

}

方式二:宏操作:

int row, col;

uchar b, g, r;

for( row = 0; row < img->height; row++ )

{

for ( col = 0; col < img->width; col++ )

{

b = CV_IMAGE_ELEM( img, uchar, row, col * 3 );

g = CV_IMAGE_ELEM( img, uchar, row, col * 3 + 1 );

r = CV_IMAGE_ELEM( img, uchar, row, col * 3 + 2 );

}

}

注:CV_IMAGE_ELEM( img, uchar, row, col * img->nChannels + ch ) 5.cvMat的直接操作

数组的直接操作比较郁闷,这是由于其决定于数组的数据类型。

对于CV_32FC1 (1 channel float):

CvMat* M = cvCreateMat( 4, 4, CV_32FC1 );

M->data.fl[ row * M->cols + col ] = (float)3.0;

对于CV_64FC1 (1 channel double):

CvMat* M = cvCreateMat( 4, 4, CV_64FC1 );

M->data.db[ row * M->cols + col ] = 3.0;

一般的,对于1通道的数组:

CvMat* M = cvCreateMat( 4, 4, CV_64FC1 );

CV_MAT_ELEM( *M, double, row, col ) = 3.0;

注意double要根据数组的数据类型来传入,这个宏对多通道无能为力。

对于多通道:

看看这个宏的定义:#define CV_MAT_ELEM_CN( mat, elemtype, row, col ) \ (*(elemtype*)((mat).data.ptr + (size_t)(mat).step*(row) + sizeof(elemtype)*(col)))

if( CV_MAT_DEPTH(M->type) == CV_32F )

CV_MAT_ELEM_CN( *M, float, row, col * CV_MAT_CN(M->type) + ch ) = 3.0; if( CV_MAT_DEPTH(M->type) == CV_64F )

CV_MAT_ELEM_CN( *M, double, row, col * CV_MAT_CN(M->type) + ch ) = 3.0;

更优化的方法是:

#define CV_8U 0

#define CV_8S 1

#define CV_16U 2

#define CV_16S 3

#define CV_32S 4

#define CV_32F 5

#define CV_64F 6

#define CV_USRTYPE1 7

int elem_size = CV_ELEM_SIZE( mat->type );

for( col = start_col; col < end_col; col++ ) {

for( row = 0; row < mat->rows; row++ ) {

for( elem = 0; elem < elem_size; elem++ ) {

(mat->data.ptr + ((size_t)mat->step * row) + (elem_size * col))[elem] =

(submat->data.ptr + ((size_t)submat->step * row) + (elem_size * (col - start_col)))[elem];

}

}

}

对于多通道的数组,以下操作是推荐的:

for(row=0; row< mat->rows; row++)

{

p = mat->data.fl + row * (mat->step/4);

for(col = 0; col < mat->cols; col++)

{

*p = (float) row+col;

*(p+1) = (float) row+col+1;

*(p+2) =(float) row+col+2;

p+=3;

}

}

对于两通道和四通道而言:

CvMat* vector = cvCreateMat( 1, 3, CV_32SC2 );

CV_MAT_ELEM( *vector, CvPoint, 0, 0 ) = cvPoint(100,100);

CvMat* vector = cvCreateMat( 1, 3, CV_64FC4 );

CV_MAT_ELEM( *vector, CvScalar, 0, 0 ) = cvScalar(0,0,0,0);

6.间接访问cvMat

cvmGet/Set是访问CV_32FC1 和 CV_64FC1型数组的最简便的方式,其访问速度和直接访问几乎相同

cvmSet( mat, row, col, value );

cvmGet( mat, row, col );

举例:打印一个数组

inline void cvDoubleMatPrint( const CvMat* mat )

{

int i, j;

for( i = 0; i < mat->rows; i++ )

{

for( j = 0; j < mat->cols; j++ )

{

printf( "%f ",cvmGet( mat, i, j ) );

}

printf( "\n" );

}

}

而对于其他的,比如是多通道的后者是其他数据类型的,cvGet/Set2D是个不错的选择

CvScalar scalar = cvGet2D( mat, row, col );

cvSet2D( mat, row, col, cvScalar( r, g, b ) );

注意:数据不能为int,因为cvGet2D得到的实质是double类型。

举例:打印一个多通道矩阵:

inline void cv3DoubleMatPrint( const CvMat* mat )

{

int i, j;

for( i = 0; i < mat->rows; i++ )

{

for( j = 0; j < mat->cols; j++ )

{

CvScalar scal = cvGet2D( mat, i, j );

printf( "(%f,%f,%f) ", scal.val[0], scal.val[1], scal.val[2] );

}

printf( "\n" );

}

}

7.修改矩阵的形状——cvReshape的操作

经实验表明矩阵操作的进行的顺序是:首先满足通道,然后满足列,最后是满足行。

注意:这和Matlab是不同的,Matlab是行、列、通道的顺序。

我们在此举例如下:

对于一通道:

// 1 channel

CvMat *mat, mathdr;

double data[] = { 11, 12, 13, 14,

21, 22, 23, 24,

31, 32, 33, 34 };

CvMat* orig = &cvMat( 3, 4, CV_64FC1, data );

//11 12 13 14

//21 22 23 24

//31 32 33 34

mat = cvReshape( orig, &mathdr, 1, 1 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

// 11 12 13 14 21 22 23 24 31 32 33 34

mat = cvReshape( mat, &mathdr, 1, 3 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

//11 12 13 14

//21 22 23 24

//31 32 33 34

mat = cvReshape( orig, &mathdr, 1, 12 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

// 11

// 12

// 13

// 14

// 21

// 22

// 23

// 24

// 31

// 32

// 33

// 34

mat = cvReshape( mat, &mathdr, 1, 3 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

//11 12 13 14

//21 22 23 24

//31 32 33 34

mat = cvReshape( orig, &mathdr, 1, 2 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

//11 12 13 14 21 22

//23 24 31 32 33 34

mat = cvReshape( mat, &mathdr, 1, 3 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

//11 12 13 14

//21 22 23 24

//31 32 33 34

mat = cvReshape( orig, &mathdr, 1, 6 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

// 11 12

// 13 14

// 21 22

// 23 24

// 31 32

// 33 34

mat = cvReshape( mat, &mathdr, 1, 3 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

//11 12 13 14

//21 22 23 24

//31 32 33 34

// Use cvTranspose and cvReshape( mat, &mathdr, 1, 2 ) to get // 11 23

// 12 24

// 13 31

// 14 32

// 21 33

// 22 34

// Use cvTranspose again when to recover

对于三通道

// 3 channels

CvMat mathdr, *mat;

double data[] = { 111, 112, 113, 121, 122, 123,

211, 212, 213, 221, 222, 223 };

CvMat* orig = &cvMat( 2, 2, CV_64FC3, data );

//(111,112,113) (121,122,123)

//(211,212,213) (221,222,223)

mat = cvReshape( orig, &mathdr, 3, 1 ); // new_ch, new_rows

cv3DoubleMatPrint( mat ); // above

// (111,112,113) (121,122,123) (211,212,213) (221,222,223)

// concatinate in column first order

mat = cvReshape( orig, &mathdr, 1, 1 );// new_ch, new_rows cvDoubleMatPrint( mat ); // above

// 111 112 113 121 122 123 211 212 213 221 222 223

// concatinate in channel first, column second, row third

mat = cvReshape( orig, &mathdr, 1, 3); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

//111 112 113 121

//122 123 211 212

//213 221 222 223

// channel first, column second, row third

mat = cvReshape( orig, &mathdr, 1, 4 ); // new_ch, new_rows cvDoubleMatPrint( mat ); // above

//111 112 113

//121 122 123

//211 212 213

//221 222 223

// channel first, column second, row third

// memorize this transform because this is useful to

// add (or do something) color channels

CvMat* mat2 = cvCreateMat( mat->cols, mat->rows, mat->type ); cvTranspose( mat, mat2 );

cvDoubleMatPrint( mat2 ); // above

//111 121 211 221

//112 122 212 222

//113 123 213 223

cvReleaseMat( &mat2 );

8.计算色彩距离

我们要计算img1,img2的每个像素的距离,用dist表示,定义如下

IplImage *img1 = cvCreateImage( cvSize(w,h), IPL_DEPTH_8U, 3 ); IplImage *img2 = cvCreateImage( cvSize(w,h), IPL_DEPTH_8U, 3 ); CvMat *dist = cvCreateMat( h, w, CV_64FC1 );

比较笨的思路是:cvSplit->cvSub->cvMul->cvAdd

代码如下:

IplImage *img1B = cvCreateImage( cvGetSize(img1), img1->depth, 1 ); IplImage *img1G = cvCreateImage( cvGetSize(img1), img1->depth, 1 ); IplImage *img1R = cvCreateImage( cvGetSize(img1), img1->depth, 1 ); IplImage *img2B = cvCreateImage( cvGetSize(img1), img1->depth, 1 ); IplImage *img2G = cvCreateImage( cvGetSize(img1), img1->depth, 1 ); IplImage *img2R = cvCreateImage( cvGetSize(img1), img1->depth, 1 ); IplImage *diff = cvCreateImage( cvGetSize(img1), IPL_DEPTH_64F, 1 );

cvSplit( img1, img1B, img1G, img1R );

cvSplit( img2, img2B, img2G, img2R );

cvSub( img1B, img2B, diff );

cvMul( diff, diff, dist );

cvSub( img1G, img2G, diff );

cvMul( diff, diff, diff);

cvAdd( diff, dist, dist );

cvSub( img1R, img2R, diff );

cvMul( diff, diff, diff );

cvAdd( diff, dist, dist );

cvReleaseImage( &img1B );

cvReleaseImage( &img1G );

cvReleaseImage( &img1R );

cvReleaseImage( &img2B );

cvReleaseImage( &img2G );

cvReleaseImage( &img2R );

cvReleaseImage( &diff );

比较聪明的思路是

int D = img1->nChannels; // D: Number of colors (dimension)

int N = img1->width * img1->height; // N: number of pixels

CvMat mat1hdr, *mat1 = cvReshape( img1, &mat1hdr, 1, N ); // N x D(colors) CvMat mat2hdr, *mat2 = cvReshape( img2, &mat2hdr, 1, N ); // N x D(colors) CvMat diffhdr, *diff = cvCreateMat( N, D, CV_64FC1 ); // N x D, temporal buff

cvSub( mat1, mat2, diff );

cvMul( diff, diff, diff );

dist = cvReshape( dist, &disthdr, 1, N ); // nRow x nCol to N x 1 cvReduce( diff, dist, 1, CV_REDUCE_SUM ); // N x D to N x 1

dist = cvReshape( dist, &disthdr, 1, img1->height ); // Restore N x 1 to nRow x nCol

cvReleaseMat( &diff );

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

#include "cv.h"

#include

int main()

{

CvMat* mat = cvCreateMat(3,3,CV_32FC1);

cvZero(mat);//将矩阵置0

//为矩阵元素赋值

CV_MAT_ELEM( *mat, float, 0, 0 ) = 1.f;

CV_MAT_ELEM( *mat, float, 0, 1 ) = 2.f;

CV_MAT_ELEM( *mat, float, 0, 2 ) = 3.f;

CV_MAT_ELEM( *mat, float, 1, 0 ) = 4.f;

CV_MAT_ELEM( *mat, float, 1, 1 ) = 5.f;

CV_MAT_ELEM( *mat, float, 1, 2 ) = 6.f; CV_MAT_ELEM( *mat, float, 2, 0 ) = 7.f; CV_MAT_ELEM( *mat, float, 2, 1 ) = 8.f; CV_MAT_ELEM( *mat, float, 2, 2 ) = 9.f; //获得矩阵元素(0,2)的值

float *p = (float*)cvPtr2D(mat, 0, 2); printf("%f\n",*p);

return 0;

}

OpenCV 2.4.4安装与配置

OpenCV 2.4.4 安装与配置 步骤一:安装OpenCV https://www.docsj.com/doc/b86082555.html,/projects/opencvlibrary/files/opencv-win/2.4.4/ 1.从以上地址下载OpenCV 2.4.4,执行exe文件,将文件安装到所需目录。 2.建立环境变量并添加到系统路径(以将文件安装在D:\opencv为例): i) 右键点击桌面的计算机图标,选择“属性”,跳出如下窗口:

ii) 点击“高级系统设置”,跳出如下窗口:

iii) 点击“高级”选项卡下的“环境变量”,跳出如下窗口:

iv) 点击“系统变量”下的“新建”,“变量名”输入OPENCV_BUILD,“变量值”输入D:\opencv\build(如果OpenCV解压在别的目录,请输入该目录路径。比如,如果在C盘ProgramFiles文件夹建立了名为OpenCV的文件夹,并在其中解压,那么输入的目录就为 C:\ProgramFiles\OpenCV\opencv\build,总之目录一直到build文件夹),点击“确定”。 v) 双击“用户变量”中的PATH,在跳出的窗口中输入变量值为%OPENCV_BUILD%\x86\vc10\bin (如果电脑是64位系统的,请把“x86”改为“x64”;并请确保使用的是VS 2010,因为vc10 文件夹针对的是VS 2010)。

步骤二:在VS2010中配置OpenCV 1. 打开VS 2010,新建一个项目(Win32控制台或MFC 都可以)。 2. 建立Debug 属性表。 i) 点击“视图”菜单中的“属性管理器”。

基于OpenCv的图像识别

基于2DPCA的人脸识别算法研究 摘要 人脸识别技术是对图像和视频中的人脸进行检测和定位的一门模式识别技术,包含位置、大小、个数和形态等人脸图像的所有信息。由于近年来计算机技术的飞速发展,为人脸识别技术的广泛应用提供了可能,所以图像处理技术被广泛应用了各种领域。该技术具有广阔的前景,如今已有大量的研究人员专注于人脸识别技术的开发。本文的主要工作内容如下: 1)介绍了人脸识别技术的基础知识,包括该技术的应用、背景、研究方向以及 目前研究该技术的困难,并对人脸识别系统的运行过程以及运行平台作了简单的介绍。 2)预处理工作是在原始0RL人脸库上进行的。在图像的预处理阶段,经过了图 象的颜色处理,图像的几何归一化,图像的均衡化和图象的灰度归一化四个过程。所有人脸图像通过上述处理后,就可以在一定程度上减小光照、背景等一些外在因素的不利影响。 3)介绍了目前主流的一些人脸检测算法,本文采用并详细叙述了Adaboost人脸 检测算法。Adaboost算法首先需要创建人脸图像的训练样本,再通过对样本的训练,得到的级联分类器就可以对人脸进行检测。 4)本文介绍了基于PCA算法的人脸特征点提取,并在PCA算法的基础上应用了 改进型的2DPCA算法,对两者的性能进行了对比,得出后者的准确度和实时性均大于前者,最后将Adaboost人脸检测算法和2DPCA算法结合,不仅能大幅度降低识别时间,而且还相互补充,有效的提高了识别率。 关键词:人脸识别 2DPCA 特征提取人脸检测

2DPCA Face Recognition Algorithm Based on The Research Abstract:Face recognition is a technology to detect and locate human face in an image or video streams,Including location, size, shape, number and other information of human face in an image or video streams.Due to the rapid development of computer operation speed makes the image processing technology has been widely applied in many fields in recent years. This paper's work has the following several aspects: 1)Explained the background, research scope and method of face recognition,and introduced the theoretical method of face recognition field in general. 2)The pretreatments work is based on the original ORL face database. In the image preprocessing stage, there are the color of the image processing, image geometric normalization, image equalization and image gray scale normalization four parts. After united processing, the face image is standard, which can eliminate the adverse effects of some external factors. 3)All kinds of face detection algorithm is introduced, and detailed describing the Adaboost algorithm for face detection. Through the Adaboost algorithm to create a training sample,then Training the samples of face image,and obtaining the cascade classifier to detect human face. 4)This paper introduces the facial feature points extraction based on PCA ,and 2DPCA is used on the basis of the PCA as a improved algorithm.Performance is compared between the two, it is concluds that the real time and accuracy of the latter is greater than the former.Finally the Adaboost face detection algorithm and 2DPCA are combined, which not only can greatly reduce the recognition time, but also complement each other, effectively improve the recognition rate. Key words:Face recognition 2DPCA Feature extraction Face detection

OPENCV 2.4.10安装

一、VS2020安装opencv2.4.10 1.1首先安装vs2010 安装这个就不用多谈了 1.2下载opencv- 2.4.10.exe,并解压到 最后会在 1.3添加系统变量 在系统变量path后添加:C:\opencv\opencv\build\x86\vc10\bin 1.4新建vc++控制台工程项目,配置 1.4.1项目属性->配置属性->VC++目录->包含目录 添加 C:\opencv\opencv\build\include C:\opencv\opencv\build\include\opencv C:\opencv\opencv\build\include\opencv2

1.4.2项目属性->配置属性->VC++目录->引用目录 添加 C:\opencv\opencv\build\x86\vc10\lib 1.4.3项目属性->链接器->输入->附加依赖项 在debug模式下添加 配置方案为Debug的配置,添加:(2410代表我的opencv版本是2.4.10,需要对应更改) opencv_calib3d2410d.lib opencv_contrib2410d.lib opencv_core2410d.lib opencv_features2d2410d.lib

opencv_flann2410d.lib opencv_gpu2410d.lib opencv_highgui2410d.lib opencv_imgproc2410d.lib opencv_legacy2410d.lib opencv_ml2410d.lib opencv_nonfree2410d.lib opencv_objdetect2410d.lib opencv_ocl2410d.lib opencv_photo2410d.lib opencv_stitching2410d.lib opencv_superres2410d.lib opencv_ts2410d.lib opencv_video2410d.lib opencv_videostab2410d.lib 配置方案为Release的配置,添加: opencv_calib3d2410.lib opencv_contrib2410.lib opencv_core2410.lib opencv_features2d2410.lib opencv_flann2410.lib opencv_gpu2410.lib opencv_highgui2410.lib opencv_imgproc2410.lib opencv_legacy2410.lib opencv_ml2410.lib opencv_nonfree2410.lib opencv_objdetect2410.lib opencv_ocl2410.lib opencv_photo2410.lib opencv_stitching2410.lib opencv_superres2410.lib opencv_ts2410.lib opencv_video2410.lib opencv_videostab2410.lib

vs2010下配置OpenCV

以下配置方法仅属于个人见解;若有什么不对的地方请指教啊。 在完成每一步骤后,记住点击?确定?,以确保你的设置成功。 在某些步骤中注意要在Debug 和Release 分别进行配置。 1.首先是下载VS2010并安装,这里不作赘述;(安装目录: D:\\Program Files\Microsoft Visual Studio 10.0) 2.下载并安装OpenCV,我的版本是2.1(安装目录为D:\Program Files\OpenCV2.1)注意将路径添加至Path中 3.下载并安装CMake,下载版本为Windows(Win32 Installer),安装目录为D:\Program Files\CMake 2.8 4.运行cmake-gui(D:\Program Files\CMake 2.8\bin),设置路径为OpenCV安装路径(本文档假定安装位置为:D:\Program Files\OpenCV2.1),并创建子目录D:\Program Files\OpenCV2.1\vs2010,用于存放编译结果。将数据填入指定文本框中

5.点击?Configure?,在弹出对话框中选中Visual Studio 10.0;单选框中选项选择程序默认的;然后点击Fnish;程序会自动完成 ?Configure Done?; 6.然后点击?configure?,接着点击?Generate?。程序完成?Generate Done?。 7.完成以上步骤后,将在D:\Program Files\OpenCV2.1|vs2010目录下生成OpenCV.sln的VC Solution File,接着请用vs2010打开OpenCV.sln,完成以下操作:

基于opencV的动态背景下运动目标检测及跟踪(修改版)

基于openCV的动态背景下的运动目标检测 摘要:介绍在动态背景下对视频图像序列进行运动目标的检测,主要包括三个步骤,分别是运动估计,运动补偿和目标检测。在运动估计中采用的主要是基于特征点匹配算法。这种算法与传统的块匹配算法最大的好处在于它的数据量少,计算简单迅速而且图像的匹配可靠性更高。最后用计算机视觉类库openCV进行实现。 关键词:运动目标检测;openCV;特征点匹配 Moving Object Detection in the Dynamic Background Based on openCV Abstract:Introducing a moving object detection algorithm of the dynamic background in the video image sequence,which includes three steps. They are motion estimation, motion compensation and object detection. At the motion estimation, we take an algorithm based on the feature points matching. The advantages of this algorithm is that it needs fewer data and indicates faster calculating speed compared to the block matching algorithm. What’s more, the matching of the video image sequence is more reliable. Then used openCV realized the algorithm. Keywords: moving object detection; openCV; feature points matching 引言 在生活中摄像头可以说随处可见,我们经常需要对视频中的运动目标进行相关操作,这就设涉及到了对运动目标的检测及跟踪。作为视觉领域的一部分,它不仅对我们的生活,在军事,医学等各种领域里都有着广泛的影响。 所谓运动目标的检测就是在一段序列图像中检测出变化区域,并将运动目标从背景图像中提取出来[2],它是基础,能否正确的检测与分割出运动目标对后续的工作有着巨大的影响。常见的运动目标检测方法有:背景差分法,帧差法,累积差分法,光流法。本文主要介绍的是一种在动态背景下对运动目标进行检测的算法。 检测算法介绍 检测算法有很多种,不同的算法有他们各自的利与弊。背景差分法:是事先将背景图像存储下来,再与观测图像进行差分运算,实现对运动区域的检测。这种方法能得到较为完整的运动目标信息,但背景图像必须随着外部条件比如光照等的变化而不断更新,所以背景模型的获取和更新比较麻烦。帧差法:直接比较相邻两帧图像对应像点的灰度值的不同,然后通过阈值来提取序列图像中的运动区域[2]。这种方法更新速度快,算法简单易实现,适应性强,不需要获取背景图像。但是背景与运动目标间需要有一定程度的灰度差,否则可能在目标内部产生空洞,不能完整的提取出运动目标。为了改进相邻两帧间的差分效果,人们提出了累积差分法。累积差分法是利用三帧图像计算两个差分图像,再令其对应像素相乘的算法。它通过分析整个图像序列的变化来检测小位移或缓慢运动的物体。光流法是在时间上连续的两幅图想中,用向量来表示移动前后的对应点,在适当平滑性约束的条件下,根据图像序列的时空梯度估计运动场,通过分析运动场的变化对运动目标和场景进行检测和分割。 上面的几种算法都是基于静态背景下的方法,下面主要介绍动态背景下运动目标的检测。 因为生活中我们在很多情况下背景图像都不是静态的,有时摄像机都是安装在一个运动

opencv配置

VS2010 + OpenCV2.3配置 ; 在VS2010下安装配置OpenCV2.3 ; 全程截图,绝对能配置好,不能的留言! 操作系统:Windows 7 x86 中文旗舰版; 编译环境:Visual Studio 2010 中文旗舰版; OpenCV版本:OpenCV-2.3.0-win、OpenCV-2.3.1-win; 备注: a、不需要Cmake编译!! b、如果是最新的2.3.1版本,则将下面第5步中的(5)和(6)中的名为230的lib 修改成231即可,否则会出现找不到lib的情况。 c、不分x86和x64版本,一律按照这个方案配置就可以使用。 d、C#开发环境下的配置方法: https://www.docsj.com/doc/b86082555.html,/mvp_xuan/blog/item/7e6f6d8c4d34be09b31bb aa9.html?timeStamp=1316746687080 e、第5步属于“项目属性配置”,意思是:“每次新建或新打开一个项目,都需要重新配置”。1-4步是系统配置,一次性工程。 1、下载OpenCV(必须要superpack.exe) https://www.docsj.com/doc/b86082555.html,/download/OpenCV-2.3.0-win-superpack.exe 2、安装 解压到D盘根目录下。(位置随便,不过下面的path需要根据实际情况自行修改了。) 3、设置系统环境变量 在用户变量处,新建PATH和OPENCV两个项: ———————————————————— PATH (只需添加下面中的一行,根据系统情况自行选择) D:\OpenCV2.3\build\x86\vc10\bin ———————————————————— OPENCV D:\OpenCV2.3\build ————————————————————

基于opencv对图像的预处理

基于opencv 对图像的预处理 1.问题描述 本次设计是基于opencv 结合c++语言实现的对图像的预处理,opencv 是用于开发实时的图像处理、计算机视觉及模式识别程序;其中图像的预处理也就是利用opencv 对图像进行简单的编辑操作;例如对图像的对比度、亮度、饱和度进行调节,同时还可以对图像进行缩放和旋转,这些都是图像预处理简单的处理方法;首先通过opencv 加载一幅原型图像,显示出来;设置五个滑动控制按钮,当拖动按钮时,对比度、亮度、饱和度的大小也会随之改变,也可以通过同样的方式调节缩放的比例和旋转的角度,来控制图像,对图像进行处理,显示出符合调节要求的图像,进行对比观察他们的之间的变化。 2.模块划分 此次设计的模块分为五个模块,滑动控制模块、对比度和亮度调节模块、饱和度调节模块、缩放调节模块、旋转调节模块,他们之间的关系如下所示: 图一、各个模块关系图 调用 调用 调用 调用 滑动控制模块 对比度和亮度调节模块 饱和度调节模块 缩放调节模块 旋转调节模块

滑动控制模块处于主函数之中,是整个设计的核心部分,通过createTrackbar创建五个滑动控制按钮并且调用每个模块实现对图像相应的调节。 3.算法设计 (1)滑动控制: 滑动控制是整个设计的核心部分,通过创建滑动控制按钮调节大小来改变相应的数据,进行调用函数实现对图像的编辑,滑动控制是利用createTrackbar(),函数中包括了滑动控制的名称,滑动控制显示在什么窗口上,滑动变量的地址和它调节的最大围,以及每个控制按钮应该调用什么函数实现什么功能; (2)对比度和亮度的调节: 对比度和亮度的调节的原理是依照线性理论,它的公式如下所示:g(x)=a* f(x) +b,其中f(x)表示源图像的像素,g(x)表示输出图像的像素,参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度,参数b通常被称为偏置(bias),常常被用来控制图像的亮度; (3)饱和度的调节: 饱和度调节利用cvCvtColor( src_image, dst_image, CV_BGR2HSV )将RGB 颜色空间转换为HSV颜色空间,其中“H=Hue”表示色调,“S=Saturation”表示饱和度,“V=Value ”表示纯度;所以饱和度的调节只需要调节S的大小,H 和V的值不需要做任何的改变; (4)旋转的调节: 旋转是以某参考点为圆心,将图像的个点(x,y)围绕圆心转动一个逆时针角度θ,变为新的坐标(x1,y1),x1=rcos(α+θ),y1=rsin(α+θ),其中r是图像的极径,α是图像与水平的坐标的角度的大小; (5)缩放的调节: 首先得到源图像的宽度x和高度y,变换后新的图像的宽度和高度分别为x1和y1,x1=x*f,y1=y*f,其中f是缩放因子; 4.函数功能描述 (1)主函数main()用来设置滑动控制按钮,当鼠标拖动按钮可以得到相应的数据大小,实现手动控制的功能,当鼠标拖动对比度和亮度调节是,主函数调用

快速学习OPENCV常用函数

访问图像元素如下: 1、针对各种图像(包括4-通道)和矩阵的函数(cvGet2D,cvSet2D),但是它们都很慢. (img->origin=IPL_ORIGIN_TL)或者是左下角(img->origin=IPL_ORIGIN_BL) 假设有8-bit1-通道的图像I(IplImage*img): I(x,y)~((uchar*)(img->imageData+img->widthStep*y))[x] 假设有8-bit3-通道的图像I(IplImage*img): I(x,y)blue~((uchar*)(img->imageData+img->widthStep*y))[x*3] I(x,y)green~((uchar*)(img->imageData+img->widthStep*y))[x*3+1] I(x,y)red~((uchar*)(img->imageData+img->widthStep*y))[x*3+2] 如果增加点(100,100)的亮度30,那么可以: CvPoint pt={100,100}; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3]+=30; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+1]+=30; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+2]+=30; CvPoint pt={100,100}; uchar*temp_ptr=&((uchar*)(img->imageData+ img->widthStep*pt.y))[x*3]; temp_ptr[0]+=30; temp_ptr[1]+=30; temp_ptr[2]+=30; 假设有32-bit浮点数,1-通道图像I(IplImage*img): I(x,y)~((float*)(img->imageData+img->widthStep*y))[x] 现在,通用方法:假设有N-通道,类型为T的图像: I(x,y)c~((T*)(img->imageData+img->widthStep*y))[x*N+c] 或者你可使用宏CV_IMAGE_ELEM(image_header,elemtype,y,x_Nc) I(x,y)c~CV_IMAGE_ELEM(img,T,y,x*N+c) 2、访问矩阵元素 设有32-bit浮点数的实数矩阵M(CvMat*mat): M(i,j)~((float*)(mat->data.ptr+mat->step*i))[j] 设有64-bit浮点数的复数矩阵M(CvMat*mat): Re M(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2] Im M(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2+1]

Visual Studio2012环境下配置OpenCV_v2.4.10的步骤

Visual Studio2012环境下配置OpenCV的步骤 2014/12/16 本文将针对Visual Studio2012环境下如何配置OpenCV做出说明,具体如下。 1.下载和安装OpenCV SDK 1.1资源下载 在OpenCV官网https://www.docsj.com/doc/b86082555.html, SDK安装包。对应自己的操作系统,可以下载Windows,Linux/Mac和ios版本。目前官网已经给出OpenCV v3.0bata版本。本文中以OpenCV v2.4.10版本为例进行安装。(各个版本安装过程大体相同,后面将针对不同之处给出说明) 1.2资源安装 下载的OpenCV SDK的后缀名为exe,是一个解压安装程序。双击后会提示设置解压路径,推荐路径D:\Program Files。(因为OpenCV项目文件打包的时候,根目录就是opencv,所以我们不需要额外的新建一个名为opencv的文件夹然后再解压,那是多此一举的事情)然后点击Extract按钮,进行安装。 2.环境变量和路径设置 打开计算机→属性→高级系统设置,在高级目录下单击环境变量按钮,打开环境变量设置对话框。

2.1用户变量设置 在用户变量(此处为lbs的用户变量中)添加两个变量。 新建opencv变量,变量值设置为D:\Program Files\opencv\build。 新建path变量,变量值设置为D:\Program Files\opencv\build\x86\vc11\bin。此处如果已存在path变量,仅需对其变量值修改就行,在后面加上上述路径,但需要用分号和前面的路径隔开(英文半角下的分号) 2.2系统变量设置 在原有的path变量中对变量值修改,在变量值的最后加上D:\Program Files\opencv\build\x86\vc11\bin路径,注意要使用英文半角下的分号和前面的路径隔开。 ※说明 (1)不论电脑是32位还是64位,上述路径中均以x86路径输入,因为创建的程序中默认是在使用win32编译器进行编译。 (2)路径修改后需要重启电脑才能生效。 3.工程项目属性设置 工程项目属性配置主要是指对Debug和Release环境下的工程属性进行修改(通过修改https://www.docsj.com/doc/b86082555.html,er文件进行)。查阅相关资料,发现Visual Studio 2012中已经不再区分Debug和Release的https://www.docsj.com/doc/b86082555.html,er文件,所以配置了Debug或Release中的任

opencv矩阵操作学习资料

o p e n c v矩阵操作

通用矩阵乘法 void cvGEMM( const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0 ); #define cvMatMulAdd( src1, src2, src3, dst ) cvGEMM( src1, src2, 1, src3, 1, dst, 0 ) #define cvMatMul( src1, src2, dst ) cvMatMulAdd( src1, src2, 0, dst ) src1 第一输入数组 src2 第二输入数组 src3 第三输入数组 (偏移量),如果没有偏移量,可以为空( NULL)。 dst 输出数组 tABC T操作标志,可以是 0 或者下面列举的值的组合: CV_GEMM_A_T - 转置 src1 CV_GEMM_B_T - 转置 src2 CV_GEMM_C_T - 转置 src3 例如, CV_GEMM_A_T+CV_GEMM_C_T 对应 alpha*src1T*src2 + beta*src3T 函数 cvGEMM 执行通用矩阵乘法: dst = alpha*op(src1)*op(src2) + beta*op(src3), 这里 op(X) 是 X 或者 XT

所有的矩阵应该有相同的数据类型和协调的矩阵大小。支持实数浮点矩阵或者 复数浮点矩阵。 [编辑] Transform 对数组每一个元素执行矩阵变换 void cvTransform( const CvArr* src, CvArr* dst, const CvMat* transmat, const CvMat* shiftvec=NULL ); src 输入数组 dst 输出数组 transmat 变换矩阵 shiftvec 可选偏移向量 函数 cvTransform 对数组 src 每一个元素执行矩阵变换并将结果存储到 dst: dst(I)=transmat*src(I) + shiftvec 或者 dst(I)k=sumj(transmat(k,j)*src(I)j) + shiftvec(k) N-通道数组 src 的每一个元素都被视为一个N元向量,使用一个M×N 的变换矩阵 transmat 和偏移向量 shiftvec 把它变换到一个 M-通道的数组 dst 的 一个元素中。这里可以选择将偏移向量 shiftvec 嵌入到 transmat 中。这样

OPENCV下载与安装

OpenCV下载与安装 可以在https://www.docsj.com/doc/b86082555.html,/downloads.html上下载各种版本的OpenCV的源码,Windows、Linux/Mac、iOS、Android都有相应的版本,所以OpenCV可以满足在各种操作系统下的开发,一般来说现有的无人驾驶智能车视觉信息认知计算研究团队都是在Windows和Linux平台下开发。目前OpenCV最新发布的是OpenCV3.0BETA版本(这是一个公测版本),本书所有的视觉算法是基于OpenCV2.4.3版本实现的。 OpenCV下载后安装极其简单,下面是一个以OpenCV2.4.3版本为例的具体安装过程。 OpenCV下载后是一个可执行文件(.exe文件),如OpenCV-2.4.3.exe,安装的时候只需要直接运行这个可执行文件,运行后或得到图1-4的安装路径的选择界面,安装过程实质就是一个解压过程。 图1-4OpenCV安装的路径选择 如1-4所示是将OpenCV解压在计算机的C盘,安装(解压)完成后,可以在C盘中找到一个名称为opencv的文件夹,若能找到,

说明OpenCV安装完毕。不建议将OpenCV安装在C盘中(C盘一般是系统盘),因为OpenCV解压后的文件比较大。 1.2.3环境配置 OpenCV安装完之后还需要进行环境配置才能使用,本书是以Windows7+Microsoft Visual Studio2010下OpenCV2.4.3的环境配置为案例介绍。 (1)设置OpenCV环境变量 OpenCV库函数需要通过用户环境变量调用所需要的库文件。点击:开始->计算机(右击)->属性->高级系统设置->高级->环境变量,在用户变量里新建一项: 变量名:path 变量值:C:\opencv\build\x86\vc10\bin 图1-5设置环境变量

基于opencv的手掌检测与移动的跟踪等源代码

1.#include 2. 3.#include 4.#include 5.#include 6. 7.#include 8.#include 9.#include 10.#include https://www.docsj.com/doc/b86082555.html,ing namespace std; 12. 13.#pragma comment(lib,"cv210.lib") 14.#pragma comment(lib,"cxcore210.lib") 15.#pragma comment(lib,"highgui210.lib") 16. 17.void ErrorHandler(char* message) 18.{ 19. cout<

33. cout<<"failed to change work directory"<

opencv,模板匹配源码

竭诚为您提供优质文档/双击可除opencv,模板匹配源码 篇一:opencv模板匹配 opencv模板匹配 V1.0 zhbrain 1、2、1)2)3、1)2) opencv模板匹配原理--没有金字塔................................................. ..........................4模板匹配—使用金字塔................................................. ...............................................5主要函数简介................................................. ................................................... ........5程序流程................................................. ................................................... ................5验证和结

果................................................. ................................................... ...............5实验环境................................................. ................................................... ................5实验结果................................................. ................................................... . (5) opencv模板匹配 1、opencv模板匹配原理--没有金字塔 函数: cvmatchtemplate(source,target,result,method);说明:source:源图像,一般我们使用灰度图像;如果source 为Rgb图像,使用函数cvcvtcolor(source,dst,cV_Rgb2gRay)这里,dst为转换后的灰度图像。target:模板图像。 Result:匹配后的矩阵,width=s_width–t_taget+1,height=s_height–t_height+1使用函数 iplimage*result=cvcreateimage(resultsize,ipl_depth_ 32F,1)获得。method:cV_tm_sqdiFF: cV_tm_sqdiFF_noRmed cV_tm_ccoRR

opencv&vc++学习笔记

1.前缀: #include #include #include using namespace cv; using namespace std; Opencv2.4以后的头文件:https://www.docsj.com/doc/b86082555.html,/GWeuro/archive/2012/12/21/2828035.html 调用opencv库时,可以头文件写成: view sourceprint? 1.#include 就包含了opencv库所有头文件。 #include #include #include 关于winut的错误: 加入一行:#define POINTER_64 __ptr64 typedef void *PVOID; typedef void * POINTER_64 PVOID64; fatal error LNK1104: 无法打开文件“cxcore.lib 链接器中附加依赖项出了问题,没有搞定最新2.4.9依赖项:属性-链接器-输入-附加依赖项 删除 #pragma comment(lib,"cxcore") #pragma comment(lib,"cv") #pragma comment(lib,"highgui") 解决无法打开文件“cxcore.lib的问题 Cannot find or open the PDB file 直接Ctrl+F5运行结果 fatal error C1083: 无T法ぁ?打洙?开a包悒?括ぁ?文?件t:“°cv.h”±: No such file or directory 改成最新版包含,且修改包含目录和库目录 https://www.docsj.com/doc/b86082555.html,/linweixuan/article/details/1805302 glut.h头文件总是和C++中定义的

opencv编译与安装

2012/3/6, 16:55:01 在fedora15的环境下编译与安装opencv,并测试人脸检测程序 第一步:由于opencv是在cmake工具下建立的工程,所以我们先要下载cmake,下载地址随便一搜都有,不多说。下载到home的主目录下,这里我们是/home/lg。看下面的命令: #cd /home/lg #tar xzvf CMake2.4.7.tar.gz . #cd CMake2.4.7 #./boostrap #gmake #make install 这样cmake工具安装好了,并且可以直接使用cmake命令 根据cmake的编译规律,我们选择外部编译。 下载Opencv2.3.0到/home/lg 解压后进入Opencv2.3.0的目录下(这里的opencv与以前版本1.0的不一样,没有configure文件,所以我们执行不了./configure命令): #mkdir build #cd build #cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON ..(这条命令解析可以参考cmake教程,但是记住这里的第二个选项,我们将opencv安装在/usr/local目录下的) #make #make install 到这opencv编译完成,接下去是是opencv这个工具能正常使用。 记住这里的做法前一种对fedora有用,也就是说在fedora的环境下只能使用这种做法,但是ubuntu却可以使用两种方法。顺便说一下,经常遇见apt-get命令,这是在ubuntu下使用获取软件包的命令,fedora使用的是yum,记住了,否则经常出现使用apt-get却获取不了软件包的情况。 方法1:在/etc/ld.so.conf.d下新建一个文件opencv.conf,里面输入/usr/local/lib 方法2:在/etc/ld.so.conf文件中加入/usr/local/lib这一行 然后执行 #ldconfig(root权限下) #cp /usr/local/lib/pkconfig/opencv.pc /usr/lib/pkgconfig (或者是输入这个命令 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH)(pkconfig的用法见以前的博文) 至此opencv安装完成 我们可以找个例子来做实验 #cd /home/lg/Opencv2.3.0 #cd samples/cpp #g++ `pkconfig --cflags --libs opencv` drawing.cpp -o drawing(记住前面的两个引号是通过ESC下面的那个波浪符键获得 页次: 1

相关文档
相关文档 最新文档