当前位置:文档之家› open cv中的Mat详解

open cv中的Mat详解

open cv中的Mat详解
open cv中的Mat详解

1.M at A, C; // creates just the header parts

2.A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // here we’ll know the method used

(allocate matrix)

3.M at B(A); // Use the copy constructor

4.C = A; // Assignment operator

需要注意的是,copy这样的操作只是copy了矩阵的matrix header和那个指针,而不是矩阵的本身,也就意味着两个矩阵的数据指针指向的是同一个地址,需要开发者格外注意。比如上面这段程序,A、B、C指向的是同一块数据,他们的header不同,但对于A的操作同样也影响着B、C的结果。刚刚提高了内存自动释放的问题,那么当我不再使用A的时候就把内存释放了,那时候再操作B和C岂不是很危险。不用担心,OpenCV的大神为我们已经考虑了这个问题,是在最后一个Mat不再使用的时候才会释放内存,咱们就放心用就行了。

如果想建立互不影响的Mat,是真正的复制操作,需要使用函数clone()或者copyTo()。

说到数据的存储,这一直就是一个值得关注的问题,Mat_对应的是CV_8U,

Mat_对应的是CV_8U,Mat_对应的是CV_8S,Mat_对应的是CV_32S,Mat_对应的是CV_32F,Mat_对应的是CV_64F,对应的数据深度如下:

? CV_8U - 8-bit unsigned integers ( 0..255 )

? CV_8S - 8-bit signed integers ( -128..127 )

? CV_16U - 16-bit unsigned integers ( 0..65535 )

? CV_16S - 16-bit signed integers ( -32768..32767 )

? CV_32S - 32-bit signed integers ( -2147483648..2147483647 )

? CV_32F - 32-bit ?oating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )

? CV_64F - 64-bi t ?oating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

这里还需要注意一个问题,很多OpenCV的函数支持的数据深度只有8位和32位的,所以要少使用CV_64F,但是vs的编译器又会把float数据自动变成double型,有些不太爽。

还有个需要注意的问题,就是流操作符<<对于Mat的操作,仅限于Mat是2维的情况。

还有必要说一下Mat的存储是逐行的存储的。

再说说Mat的创建,方式有两种,罗列一下:1.调用create(行,列,类型)2.Mat(行,列,类型(值))。例如:

[cpp]view plaincopy

1.// make a 7x7 complex matrix filled with 1+3j.

2.M at M(7,7,CV_32FC2,Scalar(1,3));

3.// and now turn M to a 100x60 15-channel 8-bit matrix.

4.// The old content will be deallocated

5.M.create(100,60,CV_8UC(15));

要是想创建更高维的矩阵,要写成下面的方式

[cpp]view plaincopy

1.// create a 100x100x100 8-bit array

2.i nt sz[] = {100, 100, 100};

3.M at bigCube(3, sz, CV_8U, Scalar::all(0));

对于矩阵的行操作或者列操作,方式如下:(注意对列操作时要新建一个Mat,我想应该跟列地址不连续有关)

[cpp]view plaincopy

1.// add the 5-th row, multiplied by 3 to the 3rd row

2.M.row(3) = M.row(3) + M.row(5)*3;

3.// now copy the 7-th column to the 1-st column

4.// M.col(1) = M.col(7); // this will not work

5.M at M1 = M.col(1);

6.M.col(7).copyTo(M1);

下面的东西就比较狂暴了,对于外来的数据,比如你从别的地方接受了一幅图片,但可以不是Mat结构的,而只有一个数据的指针,看看接下来的代码是如何应付的,重点哦,亲[cpp]view plaincopy

1.v oid process_video_frame(const unsigned char* pixels,

2.i nt width, int height, int step)

3.{

4.M at img(height, width, CV_8UC3, pixels, step);

5.G aussianBlur(img, img, Size(7,7), 1.5, 1.5);

6.}

亲,有木有很简单!!!

还有一种快速初始化数据的办法,如下:

[cpp]view plaincopy

1.d ouble m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};

2.M at M = Mat(3, 3, CV_64F, m).inv();

也可以把原来的IplImage格式的图片直接用Mat(IplImage)的方式转成Mat结构,也可以像Matlab一样调用zeros()、ones()、eye()这样的函数进行初始化。

如果你需要提前释放数据的指针和内存,可以调用release()。

对于数据的获取,当然还是调用at(3, 3)这样的格式为最佳。其他的方法我甚少尝试,就不敢介绍了。

最后要提的一点是关于Mat的表达式,这个也非常多,加减乘除,转置求逆,我怎么记得我以前介绍过呢。那就不多说啦~

openCv学习札记(二)—cv:Mat学习

https://www.doczj.com/doc/3510193251.html, 发布于:2012-08-15 16:57:17 浏览:1795次

openCv学习笔记(二)—cv::Mat学习

由于在写上一篇图像的数据结构时,发现自己只知道CvMat,竟然还有Mat数据结构,真是无知了,看了这么多程序,貌似没有看到这个结构。有可能那些程序都是些老版本的例子,这是在2.0以后加上的,所以我也得紧跟呀!以下是自己的学习心得。。。。

一、Mat简介

在2001年刚刚出现的时候,OpenCV基于C语言接口而建。为了在内存(memory)中存放图像,当时采用名为IplImage的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材料。但这种方法必须接受C语言所有的不足,这其中最大的不足要数手动内存管理,其依据是用户要为开辟和销毁内存负责。虽然对于小型的程序来说手动管理内

一、Mat简介

在2001年刚刚出现的时候,OpenCV基于C语言接口而建。为了在内存(memory)中存放图像,当时采用名为IplImage的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材料。但这种方法必须接受C语言所有的不足,这其中最大的不足要数手动内存管理,其依据是用户要为开辟和销毁内存负责。虽然对于小型的程序来说手动管理内存不是问题,但一旦代码开始变得越来越庞大,你需要越来越多地纠缠于这个问题,而不是着力解决你的开发目标。

幸运的是,C++出现了,并且带来类的概念,这给用户带来另外一个选择:自动的内存管理(不严谨地说)。这是一个好消息,如果C++完全兼容C的话,这个变化不会带来兼容性问题。为此,OpenCV在2.0版本中引入了一个新的C++接口,利用自动内存管理给出了解决问题的新方法。使用这个方法,你不需要纠结在管理内存上,而且你的代码会变得简洁(少写多得)。但C++接口唯一的不足是当前许多嵌入式开发系统只支持C语言。所以,当目标不是这种开发平台时,没有必要使用旧方法(除非你是自找麻烦的受虐狂码农)。

关于Mat,首先要知道的是你不必再手动地(1)为其开辟空间(2)在不需要时立即将空间释放。但手动地做还是可以的:大多数OpenCV函数仍会手动地为输出数据开辟空间。当传递一个已经存在的Mat对象时,开辟好的矩阵空间会被重用。也就是说,我们每次都使用大小正好的内存来完成任务。

基本上讲Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,

通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。OpenCV是一个图像处理库,囊括了大量的图像处理函数,为了解决问题通常要使用库中的多个函数,因此在函数中传递图像是家常便饭。同时不要忘了我们正在讨论的是计算量很大的图像处理算法,因此,除非万不得已,我们不应该拷

贝大的图像,因为这会降低程序速度。

二、Mat的基本操作

这里展示一个例子解释一下Mat的基本操作

#include

#include

#include

using namespace cv;

using namespace std;

int main()

{

/*********************************Mat基本操作-矩阵********** *********************************/

//二维三通道矩阵建立

Mat M(2,2, CV_8UC3, Scalar(0,0,255)); //使用构造函数创建矩阵/*

CV_8UC3 表示使用8位的 unsigned char 型,每个像素由三个元素组成三通道,初始化为(0,0,255)

*/

cout << "M = " << endl << " " << M << endl << endl; //格式化输出 //三维

int sz[3] = {3,3,3};

Mat L(3,sz, CV_8UC(1), Scalar::all(0));

/*

超过两维的矩阵:指定维数,然后传递一个指向一个数组的指针,这个数组包含每个维度的尺寸;其余的相同

*/

cout << "L = " << endl << " " << M << endl << endl; //格式化输出

/********************************************Mat基本操作-图像*******************************/

Mat A, C; // 只创建信息头部分

A=imread("D:\\openCV\\openCVProject\\openCv笔记\\openCv笔记\\tes t.jpg", CV_LOAD_IMAGE_COLOR); // 这里为矩阵开辟内存

Mat B(A); // 使用拷贝构造函数

C = A; // 赋值运算符

/*

拷贝构造函数和赋值函数只拷贝信息头和矩阵指针

*/

Mat D (A, Rect(10, 10, 100, 100) ); //选取A中一个矩形区域,即只访问其矩形区域的信息头,只是创建信息头

Mat E = A(cv::Range::all(), Range(1,3)); // 创建访问边界的信息头。

/*

要创建一个感兴趣区域( ROI ),你只需要创建包含边界信息的信息头*/

Mat F = A.clone();//复制图像,包括数据

Mat G;

A.copyTo(G);

/*

拷贝矩阵本身(不只是信息头和矩阵指针),

*/

//测试

namedWindow( "a", CV_WINDOW_AUTOSIZE );

namedWindow( "c", CV_WINDOW_AUTOSIZE );

imshow( "a", D);

imshow( "c", E );

/****************************************图像的读取、处理和保存**************************************/

Mat image;

image = imread( "D:\\openCV\\openCVProject\\openCv笔记\\ope nCv笔记\\test.jpg", CV_LOAD_IMAGE_COLOR);//导入图像

if( !image.data )

{

cout<< " No image data \n " ;

return -1;

}

Mat gray_image;

cvtColor( image, gray_image, CV_BGR2GRAY );//转化为灰度图

imwrite( "../../images/Gray_Image.jpg", gray_image );//写入图像

namedWindow( "source", CV_WINDOW_AUTOSIZE );

namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );

imshow( "source", image );

imshow( "Gray image", gray_image );

/************************************************************** *****************************/

waitKey(0);

return 0;

}

对于Mat数据结构,在对图像进行处理时要注意:

?OpenCV函数中输出图像的内存分配是自动完成的(如果不特别指定的话)。

?使用OpenCV的C++接口时不需要考虑内存释放问题。

?赋值运算符和拷贝构造函数(ctor)只拷贝信息头。

?使用函数 clone() 或者 copyTo() 来拷贝一副图像的矩阵

这只是对Mat数据的简单认识。。在以后的例子中学习吧。。。

opencv Mat() 构造函数

分类:OPENCV2012-11-06 14:30 4667人阅读评论(0) 收藏举报Mat不但是一个很赞的图像容器类,它同时也是一个通用的矩阵类,所以可以用来创建和操作多维矩阵。创建一个Mat对象有多种方法

Mat M(2,2, CV_8UC3, Scalar(0,0,255)); cout << "M = " << endl << "

" << M << endl << endl;

对于二维多通道图像,首先要定义其尺寸,即行数和列数。

CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]

在 C\C++ 中通过构造函数进行初始化

int sz[3] = {2,2,2};

Mat L(3,sz, CV_8UC(1), Scalar::all(0));

上面的例子演示了如何创建一个超过两维的矩阵:指定维数,然后传递一个指向一个数组的指针,这个数组包含每个维度的尺寸;其余的相同

eg1:

Mat R = Mat(3, 2, CV_8UC3); randu(R, Scalar::all(0),

Scalar::all(255));

cout << "R (default) = " << endl << R << endl << endl;

eg2:

[cpp]view plaincopy

1.int sz[]={4, 2,2};

2. Mat b(3,sz,CV_32FC3, Scalar(10, 20, 30));

3.int channel=3;

4.for(int i=0; i

5. {

6.for(int j=0; j

7. {

8. cout<<"[";

9.for(int k=0; k

10. {

11. cout<<"(";

12.for (int p=0; p

13. {

14. cout<(i,j,k)[p];

15.if(p

16. cout<<" ";

17. }

18. cout<<")";

19. }

20. cout<<" ]";

21. }

22. cout<

23. }

24. cout<

25. cout<

-深度(Note:应该是位深)

-通道数

*/

int flags;(Note :目前还不知道flags做什么用的)

//!数组的维数,> = 2

int dims ;

//!行和列的数量或(-1,-1) 此时数组已超过2 维

int rows,cols;

//!指向数据的指针

uchar *data ;

//!指针的引用计数器;

/ / 阵列指向用户分配的数据时,当指针为NULL

int * refcount ;

/ / 其他成员

...

};

Mat类表示一个n 维的密集数值单通道或多通道数组。它可以用于存储实数或复数值的向量和矩阵、灰度或彩色图像、体素、向量场、点云、张量、直方图(尽管较高维的直方图存储在SparseMat可能更好)。M 数组的数据布局是由阵列M.step[]定义的,使元素的地址(i0,。。。。i M.dims-1),其中0<= i k < M.size [k],可以计算为:

addr( Mi0 ;:::;i M.dims-1) = M.data+ M.step[ 0]*i0 + M.step[ 1] *i1+ .…+ M.step[ M:dims- 1]

i M:dims- 1

2维的数组的情况下根据上述公式被减至:

addr( M i,j)= M.data+ M.step[ 0]*i+ M.step[ 1] *j

请注意,M.step[i] > =M.step[i+1] (事实上,M.step[i] > =M.step[i+1]*M.size[i+1])。这意味着2维矩阵是按行存储的,3 维矩阵是由平面存储,以此类推。M.step[M.dims-1] 是最小的而且总是等于元素大小M.elemSize()。因此,Mat中的数据布局完全兼容OpenCV 1.x 中CvMat、IplImage、CvMatND类型。它也和标准工具包和SDK,如Numpy(ndarray),Win32(独立设备位图)等主流的密集数组类型相兼容,也就是说,与任何使用步进(或步长)来计算像素位置的阵列相兼容。由于这种兼容性,使用户分配的数据创建Mat头以及用OpenCV函数实时处理该头成为可能。有很多不同的方法,创建一个Mat的对象。下面列出了最常见的选项:

使用create(nrows,ncols,type)方法或类似的Mat(nrows,ncols,type [,fillValue])构造函数。一个新的指定了大小和类型的数组被分配。type和cvCreateMat 方法中的type参数具有相同的含义。例如,CV_8UC1 是指一个8 位单通道阵列,CV_32FC2 指2 通道(复平面)浮点阵列,以此类推。

//创建一个用1+3j填充的7 x 7 复矩阵。

Mat M(7,7,CV_32FC2,Scalar(1,3)) ;

/ /现在将M转换为100 x 60的CV_8UC(15)的矩阵。

/ / 旧内容将会被释放

M.create(100,60,CV_8UC(15)) ;

这一章导言中指出,当当前的数组与指定的数组的形状或类型create() 分配唯一的新数组时的形状或类型。

创建多维数组:

/ / 创建100 x 100 x 100 8 位数组

int sz[] = {100, 100, 100};

Mat. bigCube (3,sz,CV_8U,Scalar::all(0)) ;它将维度数(= 1)传递给Mat的构造函数,但列数设置为1时,创建数组将是2 维的。因此,Mat::dims 始终是>=2的(该数组为空时,也可以是0)。

使用的复制构造函数或赋值运算符可以是一个数组或右侧的表达式(请参阅下图)。正像在导言中指出的,数组赋值运算复杂度是O(1)因为当你需要它的时候,它仅复制头和增加引用计数。Mat::clone() 方法可用于获取全(深)的副本数组。

为另一个数组的一部分构建头。它可以是单个行、单个列,几个行,几个列,矩形区域(代数中称为较小值)的数组或对角线。这种操作也是复杂度为O(1),因为,新头引用相同的数据。实际上,您可以使用此特性修改该数组的一部分例如:

/ /第5行,乘以3,加到第3 行,

M.row(3) = M.row(3) + M.row (5) * 3 ;

/ / 现在将第7列复制到第1列

/ / M.col(1) = M.col(7) ;/ / 这个不能实现。

Mat M1= M.col(1) ;

M.col(7).copyTo(M1) ;

/ / 创建一种新的320 x 240 图像

Mat img(Size(320,240),CV_8UC3) ;

/ / 选择ROI(region of interest)

Mat roi(img,Rect(10,10,100,100)) ;

/ / 填充(0,255,0)的ROI (这是RGB 空间中的绿色);

/ / 320 x 240 原始图像将被修改。

roi = Scalar(0,255,0) ;

由于额外的datastart 和dataend 的成员,它们使得用locateROI() 计算子数组在主容器数组中的相对的位置成为可能:

Mat A = Mat::eye ( 10, 10, CV_32S);

/ / 提取A 的1 (含)到3 (不包含)列。

Mat B = A(Range::all(),Range(1,3));

/ / 提取B 的5 (含)到9 (不包含)行。

/ /即C ~ A(Range(5,9),Range (1,3))

Mat C = B(Range(5,9),Range::all()) ;

Size size;Point ofs;

C.locateROI (size,ofs);

/ / size将变为(width= 10,height= 10),ofs会变为(x = 1,y = 5)

考虑到整个矩阵,如果您需要深层副本,使用子矩阵的sclone() 方法的提取。

为用户分配数据创建矩阵头。有利于执行下列操作:

1. 使用OpenCV处理"外来"的数据(例如,当您执行DirectShow *?lter 或gstreamer的pro-cessing 模块,等等)。例如:

void process_video_frame (const unsignedchar * pixels,

int width,int height,int step)

{

Mat img (width,height, CV_8UC3,pixels,step);

GaussianBlur (img,img ,Size(7,7),1.5,1.5);

}

2.快速初始化小矩阵和/或获取超快的元素的访问。

double m[3] [3] = {{a,b,c},{d,e,f} {g, h, i}}};

Mat M = Mat(3,3,CV_64F,m).inv() ;

本例中用户分配数据的一些很常见情况是从CvMat 和IplImage 转换到Mat。为达到此目的,有些特殊的构造函数以指向CvMat 或IplImage 和?ag可选参数指示是否数据复制。从Mat到CvMat 或IplImage 的后台转换是通过类型转换运算符Mat::operator CvMat() const 和Mat::operator IplImage()实现的。operators不要复制数据。

IplImage * img = cvLoadImage("greatwave.jpg",1);

Mat mtx(img) ;/ / IplImage *-> Mat

CvMat oldmat = mtx ;/ / Mat-> CvMat

CV_Assert (oldmat.cols = = img-> width&& oldmat.rows = = img-> height & &

oldmat.data.ptr = = (uchar *) img->imageData & & oldmat.step = = img-> widthStep);

使用MATLAB 样式数组初始值设定项zeros()、ones()、eye(),例如:

/ / 创建具双精度标识矩阵并将其添加到M。

M + = Mat::eye (M.rows,M.cols,CV_64F);

使用逗号分隔的初始值设定项:

/ / 创建3 x 3 双精度恒等矩阵

Mat M = (Mat_ (3,3) <<1,0,0,0,1,0,0,0,1);

使用此方法,您首先调用具有适当的参数的Mat_类构造函数,然后只要把<< 运算符后面的值用逗号分隔,这些值可以是常量、变量、表达式,等等。此外请注意所需的额外的圆括号((Mat_ (3,3)<< 1,0,0,0,1,0,0,0,1))以免出现编译错误。

数组一旦创建起来,它可以自动通过引用计数的机制被管理。如果数组头是在用户分配的数据的基础上构建的,您应该自己处理这些数据。当没有指向它的引用时,数组中的数据将被释放。如果在数组的析构函被调用之前要释放一个由矩阵头指向的数据,请使用

Mat::release()。

掌握Array类的另一个重要的环节是元素的访问。本手册已经描述了如何计算每个数组元素的地址。通常情况下,不需要在代码中直接使用的公式。如果你知道数组元素类型(它可以使用Mat::type() 方法检索得到),您可以用以下方式访问二维数组的元素M ij:

M.at (i,j) + = 1.f ;

假定M 一个双精度浮点型数组。有几个变体的不同方法来针对不同的维度数进行处理。

如果您要处理整行的二维数组,最有效的方式是获取该行的头指针然后只需使用普通的C 运算符[]:

/ / 正矩阵元素之和计算

/ / (假定M 是一个双精度矩阵)

double sum = 0;

for (int i = 0 ;i < M.rows ; i + +)

{

const double *Mi = M.ptr (i) ;

for (int j = 0; j < M.cols ; j + +)

sum + = std::max(Mi [j],0.);

}

以上的操作中,某些操作实际上不依赖该数组的形状。他们只是一个接一个(或多个具有相同的坐标的多个数组中的元素,例如,数组相加)地处理数组元素。这种操作称为元素指向(element-wise)。检查是否所有的输入/输出阵列是连续的,即有没有间断在每行的结尾,是有意义的。如果是的话,将它们(这些数组)作为单独的一个长行来处理:

/ / 计算正矩阵元素,优化的变量的总和

double sum = 0;

int cols =M.cols,rows = M.rows ;

if(M.isContinuous())

{

cols * = rows ;

rows = 1 ;

}

for (int i = 0 ;i < rows; i + +)

{

const double * Mi = M.ptr (i) ;

for (int j = 0; j < cols ; j ++)

sum + = std::max (Mi [j],0.);

}

对于连续的矩阵来说,外部循环体只需一次执行。所以,开销是规模较小,

小型矩阵的情况下尤其明显。

最后,还有足以成功跳过连续的行之间的间隔智能的STL 样式迭代器:

/ / 计算正矩阵元素和基于迭代器类型的变量之和

double sum = 0;

Mat Const Iterator_ it =M.begin (),it_end = M.end () ;

for(; it! = it_end ; ++it)

sum+ = std::max (*it,0.);

矩阵迭代器是随机存取的迭代器,所以他们可以被传递给任何STL 算法,包括std::sort()。

矩阵表达式

这是已经实现的可以组合在任意复杂的表达式中的矩阵运算操作,(此处A 、B 的表示矩阵(Mat)、s表示标量(Scalar),alpha为实数标量(双精度型):

加法、减法、求反:A + B + A-B、A + s、A-s、s + A、s-A、-A;

缩放:A * 阿尔法

每个元素乘法和除法: A.mul (B)、A / B,alpha/A

矩阵相乘:A * B

大动脉转位:A.t() (指在)

矩阵反演和伪反演,求解线性系统和最小二乘问题:

A.inv([method]) (~ A-1) , A.inv([method])*B (~ X: AX=B)

比较:cmpop B、cmpop alpha、alpha cmpop A,其中cmpop 是以下几种运算符之一:>,> =,= =,! =,< =,<。比较的结果是其元素设置为255的8 位单通道掩码(如果特殊元素对满足条件)或0。

按位逻辑运算:logicop B、logicop s slogicop A、~ A,其中logicop 是以下运算符之一:&,|, ^.

元素的最小值和最大值:分(A、B)、民(,alpha),最大值(A,B),最大(,alpha)

元素的绝对价值:abs(A)

叉乘,点乘:A.cross(B) A.dot(B)

任何标量与矩阵或矩阵的函数,返回一个矩阵或标量(scalar),如norm、, mean、sum、countNonZero、trace、determinant、repeat和其他。

矩阵初始值设定项(Mat::eye(),Mat::zeros(),Mat::ones())、矩阵以逗号分隔的初始值设定项、可提取sub-matrices的m atrix构造函数和运算符,(请参见Mat的说明)。

Mat_ () 构造函数将结果强制转换为适当的类型。

Note:有些逗号分隔初始值设定项和一些其他的运算符可能需要显示调用Mat();或Mat_();的构造函数来解决可能产生的歧义。

以下是一些矩阵表达式的例子:

//计算矩阵A的伪反演等价于A.inv(DECOMP_SVD)

SVD svd(A);

Mat pinvA =svd.vt.t()*Mat::diag(1./svd.w)*svd.u.t();

//计算莱文伯格-马夸特算法中的参数的新向量

x -= (A.t()*A

+lambda*Mat::eye(A.cols,A.cols,A.type())).inv(DECOMP_CHOLESKY)*(A.t()*err);

//用“Unsharp Mask”算法锐化图像

Mat blurred; double sigma = 1, threshold =5, amount = 1;

GaussianBlur(img, blurred, Size(), sigma,sigma);

Mat lowConstrastMask = abs(img - blurred)< threshold;

Mat sharpened = img*(1+amount) +blurred*(-amount);

img.copyTo(sharpened, lowContrastMask);

下面正式讲解Mat的各种方法。

Mat:: Mat

各种Mat构造函数。

C++: Mat::Mat()

C++: Mat::Mat(int rows, int cols, int type)

C++: Mat::Mat(Size size, int type)

C++: Mat::Mat(int rows, int cols, int type,const Scalar& s)

C++: Mat::Mat(Size size, int type, constScalar& s)

C++: Mat::Mat(const Mat& m)

C++: Mat::Mat(int rows, int cols, int type,void* data, size_t step=AUTO_STEP)

C++: Mat::Mat(Size size, int type, void*data, size_t step=AUTO_STEP)

C++: Mat::Mat(const Mat& m, constRange& rowRange, const Range& colRange)

C++: Mat::Mat(const Mat& m, constRect& roi)

C++: Mat::Mat(const CvMat* m, boolcopyData=false)

C++: Mat::Mat(const IplImage* img, boolcopyData=false)

C++: templateexplicit Mat::Mat(const Vec& vec, bool copyData=true)

C++: template explicit Mat::Mat(const Matx& vec, bool copyData=true)

C++: template explicitMat::Mat(const vector& vec, bool

copyData=false)

C++: Mat::Mat(const MatExpr& expr)

C++: Mat::Mat(int ndims, const int* sizes,int type)

C++: Mat::Mat(int ndims, const int* sizes,int type, const Scalar& s)

C++: Mat::Mat(int ndims, const int* sizes,int type, void* data, const size_t* steps=0)

C++: Mat::Mat(const Mat& m, constRange* ranges)

参数

ndims–数组的维数.

rows– 2维数组中行行数

cols– Number of columnsin a 2D array.

size– 2维数组的尺寸Size(cols, rows) .在Size()构造函数中行数和列数在次序上刚好反转过来了。

sizes–指定n 维数组形状的整数数组。

type–数组的类型。使用CV_8UC1,… …,创建1-4 通道的矩阵,CV_64FC4 或

CV_8UC(n),… …,CV_64FC(n)可以创建多通道(高达CV_MAX_CN 通道)矩阵。

s–一个可选的初始化每个矩阵元素的参数。要在矩阵建成后将所有元素设置为特定值可以用Mat的赋值运算符Mat:operator=(constScala& value)。

data–指向用户数据的指针。矩阵构造函数传入data和step参数不分配矩阵数据。相反,它们只是初始化矩阵头指向指定的数据,这意味着没有数据的复制。此操作是很高效的,可以用来处理使用OpenCV 函数的外部数据。外部数据不会自动释放,所以你应该小心处理它。

step–每个矩阵行占用的字节数。如果任何值应包括每行末尾的填充字节。如果缺少此参数(设置为AUTO_STEP),假定没有填充和实际的步长用cols*elemSize()计算。请参阅Mat::elemSize()。

steps–多维数组(最后一步始终设置为元素大小)的情况下的ndims-1个步长的数组。如果没有指定的话,该矩阵假定为连续。

m–分配给构造出来的矩阵的阵列(作为一个整体或部分)。这些构造函数没有复制数据。相反,指向m 的数据或它的子数组的头被构造并被关联到m上。引用计数器中无论如何都将递增。所以,当您修改矩阵的时候,自然而然就使用了这种构造函数,您还修改m 中的对应元素。如果你想要独立的子数组的副本,请使用Mat::clone()。

img–指向老版本的IplImage图像结构的指针。默认情况下,原始图像和新矩阵之间共享数据。但当copyData 被设置时,完整的图像数据副本就创建起来了。

vec–矩阵的元素构成的STL 向量。矩阵可以取出单独一列并且该列上的行数和矢量元素的数目相同。矩阵的类型匹配的向量元素的类型。构造函数可以处理任意的有正确声明的

基于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的动态背景下运动目标检测及跟踪(修改版)

基于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对图像的预处理

基于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.#include 2. 3.#include 4.#include 5.#include 6. 7.#include 8.#include 9.#include 10.#include https://www.doczj.com/doc/3510193251.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的人脸识别系统》 实践报告 姓名:XXX 学校:XXXX 院系班级:XXXXXXXXX 联系方式:XXXX

目录 1 项目背景 (1) 2 项目目标 (1) 3 项目方案 (2) 3.1 人脸采集 (2) 3.2 人脸训练 (3) 3.3 人脸识别 (4) 4 项目调试 (6) 4.1 采集调试 (6) 4.2 训练调试 (6) 4.3 识别调试 (7) 5实践总结 (8)

如何创造一个安全的、数字现代化的、智能化的宿舍门禁系统有着十分重要的意义。然而,在日常管理中我们经常会碰到这样的问题:外来人员混入宿舍带来的安全隐患、夏天未带校园卡而在公寓楼前苦等、宿舍出入口必须有人盯守、晚归被困公寓楼外等等。 在当今计算机普及与急剧增长的状况下,应该实施一些高效率的系统,不仅省钱,省事,而且便捷,针对以上情况,十分有必要建立一个全面、高效、人性化、智能的高校宿舍出入管理系统。 因此,做一个人脸识别系统就非常地有必要! 2 项目目标 本项目拟完成人脸采集、人脸训练和人脸检测与识别的功能。 人脸采集程序主要完成以下功能: 1. 建立新的文件夹:用户根据提示输入自己姓名的简称,程序会在工程目录下建立该用户的文件夹,用以存放拍摄的照片; 2. 打开摄像头和写入图像:调用笔记本摄像头,当P键按下时,显示当前帧的图像,经处理后,保存图像;当q键按下时,立即退出采集程序 3. 人脸检测与裁剪:在当前帧识别出人脸后将其裁剪至ORL人脸数据 库大小即92x112。 人脸训练程序主要完成以下功能: 1. CSV文件读取:CSV文件对应的图像数据和对应的标签; 2. 样本训练:包括ORL人脸数据库的样本和自己的样本。 人脸训练样本取自ORL人脸数据库,共40个人,每人10张照片。照片在不同时间、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集,所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有轻微旋转)。此外,增加自己的样本,并以相同尺寸拍摄20张左右图像。 人脸识别与检测程序主要完成以下功能: 1. 人脸检测:识别出当前帧是否有人脸; 2. 人脸预测:根据训练结果判断当前帧中人脸是否属于样本集; 3. 姓名显示:若属于样本集则显示姓名缩写,否则,显示“0”。

毕业设计:基于OpenCV的人脸识别算法(终稿)-精品

安徽工业大工商学院 毕业学士论文 基于OpenCV的人脸识别算法 姓名:陈滔 申请学位级别:学士专业:测控技术与仪器 指导教师:方挺

摘要 人脸在社会交往中扮演着十分重要的角色,是人类在确定一个人身份时所采用的最普通的生物特征,研究人脸跟踪识别及其相关技术具有十分重要的理论价值和应用价值。彩色图像序列的人脸检测、跟踪与识别技术是随着计算机技术的高速发展和视频监控等应用的需要在近几年才逐渐成为一个研究热点。本文着重构建一套人脸跟踪识别系统,致力于精确实时地对彩色视频中的人脸图像检测跟踪,并可以将跟踪到的人脸图片传输到识别端进行身份识别。系统分为客户端和服务器两部分。针对传统Camshifl跟踪算法进行形态学处理、分配多个跟踪器等改进后的算法应用于客户端进行多人脸的跟踪。服务器端首先将人脸图像按其主要特征进行分块,再对分块图执行Eigenface算法实现人脸身份的识别。这套系统完成了对多人脸的跟踪效果,可广泛的应用于各种安防系统之中如:ATM机监控系统,门禁系统等。

Abstract Human face is 0111"primary focus of attention in social intercourse playingamajor rolei conveying dentity and emotion.Researchonthe face tracking,recognition technology has great theoreticaland practical value.This paper focusesOilbuildingasetofhumanface recognition and trackingsystem tocommitted toaccurate and real-timecolorvideoimages,andcalltransmit the tracked human face image to the recognition part to identify the person’S status.Thesystem is divided into client and server parts.Thetracking algorithm whichcarrieson morphology processing after traditional track algorithm Camshifl and assignments severaltrackingdevices is applied to the client for duplex facetracking.Theserver—side first divides the person face image into blocksaccording to its chief feature,then the blocksuses the Eigenfacealgorithm separately to realize the person’S status recognition.The system implementation for multiple face trackingcallbe widelyused among the various security systems,suchas:ATM machine monitoring system,accesscontrol system.Keywords:Face DetectionFace TrackingFace Recognition Eigenface Camshift

基于OpenCV的图像处理

科技信息 教学中不断探索的课题。 参考文献 [1]陈祝军.分析化学实验专业化初探[J ].安徽职业技术学院学报,2004,3(1):39-40. [2]李祥,黄宁选.无机与分析化学实验课改革探讨[J ].大学化学,2003,18(7):16-18. [3]黄斌.对工学结合人才培养模式若干问题的探究[J ].教育探索, 2008,(3):79-80. [4]沈萍.高职有机化学实验课程改革初探[J ].职业教育研究,2005,(10):143. [5]沈萍.高职有机化学实验课程改革初探[J ].职业教育研究,2005,(10):143. [6]李克安,赵风林.分析化学教学的探讨与实践[J ].大学化学,2003,28(1):26-28. (上接第218页) OpenCV 的全称是Open Source Computer Vision Library ,是一个跨平 台的计算机视觉库。OpenCV 是由英特尔公司发起并参与开发, 以BSD 许可证授权发行,可以在商业和研究领域中免费使用,并且源代码是公开的。OpenCV 由一系列C 函数和少量C++类构成,实现了图像处理和 计算机视觉方面的很多通用算法,可用于开发实时的图像处理、 计算机视觉以及模式识别程序,极大方便了图像和视频处理研究者进行二次开发。 1、OpenCV的历史与特点 OpenCV 主要创作人员是Intel 的Performance Library Team 和Intel 俄国的一些专家,OpenCV 的第一个测试版本于2000年的IEEE 机器视 觉和模式识别会议上公布, 2001年到2005年间又发布了5个测试版本。2006年,OpenCV1.0版本正式发布。2009年10月,OpenCV2.0版本发布,功能大幅度增强。 OpenCV 在计算机视觉领域得到广泛应用,与其突出的优点是密不可分的: ●跨平台,可移植性好,无论Windows 、Linux 还是M ac OS 都可以运行; ●支持大多数C /C++编译器,如:VC6.0、https://www.doczj.com/doc/3510193251.html,2008、https://www.doczj.com/doc/3510193251.html,2005及C++Builder 等,可以轻易在不同平台之间进行移植; ●对个人及商业开发免费,源代码公开;●提供方便灵活的用户接口,采用C 、C++编写,包括300多个C /C++函数,代码效率高;支持中、高层API ;可以使用外部库,也可以独立使用; ●具备强大的图像和矩阵运算能力,减少开发者的工作量,有效提高开发效率和程序运行的可靠性; ●针对Intel 的处理器进行了优化。2、OpenCV的结构和应用 OpenCV 的程序构成了一个完整的系统,并有着自己独特的数据结构。目前OpenCV 主要包含如下几个子库: ●CxCore :该库提供了所有OpenCV 运行时的一些最基本的数据结构,包括矩阵,数组的基本运算,包括出错处理的一些基本函数; ●Cv :图像处理和计算机视觉功能(图像处理、结构分析、运动分析、 物体跟踪、模式识别、摄像机定标);●机器学习:用于分类、回归和数据聚类的类和函数;●CvAux :包括一些三维跟踪、PCA 、HMM 等函数;●HighGUI :用于用户交互(GUI 、图像视频的输入输出)。OpenCV 主要面向图像和视频处理,其主要应用包括:二维和三维 特征提取工具包(2D and 3D feature toolkits)、自运动估计(Egomotion esti-mation )、人脸识别(Face Recognition)、手势识别(Gesture Recognition)、人机 交互(Human-Computer Interface)、 移动机器人(M obile robotics)、运动理解(Motion Understanding)、目标识别(Object Identification)、分割与识别(Seg mentation and Recognition)、 立体视觉(Stereopsis Stereo vision:depth percep-tion from 2cameras)、 运动估计结构(Structure from motion)、运动跟踪(Mo-tion Tracking)等。 另外,OpenCV 包含一些机器学习库,主要有Boosting 、决策树(De-cision Trees)、期望最大化算法(Expectation M aximization)、k-最近邻算法(k-nearest neighbor algorithm)、朴素贝叶斯分类器(Naive Bayes classifier)、 人工神经网络(Artificial neural networks)、随机森林(Random forest)、支持向量机(Support Vector Machine)。 3、利用OpenCV进行人脸检测下面就以人脸检测为例,介绍OpenCV 的应用。人脸检测属于人脸识别(Face Recognition)第一步,人脸大体可以分为以下几种方法:基于神经网络的检测,基于特征的检测,基于颜色的检测等。基于神经网络的检测,需要大量的真假人脸图像来训练神经网络;基于特征的方法是利 用人脸的一些特征,比如眼睛、 鼻子等来检测;基于颜色的方法是通过人脸的颜色如黄色、棕色来检测。 OpenCV 中已经提供了训练好的Haar 级联分类器,使得人脸检测可以很方便的实现。OpenCV 中的Haar 特征的级联表中包含的是boost 分类器。所谓Harr 级联分类器是指由若干个简单boost 分类器级联成的一个大的分类器,被检测的目标依次通过每一个分类器,可以通过所有分类器的即可判定为人脸区域。OpenCV 中的人脸检测主要分为四步,其具体过程如下所示: 利用Harr 级联分类器进行人脸检测的实验图片如下,结果证明利用OpenCV 的Harr 分类器实现人脸检测,速度快、效率高,虽然检测率 不能达到100%, 存在误判现象,但是效果已经很不错了。4、总结 除了OpenCV ,目前比较有代表性的计算机视觉库/软件还有Intel 公司的IPP ,微软公司的visDSK ,MathWorks 公司的Matlab 等。IPP 是Intel 的图像、信号处理的集成开发库,收费并且源代码不公开。Microsoft 公司的visDSK 图象处理库,免费,开源,与OpenCV 功能相似。Matlab 功 能丰富,算法实现方便简单,适合研究、 仿真和演示,但是在开发产品方面效率低,而且软件费用高。 相比之下,跨平台的OpenCV 图象处理库,免费,源代码公开,功能强大,有着突出的优点,使用人数众多,资源丰富,其必将会成为图像视频处理领域的强有力的工具。 参考文献[1]李振伟等.基于OpenCV 的运动目标跟踪及其实现[J ].科学计 算及信息处理, 2008年20期[2]陈健等.一种基于Haar 小波变换的彩色图像人脸检测方法[J ].微计算机信息,2005.1 基于OpenCV 的图像处理 南京信息职业技术学院 阴法明 [摘要]OpenCV 是Intel 公司推出的开源、免费的计算机视觉程序库,利用OpenCV 可以很方便地实现图像和视频处理。本文介绍 了OpenCV 的历史、 特点以及结构和应用,并以人脸检测为例介绍了OpenCV 在图像处理中的应用。[关键词]OpenCV 人脸检测计算机与网络 220——

基于OpenCV的图像轮廓提取方法的实现

基于OpenCV的图像轮廓提取的实现 【摘要】OpenCV是近几年来推出的一个开源的、免费的计算机视觉库.OpenCV的目标是构建一个简单易用的计算机视觉框架,利用它所包含的函数帮助开发人员方便快捷地实现图像处理和视频处理。而图像的轮廓是图像的一种基本特征,携带着一幅图像大部分的信息,经常被应用到较高层次的图像应用中。它在图像分离,图像识别和图像压缩等领域有很广泛的应用,也是图像处理的基础。本文首先阐述了OpenCV的特点和结构,然后采用一系列的可行性算法来获取图像特征参数并通过各种算子(Sobel算子,Laplace算子,Canny算子)对图像的灰度进行分析,调节,用实现对图像的边缘检测和轮廓提取。 【关键词】OpenCV 图像轮廓提取

The realization of the image contour extraction based on OpenCV 【Abstract】OpenCV is launched an open source in recent years.Free computer vision library. OpenCV's goal is to build a simple and easy to use computer vision framework, function to help developers use it contains quick and easy to realize image processing and video processing.And the outline of the image is a basic feature of image, carrying an image, most of the information is often applied to the higher level of the image application.It in image separation, image recognition and image compression, and other fields have a wide range of applications, is also the basis of image processing.At first, this paper expounds the characteristics and structure of OpenCV, then a series of the feasibility of the algorithm is used to obtain image feature parameters and through a variety of operator (Sobel operator, Laplace operator, Canny operator) analysis of image gray level, adjustment, use of image edge detection and contour extraction. 【Key words】OpenCV Image Contour extraction

相关主题
文本预览
相关文档 最新文档