2010年11月11日 星期四

Rules of memory management of openCV

Original page: http://www.andol.info/hci/993.htm

Rules of memory management of openCV
After several weeks’ hard working, finally, the memory leaking problem is fixed.
In the last post which listed nearly all kinds of variaties declare and delete methods, here i add several tips for memory check while it is leaking:
1) int, double, float … : these kinds of variaties don’t matter so much;
2) IplImage* : this really matters, especially when cvCloneImage is conducted, if the destination variaty was not cleared, the memory would fly up.
3) CvMemStorage: be careful, to delete this data you have to use not ‘cvReleaseData’ but ‘cvReleaseMemStorage’, one declaration, one delete operation.

OpenCV memory leaking management in C/C++

Original page: http://www.andol.info/hci/963.htm

OpenCV memory leaking management in C/C++

If you’re new to OpenCV, you need to know exactly how to manage all the huge amounts of memory you’re using. C/C++ isn’t a garbage collected language (like Java), so you need to manually release memory as soon as its use is over. If you don’t, your program could use up hundreds of MBs of highly valuable RAM… and often even crash (out-of-memory errors?)
It can be a daunting task to hunt exactly where memory needs to be released. So I’ve compiled this short list of places where you should look out for memory leaks.
Create it, then Release it
 
If you create something, make sure you release it before “returning”. This is probably the very first thing you should check when fixing memory leak problems with OpenCV. For example, if you do a cvCreateImage, make sure you do a cvReleaseImage. There are many things you can create. Here are some functions that “create” and their corresponding “release” functions
cvCreateImage cvReleaseImage
cvCreateImageHeader cvReleaseImageHeader
cvCreateMat cvReleaseMat
cvCreateMatND cvReleaseMatND
cvCreateData cvReleaseData
cvCreateSparseMat cvReleaseSparseMat
cvCreateMemStorage cvReleaseMemStorage
cvCreateGraphScanner cvReleaseGraphScanner
cvOpenFileStorage cvReleaseFileStorage
cvAlloc cvFree

One warning though: If you create something and want to return it, don’t release it. Lets say a function that creates a checkerboard image and returns it. If you release the image before returning it, you’re freeing all memory that stores the image data. And when you try accessing memory that isn’t yours, you get a crash.
Release returned structures
This is the second thing you should check for. Often, once you return a structure (say, an image).. you forget about it.
Multiple Memory Allocations
This is the third thing you should check for: Allocating memory, and then changing the pointer itself. Here’s some example code:
IplImage* image = cvCreateImage(whatever);
image = CreateCheckerBoard(whatever);

cvReleaseImage(&image);
This function creates a memory leak. First, you allocate some memory for image. Then, you call the function CreateCheckerBoard. This function itself creates new memory. And image now points to this new memory. The memory created in the first step is lost forever. No variable points to it. A memory leak. To fix this, you need to modify the code like this:
IplImage* image = NULL;
image = CreateCheckerBoard(whatever);

cvReleaseImage(&image);
If you return a sequence, release its storage
There are many instances where you use the CvSeq data structure. And often you might want to return this structure for further use. If you release its storage (a CvMemStorage structure) within the function itself, you’d free the memory where the sequence is stored. And then you’d try and access it in the calling function. Again, crash.
A temporary fix would be to just erasing the cvReleaseMemStorage statement… but that would mean lots of memory.
To fix this, you don’t release the memory in the function itself. You release it in the calling function like this:
cvReleaseMemStorage(&thesequence->storage);
storage is a member of the CvMemStorage structure that always points to the memory where its stored.
Again, this is just an example. There are more structures where a similar situation could arise.
Dependence on other structures
I quite recently discovered this memory leak. To explain this, I’ll use an example: Lets say you find out the contours of an image. OpenCV would return a “linked list” type structure calledCvSeq. You decide to access the third element of this linked list. OpenCV returns a pointer to the third element. All going great till this moment.
Now you decide to save all the points of this contour (the third element) in a data structure of your own. Since this is an array of points, you do something like:
mystructure->points = thirdcontour->points;
You set the pointer to equal to the thirdcontour. This is the bug. If you release the storage of the sequence (which you should), mystructure has a bad pointer. To fix this, allocate new memory to mystructure->points and then copy contents ofthirdcontour->points… something like this:

mystructure->points = (CvPoint*)malloc(sizeof(CvPoint) * thirdcontour->total);
memcpy(mystructure->points,thirdcontour->points,sizeof(CvPoint)*thirdcontour->total);
This creates new memory for your structure and then copies each element there. Once you’ve done this, you can release the storage of the sequence without fear.

Visual C++中調用DLL

摘 要:介紹了動態鏈接庫這種模塊復用方法及在VC中對它的調用,並給出了一個通過復用來實現數據加密的具體實例。

關鍵詞:VC DLL 模塊復用 數據加密

引言

模塊化思想貫穿於軟件工程各個發展階段,模塊復用是構建大系統的一種重要思想。模塊復用方法有:函數、函數庫、動態鏈接庫、COM。其都是基於模塊化的 基本思想。函數是最簡單的模塊化思想,也是後面方法的基礎,甚至是一個應用程序的基礎。函數庫是函數的組合,一般將一些功能相似的函數放在一起作為函數 庫,這種函數庫通常叫做靜態庫,其鏈接方式是靜態的。COM即組件對象模型,是一種集成技術,可以使程序在運行時把各種不相關的軟件程序混合在一起,而不 必考慮這些不相關的程序是用什麼語言編寫的,它也是一種標準或者稱為協議,負責將一個軟件模塊和另一個軟件連接起來。動態鏈接庫DLL(Dynamic Link Library)是一個可以被其它應用程序共享的程序模塊,其中封裝了一些可以被共享的例程和資源,其鏈接方式是動態的。動態鏈接庫文件的擴展名一般是 dll,也有可能是fon、sys和dry,它和可執行文件(.exe)非常相似,區別在於DLL中雖然包含了可執行代碼卻不能單獨執行,而應由 Windows應用程序直接或間接調用。Windows操作系統包含大量動態鏈接庫,其中最主要的是KERNEL32.DLL、USER32.DLL、 GDI32.DLL 。

DLL的調用

調用DLL,首先需要將DLL文件映像到用戶進程的地址空間中,然後才能進行函數調用,這個函數和進程內部一般函數的調用方法相同。Windows提供了兩種將DLL映像到進程地址空間的方法:

1、隱式的加載時鏈接

這種方法需要DLL工程經編譯產生的LIB文件,此文件中包含了DLL允許應用程序調用的所有函數的列表,當鏈接器發現應用程序調用了LIB文件列出的 某個函數,就會在應用程序的可執行文件的文件映像中加入一些信息,這些信息指出了包含這個函數的DLL文件的名字。當這個應用程序運行時,也就是它的可執 行文件被操作系統產生映像文件時,系統會查看這個映像文件中關於DLL的信息,然後將這個DLL文件映像到進程的地址空間。

系統通過DLL文件的名稱,試圖加載這個文件到進程地址空間時,它尋找DLL 文件的路徑按照先後順序如下:

·程序運行時的目錄,即可執行文件所在的目錄;

·當前程序工作目錄

·系統目錄:對於Windows95/98來說,可以調用GetSystemDirectory函數來得到,對於WindowsNT/2000來說,指 的是32位Windows的系統目錄,也可以調用GetSystemDirectory函數來得到,得到的值為SYSTEM32。

·Windows目錄

·列在PATH環境變量中的所有目錄

VC中加載DLL的LIB文件的方法有以下三種:

①LIB文件直接加入到工程文件列表中

在VC中打開File View一頁,選中工程名,單擊鼠標右鍵,然後選中"Add Files to Project"菜單,在彈出的文件對話框中選中要加入DLL的LIB文件即可。

②設置工程的 Project Settings來加載DLL的LIB文件

打開工程的 Project Settings菜單,選中Link,然後在Object/library modules下的文本框中輸入DLL的LIB文件。

③通過程序代碼的方式

加入預編譯指令#pragma comment (lib,"*.lib"),這種方法優點是可以利用條件預編譯指令鏈接不同版本的LIB文件。因為,在Debug方式下,產生的LIB文件是Debug 版本,如Regd.lib;在Release方式下,產生的LIB文件是Release版本,如Regr.lib。

當應用程序對DLL的LIB文件加載後,還需要把DLL對應的頭文件(*.h)包含到其中,在這個頭文件中給出了DLL中定義的函數原型,然後聲明。

2、顯式的運行時鏈接

隱式鏈接雖然實現較簡單,但除了必須的*.dll文件外還需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的場合就無法使用,而只 能採用顯式鏈接的方式。這種方式通過調用API函數來完成對DLL的加載與卸載,其能更加有效地使用內存,在編寫大型應用程序時往往採用此方式。這種方法 編程具體實現步驟如下:

①使用Windows API函數Load Library或者MFC提供的AfxLoadLibrary將DLL模塊映像到進程的內存空間,對DLL模塊進行動態加載。

②使用GetProcAddress函數得到要調用DLL中的函數的指針。

③不用DLL時,用Free Library函數或者AfxFreeLibrary函數從進程的地址空間顯式卸載DLL。


http://dev.xuezhishi.net/program/VC/2007-06-20/17543.html

外遇…心乾涸 還是性飢渴

外遇…心乾涸 還是性飢渴
【元氣周報/記者王昭月/報導】
老黃結婚30多年,晉階歐吉桑後,男人味愈走下坡。一次女兒帶名身材火辣的死黨回家,老黃眼底宛如浮現「再世情人」,腦中竟上演與少女敦倫的浪漫。

他居然…愛上女兒同學
女兒同學常來家中作客,婀娜身影不時縈繞老黃腦海。不久,老黃的生活開始轉變,他勤於健身,重視衣著,見到女兒同學,聲調變得溫柔,甚至邀約用餐、送禮,讓小女生備感呵護,不覺墜入情網。
老黃妻子察覺到丈夫異樣,懷疑他在搞什麼鬼。夫妻倆本來就常口角,現在更爭吵不斷。
有心理學家說,很多情感的「保存期限」大概只有兩年,明顯的,老黃碰上青春貌美的辣妹,乾涸心靈起了微妙變化,即使年紀足以當爹,仍想「偷」他個新鮮刺激。講白了,老黃是犯外遇,從精神上的出軌,逐步走向肉體的解放。

犯了錯…都是一時迷失?
國內外最近爆發幾例轟動的外遇事件,男主角身陷漩渦。立委吳育昇被狗仔拍到帶香奈兒女郎進住高檔汽車旅館,消息踢爆後,吳坦承自己「一時迷失,犯了錯」。
老虎伍茲的婚外情讓人眼花撩亂,虎女郎從2、3個連環爆到2、30個,伍茲為此付出極大代價。
以新聞專業、愛家著稱的前主播李四端,也被拍到摟著女人吞雲吐霧,儘管尚不構成「外遇案」,卻讓李主播「冏很大」。

好老公…怎麼也會外遇
「外遇」,望文生義是在「外面遇到」的意思,但婚姻之外,遇到是性、愛、安慰,還是桃花劫?
許多大家公認的好老婆或好老公,為何還會搞外遇?廣川醫院性治療室主任童嵩珍發現,多半是因為婚姻關係出現無法說的秘密,為了逃避,有人選擇外遇。
「有對夫妻性事喬不攏,老公就診時百思不解,他和老婆做愛時就不舉,和別的女人卻不會。他坦承和情人互動不單為了性,重要是個性合得來」。

性不性…影響婚姻關係
童嵩珍說,以前的人結婚會先合八字,看命理,慎重其事,不過現在外遇理由千百種,很多人婚姻觸礁,各自向外發展,原因就是「性」出問題。
「性」喬不來,要緊抓另一半的心,恐怕困難;外遇,往往是這類怨偶尋求情欲出口的理由。
「性並非單方面的事,而是雙方相合度不足。」童嵩珍舉例,一個陰冷的女人碰到陽萎的男人,兩人半斤八兩,誰也怨不得誰;但正常女人遇見性欲弱的男人,相處可難。

她整形…丈夫仍沒性趣
性是原因之一,個性亦是,男女會搞外遇,不見的是外頭那個「功夫」了得,很可能是夫妻相處起了變化,彼此煩了、膩了,讓「外」人有機可乘。
童嵩珍說,一名太太無助地說,她為挽回外遇老公,花錢減肥、隆乳、整形,連陰道都做緊縮術,結果丈夫還是不碰她。

【2010/01/03 元氣周報】

美研究:一周嘿咻兩次 有益男人心臟健康

美研究:一周嘿咻兩次 有益男人心臟健康

更新日期:2010/01/10 10:00 國際中心/綜合報導
性行為有助身「心」健康,有了最新的醫學根據。一項由美國麻州新英格蘭研究中心所做的研究顯示,每周有兩次性行為,可以降低男性罹患心臟病的機率。
這項研究歷經16年之久,研究對象是1000名中年以上的男性(40歲到70歲),結果顯示定期有性行為的男性,可降低罹患心臟病機率高達45%,也就是每周至少「嘿咻」兩次的男性,罹患心臟病機率比久久「炒一次」的,幾乎少了一半。
研究人員也表示,性行為頻繁的男性,可能處於一段固定的親密關係,因而有助減少身心壓力,得以改善健康。研究人員建議醫師,當評估中老年男性有無心臟病徵兆時,除了考慮年齡、體重、血壓和膽固醇指數之外,也可評估性生活是否頻繁。
這項研究發表在《美國心臟科醫學期刊》,不過,該研究沒有針對女性,也就是不能證明性生活頻繁的女性是否也能減少心臟病。
另外,美國國家癌症研究所發現,男性每周至少射精5次,可減低罹患攝護腺癌的機率。美國賓州威爾克斯(Wilkes)大學的研究也顯示,冬天一周性交一到兩次,可能提升免疫力,減少感冒和流行性感冒機率。

女博士 大陸婚戀市場滯銷品

女博士 大陸婚戀市場滯銷品

  • 2010-02-25
  • 旺報
  • 【文/艾恩繼(自由作家)】

     大學裡常年流傳這樣的順口溜:大專生是趙敏,本科生是黃蓉,碩士生是李莫愁,博士生是滅絕師太。
     大陸女生向來比台灣女生結婚早,女博士的婚姻問題在大陸更為棘手,一直存在較大的偏見。「高年齡」和「高學歷」使大陸的女博士們,處於高處不勝寒的境地,常常讓人誤解,讓男性望而生畏。
     女博士在大陸被稱為是UFO(即Ugly、Foolish和Old三個英文單詞的縮寫)。類似這樣的刻板印象,還有很多,大學裡常年流傳 這樣的順口溜:大專生是趙敏,本科生是黃蓉,碩士生是李莫愁,博士生是滅絕師太。這些,還是仁慈的,至少它將女博士劃為女性的行列。更厲害的是,將女博士 強行拉出「男人、女人」的類別,另起門戶稱為:男人和女人之外的「第三類人」。
     女博士 是第三類人
     對社會公眾來說,「第三類人」是神秘的一群。大多數人對女博士的想像在於:長得醜,EQ低,沒有女人味;穿著老土,生活乏味;思維僵化,迂腐不堪,張口閉口都是學術問題;最重要的:年齡偏大,一般博士的年齡,平均在28到35歲之間,在早婚的大陸,早過了談戀愛結婚的黃金年齡。
     以上這些,可能是公眾對女博士的刻板印象。也許,有失公允,有失全面。但也多多少少指出了女博士族群的現實問題:「高年齡」加「高學歷」使其在婚戀市場上,成了滯銷品,被稱為「剩女」。
     女生在成為博士的那天起,就開始在婚戀市場上跌價。
     怕男方有壓力 隱瞞學歷
     曾有某名牌大學的女博士,在婚介所徵婚時,怕自己的博士頭銜嚇壞對方,在學歷一欄只填了「大學本科」。與男友交往一年後,她才將自己的博士身分告知對方。令她驚訝的是,原本感情穩定的男方毅然提出分手,並責怪當初婚介所沒有把好關,直呼上當受騙。
     像上述案例,因怕男方有壓力而隱瞞學歷的女博士,不在少數。華東師範大學研究生會調研部,曾對上海市5所知名大學的662名在校女研究生(女碩士生、女博士生)進行了調查。結果顯示,有23.7%的女研究生,連一次戀愛也沒談過。
     某位中國人民大學的文科博士,愛打扮,有品味,有女人味,很時尚,更重要的是,她性格開朗活潑,能和大家打成一片。男生很容易對她產生好感,但令她苦惱的是,當對方得知她的女博士身分後,反應都很騖訝,有的甚至將嘴巴張成了O型。
     白天愁論文 晚上愁嫁人
     「白天愁論文,晚上愁嫁人」的順口溜,成了人們對女博士生的調侃。女博士生的日常生活,或許應對了這樣的順口溜。
     食堂、宿舍、圖書館、實驗室構成了女博士的主要生活空間。武漢大學的某女博士生描述她同院系的女博士生活:「早上起床後,有課就上課,沒 課就去自習室或者泡圖書館,準備課堂發言和論文資料。中午12點左右到食堂吃飯,上上網、睡睡午覺後,重複上午的事情。5點左右吃完晚餐,依舊是泡泡圖書 館,查期刊、論文資料,或者上上網,看看當季的美劇。」如果是真的喜愛學術,還好說;單純為了博士學位而來,常年過這樣周而復始、百般聊賴的生活,需要很 大的勇氣。
     女博士生活 單調無聊
     特別是工科女博士,她們的生活,比起文科女博士,又單調很多。理科博士生的大部分時間在實驗室中做實驗,每天實驗室、宿舍兩點一線,生活雖然簡單,但發表論文的壓力也讓他們欲哭無淚。
     女博士單調無聊的學術生活,雖不能阻擋女生攻讀博士的步伐,只是,不少女生,考慮到女博士在婚戀市場上的滯銷狀況,怕錯過了戀愛婚姻的黃金時間,多半先解決個人婚姻,再考慮念博士。
     在擇偶文化上,中國人大都充滿了傳統的「男強女弱」的觀念,不管是在學歷還是在年齡上,觀念都是如此。如果將男人和女人都分成甲、乙、丙、丁四等,按照「男強女弱」來進行配對,男甲對女乙,男乙對女丙,男丙對女丁,剩下來的,是基本上不能配對的男丁和女甲。
     男尊女卑 流水無情
     而女博士,基本上都是女甲。女博士向上看,合乎條件者人少得可憐,就算有也已是名草有主。所以,不得不降低身分,好將自己「銷」出去。
     很多女博士坦誠自己要求不高,但「一要有內涵,二要對我好,三要有一定經濟能力,相貌身高都無所謂……」
     就算要求不高,但是落花有意,流水無情。大多男生都表示,女生學歷太高會讓自己沒面子,而且,博士畢業起碼28、29歲,到結婚生子,就成了高齡產婦了。
     解放後的大陸,中共政府總是在各種場合中,強調男女平等。但事實上,男尊女卑的傳統觀念,在現實生活中,比比皆是。就業市場上,雖然不說明,但人人均知,男性要比女性吃香;尤其高管職位,男性更是具絕對優勢。
     大陸女博士成為婚戀市場的「滯銷品」,短期間恐難改變。很顯然地,解放超過60年的大陸,性別要解放,仍有一段長遠的路要走!

李家同:不要再講創新 要做好基本技術

李家同:不要再講創新 要做好基本技術          自由電子報2010年2月25日‧星期四 

〔中央社〕暨南大學榮譽教授李家同今天在工業局40周年慶上表示,希望政府「不要再講創新,要看台灣技術到底好不好」,因為基本技術不夠好,講創新沒有意義,希望台灣走回古老科技。

李家同是當時工業局推動主導性新產品開發計畫技術審議會總召集人,是這項政策推動20年來的靈魂人物。他今天在工業局40周年慶典禮上,再度對產業政策方向提出建言。

經濟部工業局今天歡度40周年慶,10任局長中除已經過世的第一任局長韋永寧,以及現任經濟部長施顏祥因到監察院報告無法出席外,包括現任局長杜紫軍在內,總計有 8位工業局長到場,共同為工業局40歲生日慶生。

歷任局長中,久未露面的前政務委員楊世緘也到場,他說「工業局是一輩子的事業投資,工業局人不能隨隨便便到外面找工作,要找也要找好一點的工作」。

特別代表施顏祥到場的經濟部政務次長林聖忠說,經濟部長很多都是工業局出身,包括現任部長施顏祥、前任部長何美玥、尹啟銘等,他很高興分享工業局的榮耀。

工業局第 3任局長徐國安說,「今天非常高興回到娘家」,工業局成立目的就是要發展工業,但不是管理機構,目的就是要提供產業界良好投資環境、興利除弊,讓產業在台灣發展而且茁壯。

不過,整場慶祝會中,李家同發言最讓現場省思。他表示,法國總統沙柯吉每到一個地方就會簽署一個工業產品合約,到中國大陸簽署新台幣9000億元的合約; 而現在連韓國也可以打敗美國奇異 (GE)與日本日立(HITACHI),拿到阿拉伯國家400億美元的核能計畫合約,但台灣呢?

因此,李家同呼籲,不要再講創新了,要看台灣的技術好不好。他舉一家磁鐵廠商為例,要做出磁力絕對均勻都做不到,但國科會不會補助支持廠商進行磁鐵研究,但能夠把磁鐵做好,對產業貢獻很大。李家同也說,半導體元件放大器同樣也有技術問題。

李家同說,台灣如果基本技術不夠好,就不要再講創新,因為這是沒有意義的。他並且用開玩笑的口吻說「希望局長(杜紫軍)聽懂我說的話」。

李家同還說「真正同情我的人很少,我知道尹啟銘(政務委員)同情我,希望你更加同情我」,砲火猛烈中還帶點幽默,讓現場氣氛緩和不少。