文档库 最新最全的文档下载
当前位置:文档库 › 【OpenCV】有关内存释放的一些问题

【OpenCV】有关内存释放的一些问题

【OpenCV】有关内存释放的一些问题
【OpenCV】有关内存释放的一些问题

【OpenCV】有关内存释放的一些问题

前一天把系统整个重写了一遍,脉络清晰了很多,也终于解决了以前很多崩溃,异常退出的问题。这里小小总结一下自己遇到的麻烦。

1、内存泄露

内存泄露是说没有释放已经不能使用的内存,这里一般指堆的内存才需要显示的释放。比如用malloc,calloc,realloc,new分配的内存是在堆上的,需要用free,delete显示的回收。内存泄露最明显的一是程序很慢,在运行程序时你可以启动任务管理器,会看到程序占用的内存一直“砰砰砰”的往上涨:

最后直接崩溃,或者你关闭程序的时候也会异常退出,出现

Debug Assertion Failed!

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

之类的问题。

除了new的对象我们知道要delete。OpenCV中使用cvCreateImage()新建一个IplImage*,以及使用cvCreateMat()新建一个CvMat*,都需要cvReleaseImage() cvReleaseMat()显示的释放

[cpp]view plaincopy

1.IplImage* subImg=cvCreateImage( cvSize((img->width)*scale,(img->heig

ht)*scale), 8, 3 );

2.CvMat *tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scal

e,CV_MAKETYPE(image->depth,image->nChannels));

3.cvReleaseImage(&subImg);

4.cvReleaseMat(&tempMat);

另外一些函数要用到CvSeq*来存放结果(通常这些都要用cvCreateMemStorage()事先分配一块内存CvMemStorage*),都要是释放掉相应的内存,这是很难找的。

比如从二值图像中寻找轮廓的函数cvFindContours():

[cpp]view plaincopy

1.CvMemStorage* m_storage=cvCreateMemStorage(0);

2.CvSeq * m_contour=0;

3.cvFindContours( img, m_storage, &m_contour, sizeof(CvContour), CV_RE

TR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

4.//释放内存

5.cvReleaseMemStorage(&m_storage);

以及人脸识别中检测人脸的函数:

[cpp]view plaincopy

1.CvMemStorage* m_storage=cvCreateMemStorage(0);

2.CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad(

cascade_name, 0, 0, 0 );

3.CvSeq* faces = cvHaarDetectObjects( img, cascade, m_storage,1.1, 2,

0,cvSize(30, 30) );

4.//释放内存

5.cvReleaseMemStorage( &faces->storage);

6.cvReleaseHaarClassifierCascade( &cascade );

注意这里我们可以使用

cvReleaseMemStorage( &faces->storage);

来释放m_storate,也可以使用:

cvReleaseMemStorage(&m_storage);

释放内存,这是等效的,但一定不要用两次!!

2、一块内存多次释放

对应没有释放内存,对应就是一个内存释放多次,如同上面的cvReleaseMemStorage用了两次。可能报错的地方:

[cpp]view plaincopy

1.__declspec(noinline)

2.void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)

3.{

4./* assign 0 to _debugger_hook_dummy so that the function is not

folded in retail */

5. (_Reserved);

6. _debugger_hook_dummy = 0;

7.}

或者:Unhandled exception at XXXXXXXXXX in XXX.exe:XXXXXXXXXXX: 堆已损坏。

除了上述的MemStorge问题,使用cvQueryFrame()取出CvCapture*每帧图像,只需在最后释放CvCapture*,不需要释放IplImage*

[cpp]view plaincopy

1.CvCapture* pCapture = cvCreateCameraCapture(-1);

2.IplImage* pFrame=cvQueryFrame( pCapture );

3.cvReleaseCapture(&pCapture);

*这篇是以前写的,其实还是建议大家用C++接口的OpenCV,内存问题很少了~

光纤网络交换机设备的级联图解

网络交换机设备的级联(图解) 双绞线端口的级联? 级联既可使用普通端口也可使用特殊的MDI-II端口。当相互级联的两个端口分别为普通端口(即MDI-X)端口和MDI-II 端口时,应当使用直通电缆。当相互级联的两个端口均为普通端口(即MDI-X)或均为MDI-II端口时,则应当使用交叉电缆。 无论是10Base-T以太网、100Base-TX快速以太网还是1000Base-T千兆以太网,级联交换机所使用的电缆长度均可达到100米,这个长度与交换机到计算机之间长度完全相同。因此,级联除了能够扩充端口数量外,另外一个用途就是快速延伸网络直径。当有4台交换机级联时,网络跨度就可以达到500米。这样的距离对于位于同一座建筑物内的小型网络而言已经足够了!? 1.使用Uplink端口级联? 现在,越来越多交换机(Cisco交换机除外)提供了Uplink 端口(如图1所示),使得交换机之间的连接变得更加简单。

图1 Uplink端口 Uplink端口是专门用于与其他交换机连接的端口,可利用直通跳线将该端口连接至其他交换机的除Uplink端口外的任意端口(如图2所示),这种连接方式跟计算机与交换机之间的连接完全相同。需要注意的是,有些品牌的交换机(如3Com)使用一个普通端口兼作Uplink端口,并利用一个开关 (MDI/MDI-X转换开关)在两种类型间进行切换。 图2 利用交叉线通过普通端口级联交换机 光纤端口的级联? 由于光纤端口的价格仍然非常昂贵,所以,光纤主要被用于核心交换机和骨干交换机之间连接,或被用于骨干交换机之间的级联。需要注意的是,光纤端口均没有堆叠的能力,只能被用于级联。 1.光纤跳线的交叉连接? 所有交换机的光纤端口都是2个,分别是一发一收。当然,光纤跳线也必须是2根,否则端口之间将无法进行通讯。当交换

电脑内存不足及释放内存

第一招:关闭多余顺序 如果同时打开地文档过多或者运行地顺序过多,就没有足够地内存运行其他顺序.这时,对于多文档界面程序,如等,请关闭当前文档外地所有文档,并退出当前未使用地顺序,或许你就能够继续执行因“内存缺乏”而被中断地任务.资料个人收集整理,勿做商业用途 第二招:清除剪贴板中地内容 .清除系统剪贴板中地内容(存储复制或剪贴内容地剪贴板)点击“开始→顺序→附件→系统工具→剪贴板查看程序”编辑”菜单上,单击“删除”命令,系统弹出“清除剪贴板”对话框,单击“按钮.资料个人收集整理,勿做商业用途 .清除多重剪贴板中地内容(顺序提供地剪贴板)剪贴板”任务窗格(或工具栏(上,单击“全部清空”或“清空‘剪贴板’当清空“剪贴板”时,系统剪贴板也将同时被清空.资料个人收集整理,勿做商业用途 第三招:合理设置虚拟内存 如果没有设置虚拟内存,那么很容易收到内存缺乏”消息.点击“开始→设置→控制面板”双击“系统”系统属性”对话框中,单击“性能”选项卡,然后单击“虚拟内存”按钮.选中“让管理虚拟内存设置推荐)选项,将计算机中可作为虚拟内存使用地硬盘空间量设置为默认值.资料个人收集整理,勿做商业用途 第四招:增加可用磁盘空间 有四种方法可以增加磁盘地使用空间: .清空回收站. .删除临时文件.打开电脑”右键单击要释放其空间地磁盘,然后单击“属性”惯例”选项卡上,单击“磁盘清理”按钮,选中要删除地不需要地文件前地复选框进行整理.资料个人收集整理,勿做商业用途 .从磁盘中删除过期地文件或已存档地文件. .删除从未使用过地所有文件. 第五招:重新装置已损坏地顺序 如果仅仅是使用某个顺序时,系统提示内存缺乏,而其他顺序可以正常运行,那么可能地原因是该顺序文件被毁坏,从而导致内存缺乏地问题.请尝试删除偏重新安装该程序,然后重新运行该程序.如果系统不再提示内存缺乏,那么说明原顺序文件确实被损坏.资料个人收集整理,勿做商业用途 第六招:使用内存优化软件 内存优化软件有很多,比方和就比较出色.可以设置自动清空剪贴板、释放被关闭顺序未释放地内存,从而免除你手工操作地麻烦,达到自动释放内存地目地无妨一试.资料个人收集整理,勿做商业用途 第七招:重新启动计算机 如果只退出程序,并不重新启动计算机,顺序可能无法将内存资源归还给系统.运行重要顺序之前,请重新启动计算机以充分释放系统资源.资料个人收集整理,勿做商业用途 第八招:减少自动运行地顺序 如果在启动时自动运行地顺序太多,那么,即使重新启动计算机,也没足够地内存用来运行其他顺序.这时就需要清除一些不必要地系统自启动程序.点击“开始→运行”输入打开“系统配置实用顺序”窗口.单击“一般”选项卡,选中“选择性启动”复选框.去掉处置文件”和“加载启动项”前地复选框.打开“启动”选项卡,将不需要开机自动启动地顺序都勾除掉就好了资料个人收集整理,勿做商业用途 第九招:查杀病毒 系统感染电脑病毒也是导致内存缺乏地罪魁祸首.当系统出现“内存缺乏”错误时,请使用最

博科交换机级联

博科光纤交换机级联文件修订历史记录

1、概述 在现实环境中服务器与存储搭建san环境时,为了达到链路的冗余,防止单点故障,一般都需要引进光纤交换机。同时当业务系统不断增加,光纤交换机端口无法满足日益增长的业务需求时,就需要重新购置光纤交换机,使之与之前的光纤交换机级联,从而达到端口扩容的现实效果。 博科光纤交换机在我司的项目中使用频繁,下面就简单介绍一下博科光纤交换机级联的相关信息。 2、级联准备 1、部分光纤交换机级联需要官方授权,购买级联license(比 如说博科200e光纤交换机)。有些光纤交换机级联license 是出厂自带的(比如说博科300光纤交换机)。 2、搭建级联物理环境。 3、级联步骤 1、导入级联license 用一根网线将电脑与博科光纤交换机的网口连接(brocade 交换机上只有一个电口网络连接),将电脑的ip设置为

10.77.77.77.0网段的ip,博科交换机的默认ip地址为10.77.77.77,通过telnet 10.77.77.77连接到交换机上,用户名为:admin;密码为:password。 登录后,输入wwn命令记下wwn号,如下: 如果需要官方授权,那么在到货时会有一张纸,上面的密码为:Transaction Key 登录到以下网站: https://https://www.wendangku.net/doc/3b2918416.html,/slkInternet/brocade 按照步骤申请license。你的激活license选择“Fabric OS Feature Activation(e.g. Trunking ,APM etc .)” 完成后会生成一个license。 登录到交换机上,用licenseshow来查看现有的license 用swd77:admin> licenseadd xxxxxxxxxxxxxx(博科的激活号) 再用licenseshow查看是否加载成功,如图:

cvPutText opencv中汉字的输出

cvPutText opencv中汉字的输出 OPENCV 不支持汉字输出,但可以修改其代码,支持汉字。字符输出在nitFont、cvPutText、cvGetSize三个函数中,文件在cxcore\src\cxdrawing.cpp 函数介绍: void cvlnitFont(CvFont*font,int font_face,double hscale,double vscale,double shear,int thickness,int line_type); /*font表示被初始化的字体结构体。font_face字体名称标识符,目前仅支持CV_FONT_HERSHEY_SIMPLEX等少数几种字体。hscale表示字体宽度的放大系数,例如0.5f表示宽度为原来的一半,shear字体豹裁瘦的斜率,1表示字体倾斜45度。thickness表示字体笔划的粗细程度。line_type表示字体笔划的类型,具体参见cvLine。*/ void cvPutText(CvArr *img,char+text,CvPoint org,CvFont *font,CvScalar color); /*img表示图像。这里要严格的ASCII字符,不能接受像GB2312等双字节编码。org表示第1个字符左下角的坐标。font表示字体结构体。color表示文本的字体颜色。*/ 字符编码:ASCII(一个字节),GB2313(两个字节),Unicode(两个字节).unicode兼容ASCII,不兼容GB,需要ANSI-C语言来转换.

思想如下: 1,解析汉字的编码;2,根据汉字编码装载汉字的形状;3,输出汉字的形状。 1,从char --> wchar_t 2,采用TrueType 字库。利用开源的FreeType库来处理字库。具体如下: 用FreeType的API提取一个字符的过程如下:{ FT_Library m_library;//字库 FT_Face m face;//字体 //打开字库文件,创建一个字体 FT_Init_FreeType(&m_library); FT_New_Face(m_library,"TrueType.ttf,0,&m_face); ∥根据字符的编码得到字符的索引位置 //根据字符在字库中索引得到字库轮廓 //根据字符的轮廓渲染字符的二值位图 FT_UInt glyph_index=FT_Get_Char_Index(m_face,'中'); FT_Load_Glyph(m_face,glyph_index,FT_LOAD_DEFAULT); FT_RenderGlyph(m_face->glyph,FT_RENDER_MODE_MONO); //释放FreeType库管理的资源 FT_Done_Face(m_face); FT_Done_FreeType(m_library);

linux下内存释放问题

linux下内存释放问题 细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会非常快被用光,当程式结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么非常好解决的办法.那么我来谈谈这个问题. 先来说说free命令 [root@server ~]# free -m total used free shared buffers cached Mem: 249 163 86 0 10 94 -/+ buffers/cache: 58 191 Swap: 511 0 511 其中: total 内存总数 used 已使用的内存数 free 空闲的内存数 shared 多个进程共享的内存总额 buffers Buffer Cache和cached Page Cache 磁盘缓存的大小 -buffers/cache 的内存数:used - buffers - cached +buffers/cache 的内存数:free + buffers + cached 可用的memory=free memory+buffers+cached 有了这个基础后,能得知,我目前used为163MB,free为86,buffer和cached分别为10,94 那么我们来看看,如果我执行复制文件,内存会发生什么变化. [root@server ~]# cp -r /etc ~/test/ [root@server ~]# free -m total used free shared buffers cached Mem: 249 244 4 0 8 174 -/+ buffers/cache: 62 187 Swap: 511 0 511 在我命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐都被cached吃掉了.别紧张,这是为了提高文件读取效率的做法. 引用 https://www.wendangku.net/doc/3b2918416.html,/archives/2007/09/linux_free.html "为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了I/O系统调用(比如read,write,getdents)的时间。" 那么有人说过段时间,linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放>?

opencv for c# 开发文档

OpenCV for Unity 1.2.3 iOS & Android support Win & Mac Standalone support(if Unity4,Pro only) Support for preview in the Editor(if Unity4,Pro only) Work with Unity Free & Pro System Requirements Build Win Standalone & Preview Editor : Windows7 or later Build Mac Standalone & Preview Editor : OSX 10.8 or later OpenCV for Unity is an Assets Plugin for using OpenCV from within Unity. ●Since this package is a clone of OpenCV Java, you can use as it is all the API Reference OpenCV Java 2.4.11 (link). (“org.opencv.android” and “SURF and SIFT of org.opencv.features2d” are excluded) ●You can image processing in real-time by using the WebCamTexture capabilities of Unity. (real-time face detection works smoothly in iPhone 5) ●Provides a method to interconversion of Unity's Texture2D and OpenCV's Mat. ●Includes many classes from OpenCVForUnity, and implements IDisposable. You can manage the resources with the "using" statement. Please download Demo Application for Android and watch Setup Tutorial Video(Unity4 Unity5). API Reference OpenCV for Unity SampleCode using OpenCV for Unity is available. ●MarkerBased AR Sample ●FaceTracker Sample ●Voforia with OpenCV for Unity Sample ●Kinect with OpenCV for Unity Sample

频繁分配释放内存导致的性能问题分析

内核态与用户态是操作系统的两种运行级别,intel cpu提供Ring0-Ring3三种级别的运行模式。Ring0级别最高,Ring3最低。 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级) 内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。 在内核态下CPU可执行任何指令,在用户态下CPU只能执行非特权指令。当CPU处于内核态,可以随意进入用户态;而当CPU处于用户态时,用户从用户态切换到内核态只有在系统调用和中断两种情况下发生,一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入内核态。 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。 初步分析 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 检查要访问的虚拟地址是否合法 查找/分配一个物理页 填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 建立映射关系(虚拟地址到物理地址) 重新执行发生缺页中断的那条指令 如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。 此进程minflt如此之高,一秒10000多次,不得不怀疑它跟进程内核态cpu消耗大有很大关系。 分析代码 查看代码,发现是这么写的:一个请求来,用malloc分配2M内存,请求结束后free这块内存。看日志,发现分配内存语句耗时10us,平均一条请求处理耗时1000us 。原因已找到! 虽然分配内存语句的耗时在一条处理请求中耗时比重不大,但是这条语句严重影响了性能。要解释清楚原因,需要先了解一下内存分配的原理。 内存分配的原理 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap (不考虑共享内存)。brk是将数据段(.data)的最高地址指针_edata往高地址推,mmap是在进程的虚拟地址空间中(一般是堆和栈中间)找一块空闲的。这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。

光纤网络交换机设备的级联图解

光纤网络交换机设备的 级联图解 Standardization of sany group #QS8QHH-HHGX8Q8-GNHHJ8-HHMHGN#

网络交换机设备的级联(图解) 双绞线端口的级联 级联既可使用普通端口也可使用特殊的MDI-II端口。当相互级联的两个端口分别为普通端口(即MDI-X)端口和MDI-II 端口时,应当使用直通电缆。当相互级联的两个端口均为普通端口(即MDI-X)或均为MDI-II端口时,则应当使用交叉电缆。 无论是10Base-T以太网、100Base-TX快速以太网还是1000Base-T千兆以太网,级联交换机所使用的电缆长度均可达到100米,这个长度与交换机到计算机之间长度完全相同。因此,级联除了能够扩充端口数量外,另外一个用途就是快速延伸网络直径。当有4台交换机级联时,网络跨度就可以达到500米。这样的距离对于位于同一座建筑物内的小型网络而言已经足够了! 1.使用Uplink端口级联 现在,越来越多交换机(Cisco交换机除外)提供了Uplink端口(如图1所示),使得交换机之间的连接变得更加简单。

图1 Uplink端口 Uplink端口是专门用于与其他交换机连接的端口,可利用直通跳线将该端口连接至其他交换机的除Uplink端口外的任意端口(如图2所示),这种连接方式跟计算机与交换机之间的连接完全相同。需要注意的是,有些品牌的交换机(如 3Com)使用一个普通端口兼作Uplink端口,并利用一个开关(MDI/MDI-X转换开关)在两种类型间进行切换。 图2 利用交叉线通过普通端口级联交换机 光纤端口的级联 由于光纤端口的价格仍然非常昂贵,所以,光纤主要被用于核心交换机和骨干交换机之间连接,或被用于骨干交换机之

OPENCV静态编译与动态编译

一、序言 当一个opencv工程实现之后,我们会面临一个问题,怎么把opencv程序的exe在其他电脑上运行,这个问题已经有很多人遇到过,当然也有很多人给出了博客,介绍了具体的解决方法,具体自己操作时,还是遇到了这样或者那样的小毛病,不过凭借自己根据错误提示解决问题的能力,最后还是把静态编译给编译成功了。 本文介绍两种opencv程序移植到其他电脑运行的方法,一种是动态编译,需要拷贝程序运行需要的dll,也就是-个exe跟着多个dll的模式,这种简单粗暴,但是显得拖拖拉拉,一个程序还得跟着那么多其他文件,所以我们很不推荐。另外一种就是本文主要介绍的静态编译,和之前运行不一样,我们在这使用的不是opencv的lib库,而是staticlib,编译成功之后,程序只需要拷贝一个exe,就可以在其他电脑上运行。 另外介绍一下本文测试程序工作的程序配置 操作系统Win7 IDE VS2010 opencv版本opencv2.4.5 二、动态编译 为了做一个全面的总结,在这简单的介绍opencv动态编译的方法。 opencv动态编译需要两部分dll: (1)opencv库的dll,检查你所引用的h文件,把对应的dll,拷贝过来就行,注意debug和release的不同,当然一般程序发布的话都会用release版本的,因为release版本比debug版本要快10倍有余。 (2)考虑到目标终端有可能没有装vs,所以需要拷贝msvcp110.dll和msvcr110.dll(release下),dll在C:/Windows/System32下。 三、静态编译 静态编译主要的不同就是利用的是 H:/Opencv2.4.5/opencv/build/x86/vc11/staticlib文件下的lib,而非 H:/Opencv2.4.5/opencv/build/x86/vc11/lib文件夹。具体配置如下: 1.新建空项目,项目名称Static_Opencv

C# OpenCV 初体验

[C#] OpenCV 初體驗 2011/05/17 在Visual Studio 2010 使用OpenCV 對於WebCam 有問題的話,請參考以下連結 https://www.wendangku.net/doc/3b2918416.html,/Forums/zh-TW/230/thread/d1647ae6-7f61-453e-818a-2fa4f52592bb 一、簡介 以前研究所的時候,有使用https://www.wendangku.net/doc/3b2918416.html, 配合OpenCV 做影像處理,這東西相當讚,可以省去不少開發時間,今天嘗試看看如何在Visual C# 2008 上使用OpenCV。 以下引用OpenCV 中文網站的介紹 1. 什麼是OpenCV OpenCV是Intel?開源電腦視覺庫。它由一系列C 函數和少量C++ 類構成,實現了圖像處理和電腦視覺方面的很多通用演算法。 2. OpenCV 重要特性 OpenCV 擁有包括300 多個C函數的跨平臺的中、高層API。它不依賴於其它的外部庫——儘管也可以使用某些外部庫。 OpenCV 對非商業應用和商業應用都是免費(FREE)的。(細節參考license)。 OpenCV 為Intel? Integrated Performance Primitives (IPP) 提供了透明介面。這意味著如果有為特定處理器優化的的IPP 庫,OpenCV 將在運行時自動載入這些庫。更多關於IPP 的信息請參考:https://www.wendangku.net/doc/3b2918416.html,/software/products/ipp/index.htm 3. 體驗OpenCV 的魅力 看了以上對OpenCV的介紹,還是不知道OpenCV在做什麼的話,可以先看這段影片,影片的成果是透過OpenCV 所撰寫而成。 二、方法 1. 下載與安裝OpenCV 要使用OpenCV,首先必須要下載並且安裝,點這裡下載OpenCV_1.1pre1a.exe,下載後執行安裝,安裝過程幾乎都是點選下一步,在此需記住安裝目錄為何,預設為C:\Program Files\OpenCV。

在IE下的JS编程需注意的内存释放问题

在IE下的JS编程需注意的内存释放问题 在IE下的JS编程中,以下的编程方式都会造成即使关闭IE也无法释放内存的问题,下面分类给出: 1、给DOM对象添加的属性是一个对象的引用。范例: var MyObject = {}; document.getElementById('myDiv').myProp = MyObject; 解决方法: 在window.onunload事件中写上: document.getElementById('myDiv').myProp = null; 2、DOM对象与JS对象相互引用。范例: function Encapsulator(element) { this.elementReference = element; element.myProp = this; } new Encapsulator(document.getElementById('myDiv')); 解决方法: 在onunload事件中写上: document.getElementById('myDiv').myProp = null; 3、给DOM对象用attachEvent绑定事件。范例: function doClick() {} element.attachEvent("onclick", doClick); 解决方法: 在onunload事件中写上: element.detachEvent('onclick', doClick); 4、从外到内执行appendChild。这时即使调用removeChild也无法释放。范例: var parentDiv = document.createElement("div"); var childDiv = document.createElement("div"); document.body.appendChild(parentDiv); parentDiv.appendChild(childDiv); 解决方法: 从内到外执行appendChild: var parentDiv = document.createElement("div"); var childDiv = document.createElement("div"); parentDiv.appendChild(childDiv); document.body.appendChild(parentDiv); 5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。范例: for(i = 0; i < 5000; i++) { hostElement.text = "asdfasdfasdf";

交换机级联

网络知识:图解交换机设备的级联 双绞线端口的级联 级联既可使用普通端口也可使用特殊的MDI-II端口。当相互级联的两个端口分别为普通端口(即MDI-X)端口和MDI-II端口时,应当使用直通电缆。当相互级联的两个端口均为普通端口(即MDI-X)或均为MDI-II端口时,则应当使用交叉电缆。 无论是10Base-T以太网、100Base-TX快速以太网还是1000Base-T千兆以太网,级联交换机所使用的电缆长度均可达到100米,这个长度与交换机到计算机之间长度完全相同。因此,级联除了能够扩充端口数量外,另外一个用途就是快速延伸网络直径。当有4台交换机级联时,网络跨度就可以达到500米。这样的距离对于位于同一座建筑物内的小型网络而言已经足够了! 1.使用Uplink端口级联 现在,越来越多交换机(Cisco交换机除外)提供了Uplink端口(如图1所示),使得交换机之间的连接变得更加简单。 图1 Uplink端口 Uplink端口是专门用于与其他交换机连接的端口,可利用直通跳线将该端口连接至其他交换机的除Uplink端口外的任意端口(如图2所示),这种连接方式跟计算机与交换机之间的连接完全相同。需要注意的是,有些品牌的交换机(如3Com)使用一个普通端口兼作Uplink端口,并利用一个开关(MDI/MDI-X 转换开关)在两种类型间进行切换。 图2 利用直通线通过Uplink端口级联交换机

2.使用普通端口级联 如果交换机没有提供专门的级联端口(Uplink端口),那么,将只能使用交叉跳线,将两台交换机的普通端口连接在一起,扩展网络端口数量(如图3所示)。需要注意的是,当使用普通端口连接交换机时,必须使用交叉线而不是直通线。 图3 利用交叉线通过普通端口级联交换机 交叉电缆 交叉与不交叉,所使用的网线都是一样的,只是在压线头的时候次序不同而已。 所谓“交叉线”,是指一头使用568A标准,另一头使用568B标准;非交叉线,即“直通线”,是指两端使用同一种标准。 568B中网线接头的颜色依次为:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕; 568A中网线接头的颜色依次为:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕; 一般来说,相同设备相连接,使用交叉线。但如果处于下端的设备上有“UPLINK”接口,则可以使用直通线通过“UPLINK”接口与上端设备连接。 另外,现在一些新的设备,具有端口识别功能,能自动识别是平行线还是交叉线,那就无所谓

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.wendangku.net/doc/3b2918416.html,/mvp_xuan/blog/item/7e6f6d8c4d34be09b31bb aa9.html?timeStamp=1316746687080 e、第5步属于“项目属性配置”,意思是:“每次新建或新打开一个项目,都需要重新配置”。1-4步是系统配置,一次性工程。 1、下载OpenCV(必须要superpack.exe) https://www.wendangku.net/doc/3b2918416.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 ————————————————————

交换机的堆叠和级联的区别

交换机的堆叠和级联有什么区别 (2016-01-12 12:30:24) 转载▼ 分类:电脑知识 堆叠是用专用的端口把交换机连接起来,当作一个交换机使用。堆叠的接口具有很高的带宽,一般在1Gbps以上。而级联通常是用普通网线把几个交换机连接起来,使用普通的端口或级联接口,带宽通常为100M以下(可以通过port channel来扩展带宽),这样下级的所有工作站就只能共享较窄的出口,从而获得较低的性能。 堆叠实际上把每台交换机的母板总线连接在一起,不同交换机任意二端口之间的延时是相等的,就是一台交换机的延时。而级联就会产生比较大的延时(级联是上下级的关系)。级联的层次是有限制的。而且每层的性能都不同,最后层的性能最差。而堆叠是把所有堆叠的交换机的背板带宽共享。例如一台交换机的背板带宽为2G,那么3台交换机堆叠的话,每台交换机在交换时就有6G的背板带宽。而且堆叠是同级关系,每台交换机的性能是一样的。 堆叠只有在自己厂家的设备之间,且此设备必须具有堆叠功能才可实现。级联只需单做一根双绞线(或其他媒介),堆叠需要专用的堆叠模块和堆叠线缆,而这些设备可能需要单独购买。 虽然级联和堆叠都可以实现端口数量的扩充,但是级联后每台集线器或交换机在逻辑上仍是多个被网管的设备,而堆叠后的数台集线器或交换机在逻辑上是一个被网管的设备。 堆叠与级联的区别: 1 对设备要求不同。级联可通过一根双绞线在任何网络设备厂家的交换机之间,或者交换机与集线器之间完成。而堆叠只有在自己厂家的设备之间,并且该交换机必须具有堆叠功能才可实现。

2 对连接介质要求不同。级联时只需一根跳线,而堆叠则需要专用的堆叠模块和堆叠线缆,当然堆叠模块是需要另外订购的。 3 最大连接数不同。交换机间的级联,在理论上没有级联数的限制。但是,叠堆内可容纳的交换机数量,各厂商都会明确地进行限制。 4 管理方式不同。堆叠后的数台交换机在逻辑上是一个被网管的设备,可以对所有交换机进行统一的配置与管理。而相互级联的交换机在逻辑上是各自独立的,必须依次对其进行配置和管理每台交换机。 5 设备间连接带宽不同。多台交换机级联时会产生级联瓶颈,并将导致较大的转发延迟。例如,4台百兆位交换机通过跳线级联时,彼此之间的连接带宽也是100Mbps。当连接至不同交换机上的计算机之间通信时,也只能通过这条百兆位连接,从而成为传输的瓶颈。同是,随着转发次数的增加,网络延迟也将变得很大。而4台交换机通过堆叠连接在一起时,堆叠线缆将能提供高于1Gbps的背板带宽,从而可以实现所有交换机之间的高速连接。尽管级联时交换机之间可以借助链路汇聚技术来增加带宽,但是,这是以牺牲可用端口为代价的。 6 网络覆盖范围不同。交换机可以通过级联成倍地扩展网络覆盖范围。例如,以双绞线网络为例,一台交换机所覆盖的网络直径为100m,2台交换机级联所覆盖的网络直径就是300m,而3台交换机级联时的直径就可达400m。而堆叠线缆通常只有0.5~1m,仅仅能够满足交换机之间互联的需要,不会对网络覆盖范围产生影响。 图解两种级联方法:

基于Opencv的人脸检测源程序(附详细使用说明)

基于Opencv的人脸检测程序 我的电脑上是用visual studio 2015,配置opencv2.4.9,visuanl studio加载opencv的方法百度上可以找到很多,按照要求配置好后以后进行一下操作: 第一步:新建win32应用程序的工程,在该工程以下程序复杂被覆盖win32的几行程序, #include"stdafx.h" #include"opencv2/objdetect.hpp" #include"opencv2/videoio.hpp" #include"opencv2/highgui.hpp" #include"opencv2/imgproc.hpp" #include #include using namespace std; using namespace cv; /** Function Headers */ void detectAndDisplay(Mat frame); /** Global variables */ String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; String window_name = "Capture - Face detection"; /** @function main */ int main(void) { VideoCapture capture; Mat frame; //-- 1. Load the cascades if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; }; if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; }; //-- 2. Read the video stream capture.open(-1); if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }

Js内存泄漏及解决方案

Js内存泄漏及解决方案 在IE下的JS编程中,以下的编程方式都会造成即使关闭IE也无法释放内存的问题,下面分类给出: 1、给DOM对象添加的属性是一个对象的引用。范例: var MyObject = {}; document.getElementById('myDiv').myProp = MyObject; 解决方法: 在window.onunload事件中写上: document.getElementById('myDiv').myProp = null; 2、DOM对象与JS对象相互引用。范例: function Encapsulator(element) { this.elementReference = element; element.myProp = this; } new Encapsulator(document.getElementById('myDiv')); 解决方法: 在onunload事件中写上: document.getElementById('myDiv').myProp = null; 3、给DOM对象用attachEvent绑定事件。范例: function doClick() {} element.attachEvent("onclick", doClick); 解决方法: 在onunload事件中写上: element.detachEvent('onclick', doClick); 4、从外到内执行appendChild。这时即使调用removeChild也无法释放。范例: var parentDiv = document.createElement("div"); var childDiv = document.createElement("div"); document.body.appendChild(parentDiv); parentDiv.appendChild(childDiv); 解决方法: 从内到外执行appendChild: var parentDiv = document.createElement("div"); var childDiv = document.createElement("div"); parentDiv.appendChild(childDiv); document.body.appendChild(parentDiv); 5、反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。范例: for(i = 0; i < 5000; i++) { hostElement.text = "asdfasdfasdf";

图解交换机设备的级联

结合图例,主要介绍多台交换机在网络中同时使用时的连接问题 多台交换机的连接方式有两种方式:级联跟堆叠。下文针对这两种连接方式,分别介绍其实现原理及详细连接过程。 1、交换机级联 级联是最常见的连接方式,就是使用网线将两个交换机进行连接。连接的结果是,在实际的网络中,它们仍然各自工作,仍然是两个独立的交换机。需要注意的是交换机不能无限制级联,超过一定数量的交换机进行级联,最终会引起广播风暴,导致网络性能严重下降。级联又分为以下两种: 使用普通端口级联 所谓普通端口就是通过交换机的某一个常用端口(如RJ-45端口)进行连接。需要注意的是,这时所用的连接双绞线要用反线,即是说双绞线的两端要跳线(第1-3与2-6线脚对调)。其连接示意如图1所示。 图1 使用Uplink端口级联 在所有交换机端口中,都会在旁边包含一个Uplink端口,如图2所示。此端口是专门为上行连接提供的,只需通过直通双绞线将该端口连接至其他交换机上除“Uplink端口”外的任意端口即可(注意,并不是Uplink端口的相互连接)。

图2 其连接示意如图3所示。 图3 2、交换机堆叠 此种连接方式主要应用在大型网络中对端口需求比较大的情况下使用。交换机的堆叠是扩展端口最快捷、最便利的方式,同时堆叠后的带宽是单一交换机端口速率的几十倍。但是,并不是所有的交换机都支持堆叠的,这取决于交换机的品牌、型号是否支持堆叠;并且还需要使用专门的堆叠电缆和堆叠模块;最后还要注意同一堆叠中的交换机必须是同一品牌。 它主要通过厂家提供的一条专用连接电缆,从一台交换机的“UP”堆叠端口直接连接到另一台交换机的“DOWN”堆叠端口。堆叠中的所有交换机可视为一个整体的交换机来进行管理。 提示:采用堆叠方式的交换机要受到种类和相互距离的限制。首先实现堆叠的交换机必须是支持堆叠的;另外由于厂家提供的堆叠连接电缆一般都在1M左右,故只能在很近的距离内使用堆叠功能。 不同连接方式的优缺点

OpenCV中文翻译教程

OPENCV2基础(补充材料) OpenCV_tutorials翻译资料整理而来 翻译材料出处: https://www.wendangku.net/doc/3b2918416.html,/opencvdoc/2.3.2/html/doc/tutorials/tutorial s.html [2014/10]

目录 一、Mat - 基本图像容器 (2) 二、OpenCV如何扫描图像、利用查找表和计时 (9) 三、矩阵的掩码操作 (19) 四、使用OpenCV对两幅图像求和(求混合(blending)) (24) 五、改变图像的对比度和亮度 (27) 六、图像平滑处理 (33) 七、腐蚀与膨胀(Eroding and Dilating) (40) 八、实现自己的线性滤波器 (49) 九、给图像添加边界 (53) 十、Sobel 导数 (59) 十一、霍夫线变换 (65) 十二、直方图均衡化 (72) 十三、仿射变换 (77) 十四、Remapping 重映射 (85)

一、 Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机、扫描仪、CT或者磁共振成像。无论哪种方法,我们(人类)看到的是图像,而让数字设备来“看“的时候,则是在记录图像中的每一个点的数值。 比如上面的图像,在标出的镜子区域中你见到的只是一个矩阵,该矩阵包含了所有像素点的强度值。如何获取并存储这些像素值由我们的需求而定,最终在计算机世界里所有图像都可以简化为数值矩以及矩阵信息。作为一个计算机视觉库,OpenCV其主要目的就是通过处理和操作这些信息,来获取更高级的信息。因此,OpenCV如何存储并操作图像是你首先要学习的。 Mat 在2001年刚刚出现的时候,OpenCV基于C语言接口而建。为了在内存(memory)中存放图像,当时采用名为IplImage的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材料。但这种方法必须接受C语言所有的不足,这其中最大的不足要数手动内存管理,其依据是用户要为开辟和销毁内存负责。虽然对于小型的程序来说手动管理内存不是问题,但一旦代码开始变得越来越庞大,你需要越来越多地纠缠于这个问题,而不是着力解决你的开发目标。 幸运的是,C++出现了,并且带来类的概念,这给用户带来另外一个选择:自动的内存管理(不严谨地说)。这是一个好消息,如果C++完全兼容C的话,这个变化不会带来兼容性问题。为此,OpenCV在2.0版本中引入了一个新的C++接口,利用自动内存管理给出了解决问题的新方法。使用这个方法,你不需要纠结在管理内存上,而且你的代码会变得简洁(少写多得)。但C++接口唯一的不足是当前许多嵌入式开发系统只支持C语言。所以,当目标不是这种开发平台时,没有必要使用旧方法(除非你是自找麻烦的受虐狂码农)。

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