函數(shù),或者方法泥从,在如今的編程中變得非常重要谚赎,這使得程序員不必要重復(fù)的造車輪子,直接使用別人或社區(qū)優(yōu)秀的函數(shù)來實(shí)現(xiàn)自己想要的功能岛杀。一般大型的庫函數(shù)像openCV都已經(jīng)都已經(jīng)打包好了阔拳,只要將包含關(guān)系引用到位,使用起來非常方便。但是openCV不是萬能的糊肠,很多時(shí)候我們還需要跟多的辨宠、更加具體細(xì)微的函數(shù)來實(shí)現(xiàn)我們的目的。我們或許會請別人或者自己來實(shí)現(xiàn)這些常用的功能货裹,然后保存下來以后還能方便使用嗤形。在使用Matlab的時(shí)候,自定義函數(shù)變得很簡單弧圆。自需要新建一個(gè).m文件赋兵,然后按照函數(shù)定義的格式就可以了。只要該函數(shù)的路徑已經(jīng)添加在matlab路徑中或者處于當(dāng)前工作環(huán)境路徑中就可以直接引用搔预。
在C++中霹期,一樣可以自定義函數(shù)。比如在使用openCV的時(shí)候拯田,我想像Matlab一樣使用subplot()函數(shù)多圖顯示历造,可是在openCV中我似乎并沒有找到這個(gè)函數(shù),而我自己目前也沒有能力自己來寫一個(gè)這樣的函數(shù)船庇,于是我在網(wǎng)上找大牛們的解決方法吭产。找到了大牛的函數(shù)Mat combineImages(vector<Mat> imgs, int col, int row, bool hasMargin),我直接copy了代碼溢十。接下來有一下幾種方法來解決:
Mat combineImages(vector<Mat> imgs, int col, int row, bool hasMargin)
一垮刹、放在當(dāng)前.cpp文檔里面
將該函數(shù)直接放在含有main()函數(shù)的.cpp源文件中张弛,如果該函數(shù)的定義放在main函數(shù)之前,那么可以像Matlab那樣直接在main()
函數(shù)中引用就好了吞鸭。但是一般情況下,為了是代碼結(jié)構(gòu)清晰刻剥,自定義函數(shù)會被放在main()的后面遮咖,這時(shí)候就要在使用該函數(shù)之前做出聲明:
Mat combineImages(vector<Mat> imgs, int col, int row, bool hasMargin);
然后才是使用該函數(shù)。
二造虏、放在另外一個(gè).cpp源文件中
使用Matlab習(xí)慣了,就會想把自定義函數(shù)放在一個(gè)新建的文件中漓藕,這樣使得結(jié)構(gòu)更加分明。其實(shí)這個(gè)Matlab也是十分相似的享钞。在當(dāng)前工程中新建一個(gè)源文件揍诽,然后將函數(shù)的代碼拷貝進(jìn)去。要注意的是需要的函數(shù)定義的開頭加上extern這個(gè)關(guān)鍵字,告訴編譯器這個(gè)是一個(gè)全局可使用的函數(shù)暑脆,然后在main()函數(shù)使用自定義函數(shù)前同樣做出聲明即可。函數(shù)的名稱不必要像Matlab那樣必須和源文件名稱保持一直添吗,甚至一個(gè)源文件中可以定義任意多個(gè)自定義函數(shù),重點(diǎn)就是加上extern關(guān)鍵字就行架专。目前我比較偏愛這種方法玄帕,也在用這種方法。
我的工程HelloOpenCV目前建立了兩個(gè)源文件:main_function.cpp 和 self_functions.cpp裤纹。 從字面就可以看出前者是main()所在的源文件,用來執(zhí)行的鹰椒,后者是用來放自定義函數(shù)的锡移。
目前在self_function.cpp中自定義了三個(gè)函數(shù)(具體內(nèi)容我隱藏了):
其實(shí)我現(xiàn)在還不知道在定義函數(shù)的時(shí)候淆珊,引用的庫是否需要聲明奸汇,因?yàn)槲覈L試了不聲明也可以執(zhí)行的施符,但是如果沒有聲明擂找,這些引用第三庫中的函數(shù)下面有錯(cuò)誤的紅波浪線,看著不舒服听哭。希望知道的大佬告知一聲塘雳。
然后在main()引用之前需要引用:
聲明只需要完整函數(shù)類型,函數(shù)名和函數(shù)參數(shù)即可败明,不能夠賦值的。
我們同樣可以自定義變量,一般這個(gè)時(shí)候變量是一個(gè)常量。定義和使用的方法和函數(shù)一模一樣沸呐。
三呢燥、建立一個(gè)類來
這種方法我目前還沒有使用,我的理解是當(dāng)自定義函數(shù)的數(shù)量到達(dá)一定程度的時(shí)候才需要叛氨。這個(gè)方法同樣需要我們把所有的自定義函數(shù)或者變量寫在一個(gè)不含有main()的.cpp源文件中,然后建立一個(gè)和.cpp同名的.h的頭文件寞埠,并包含所有自定義函數(shù)和變量的聲明。在使用的時(shí)候我們自需要寫上包含的聲明就好了蓝角。
在寫論文階段真的很難抽時(shí)間來系統(tǒng)的學(xué)習(xí)C++饭冬,但是結(jié)合openCV 來學(xué)習(xí),對我來說可能會事半功倍昌抠。聯(lián)系Matlab,遇到問題一個(gè)個(gè)解決裁厅,這樣學(xué)起來更能理解C++語言的特點(diǎn)劝评。當(dāng)然基礎(chǔ)還是要打牢,現(xiàn)在基本理解了C++的編程思維蒋畜,以及要用到的工具。接下來會細(xì)細(xì)品味C++的魅力插龄。