基于背景差分法的物体识别(4)

2019-04-22 22:35

OpenCV 中有 8位, 但在 IPL它只有 1位。

? 命名信息不被支持。

? 边界模式和边界常量是不被支持. 每个 OpenCV 函数处理像素的邻近的像素,通常不会采用多种固定代码边界模式。

以上所说限制之外, OpenCV对于ROI的处理方面还提出了其他要求。包括要求ROI的大小或者原图像和目标图像的大小(依操作而异,比如cvPyrDown 目标图像的宽或者高一定要与原图像的宽或者高除2 ±1相等)必精确匹配,并且由IPL处理的交叉区域则有可能完全独立,例如图像尺寸或者ROI尺寸。 (3)CreateImage

创建头并分配数据

IplImage* cvCreateImage( CvSize size, int depth, int channels ); size

图像宽、高。 depth

图像元素的位深度,可以是下面的其中之一: IPL_DEPTH_8U - 无符号8位整型 IPL_DEPTH_8S - 有符号8位整型 IPL_DEPTH_16U - 无符号16位整型 IPL_DEPTH_16S - 有符号16位整型 IPL_DEPTH_32S - 有符号32位整型 IPL_DEPTH_32F - 单精度浮点数 IPL_DEPTH_64F - 双精度浮点数

channels:每个元素(像素)通道号。可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1...

虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像。函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式。

header= cvCreateImageHeader(size,depth,channels); cvCreateData(header);

(4) Or:计算两个数组每个元素的按位或

void cvOr( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask=NULL ); src1:第一个原数组。 src2:第二个原数组。 dst:输出数组。

11

mask:操作覆盖面( 8-bit 单通道数组); 只有覆盖面指定的输出数组被修改。

函数 cvOr 计算两个数组每个元素的按位或

dst(I)=src1(I)|src2(I):对浮点数组按位表示操作是很有利的。除覆盖面,所有数组都必须有相同的类型,相同的大小(或ROI大小)。 (5)GetErrStatus:返回当前错误状态

int cvGetErrStatus( void );

函数 cvGetErrStatus 返回当前错误状态,这个状态是被上一步调用的 cvSetErrStatus 设置的。 注意, 在 Leaf 模式下错误一旦发生程序立即被终止 ,因此对于总是需要调用函数后蔡获得控制的应用,可以调用 cvSetErrMode 函数将错误模式设置为 Parent 或 Silent 。 (6)Error:产生一个错误。

int cvError( int status, const char* func_name,const char* err_msg, const char* file_name, int line ); status 错误状态

func_name 产生错误的函数名 err_msg 关于错误的额外诊断信息 file_name 产生错误的文件名 line 产生错误的行号

函数 cvError 设置错误状态为指定的值(通过 cvSetErrStatus) ,如果错误模式不是 Silent, 调用错误处理器。

12

第四章 利用C++实现图像获取与识别

C++,又名CPP,是C语言的衍生产品,1983年,由贝尔实验室的Bjarne Strou-strup推出,模块封装、保密性强,而且面对象编程,是一种非常适合现代软件编程的语言,主要编译器有Borland C++4.5,Symantec C++6.1和Microsoft VisualC++ 2012,由于考虑到使用效果和软件稳定性,本实验使用的是比较常见的Microsoft Visual Studio C++ 6.0。

第一节 C++的发展阶段

C语言研发成功于1972年,它由美国贝尔实验室的D.M.Ritchie研制成功的? 这款语言并不为初学者服务,而是专为程序员进行开发工作而研发? 它大大地简化了软件开发的语言编写难度,当时大多数系统软件和许多应用软件都是用C语言编写的?

随着计算机硬件软件的快速发展,C语言已经渐渐地不能完全满足软件编程的需求了。这一点在软件安全性和变成复杂程度上充分地体现出来。为了满足软件大型化、复杂化的要求,贝尔工作室在1983年公开了C语言的升级版本——C++,C++面对对象编程,使得原来C语言实现起来代码异常庞大的编程被简化为模块,大大提高了维护效率。C++是在继承了C语言所有的优点的情况下被设计出来的,这就使C++在推出后立刻占据了C语言大量的市场份额,但C语言简单易懂的特点还是为其保留了一部分空间。

1995年后,以标准模板库(STL)和后来的Boost为首的程序库的出现,进一步提高了C++对于C语言的竞争优势,但是由于编程语言的发展达到相当高的水平,大量优秀的语言诞生,如Java、C#等,这些高质量的语言的出现无疑给C++带来了不小的冲击,但事实证明,C++还是一款非常有效率,非常好的编程语言。

进入21世纪以来,以以Loki、MPL等程序库为首的基于C++的产生式编程和模板元编程的不断出现,也给C++带来了一个发展高峰期,使C++不断提高,在编程语言数不胜数的今天仍能占据大量用户。

值得注意的是,C++的语言标准也在很大程度上领导了世界编程语言的前进方向。1998年国际标准组织(international standard organization, ISO)颁布了C++程序设计语言的国际标准ISO/IEC 1988-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。

1998年,C++标准委员会成立,以后以5年为周期,以需要为基准更新标准。C++ 0x最终国际投票于2011年8月10日以与会国全票通过的结果正式结

13

束,这意味着 C++ 0x已经毫无疑义地成为正式的国际标准。这个被以C++ 0x临时命名的新标准将被正式命名为C++ 2011。C++ 2011将成为新一个C++标准,之前的标准是ISO/IEC 14882,它在1998年公布,通称C++98,并在2003更新过一次,通称C++ 03。新的国际标准由国际标准化组织于2011年9月1日出版发布,编号ISO/IEC 14882 : 2011,名称Information technology -- Programming languages -- C++ Edition: 3。

第二节C++的特点

C++由C语言发展而来,继承了C语言的一切优点,具有高效率的特点,为了克服C语言编程过于简单,导致大型程序编程时语言过于繁琐不宜理解维护的缺点,C++将设计思路改为面向对象(Object Oriented),这种思路将以往需要消耗大量资源编程的某个问题抽象成为类、继承,将问题抽象模块化,把计算机作为模块的加工者,而编程者作为这些模块的调控者,从而大量减少了人力资源浪费,提高了编程效率。此外,贝尔工作室为了实现从C语言向C++平滑过渡的目标,特意将C++设计成与C语言高度兼容,所以C语言的编程可以集成于C++编译环境中实现,这也一定程度上降低了C语言使用者改用C++的困难程度,推动了C++的传播。当然,C++语言也有它的缺点,那就是过度复杂性,由于它以大软件编程的优化为目标,自然就有一套面向大程序编程的复杂系统,对于小程序而言,这无疑太过复杂了,所以C++在小程序编程方面使用并不多。另外由于本身的复杂性, 就很难保证这一庞大C++程序的正确性。还有人提出C++的其他缺陷,如不能支持多线程等。虽然有如此多的质疑,而且质疑多来自于知名人士,这也恰恰证明了C++使用的广泛性和高层次性。

第三节 基于背景差分法的物体识别的程序

#include \ #include #include #include #include

#define THRESHOLD 20 // 差分时候的阈值

#define THRESHOLD_MAX_VALUE 255 // 二值化的时候使用的最大值 #define SCALE ( 1.0 / 255.0 ) // L*a*b*转换成所需要的比例因子 #define CAPTURE_OFF 0 // 定义图像的中止标志值为0 #define CAPTURE_ON 1 // 定义图像的开始标志值为1

14

#define COLOR_DIFFERENCE 0 // 用RGB各成分的差分计算值的标志为0 #define LAB_DIFFERENCE 1 //用L*a*b*表彩色的差分计算的标志值为1 #define GRAY_DIFFERENCE 2 // 用灰度的差分计算值的标志值为2 #define NOISE_KEEP 0 // 不消除噪声时的标志值为0 #define NOISE_MORPHOLOGY 1

// 进行MORPHOLOGY噪音消除值的标志值为1

#define NOISE_MEDIAN 2 // 由median过滤器的噪音消除的标志值为2 CvSize imageSize; // 图像的尺寸 // 基于成分的评价 // 参数:

// currentImage : 当前图像用IplImage // backgroundImage : 背景图像用IplImage // resultImage : 结果图像用plImage grayScaleDifference(IplImage*currentImage,IplImage *backgroundImage, IplImage *resultImage ) {

// 图像生成

IplImage *differenceImage = cvCreateImage( imageSize, IPL_DEPTH_8U, 3 ); // 差分图像用IplImage

// 每成分取与现在的背景的差的绝对值

cvAbsDiff( currentImage, backgroundImage, differenceImage ); // 从BGR转换为灰度

cvCvtColor( differenceImage, resultImage, CV_BGR2GRAY ); // 从灰度转换为2值

cvThreshold( resultImage, resultImage, THRESHOLD,

THRESHOLD_MAX_VALUE, CV_THRESH_BINARY ); // 进行阈值处理 cvReleaseImage( &differenceImage ); // 解放存储器 }

void labDifference( IplImage *currentImage, IplImage *backgroundImage, IplImage *resultImage ){ //图像生成

IplImage *currentLabImage = cvCreateImage( imageSize,IPL_DEPTH_32F, 3 ); //建立当前图像用L*a*b*用图IplImage

IplImage *backgroundLabImage = cvCreateImage( imageSize, IPL_DEPTH_32F, 3 );//建立背景图像L*a*b*用图IplImage

15


基于背景差分法的物体识别(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:七年级数学上册3-1一元一次方程及其解法第1课时一元一次方程和等

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: