【OpenCV學習筆記】之OpenCV編程規範

        一個規範的編程習慣,完全可以給程序的編寫和自身的調試帶來極大的便利。同時也會增強自己代碼的可讀性,讓別人更快的理解我們的思路。

1.文件命名規則

所有的Cv和CvAux庫文件的命名必須符合以下規則。

1)前綴位cv;

2)C/C++頭文件擴展名爲”.h”,C++頭文件擴展名爲”.hpp”;

3)源文件擴展名”.cpp”;

4)文件名小寫,兼容POSIX;

2.數據類型和函數的命名規則

函數和數據結構使用大小寫混合樣式:

1)外部函數使用前綴cv。

2)內部函數使用前綴icv。

3)數據結構(C結構體,枚舉,聯合體,類)使用前綴Cv。

宏名稱全部使用大寫字符,詞間下劃線分割,外部宏使用前綴CV_,內部宏使用前綴ICV_。

3.文件結構

1>源文件以BSD兼容的許可聲明開頭

2>每行最多90字符(粗略),不包括行結束符。

3>不是製表符,使用4空格縮進。

4>頭文件必須使用保護宏。

5>混合C/C++ 接口文件使用 extern ”C”{}

6>VC++下編譯,源文件必須包含預編譯頭precomp.h。

4.函數接口設計

爲了保持庫的一致性,應根據以下方式設計接口:

1>函數功能:定義良好,精簡

2>函數名稱:簡單,體現函數功能。一般形式爲cv+ActionName+Object+modeifiers

對容器元操作時,函數名爲 ContainerName+ActionName

3>函數返回值:以簡化功能爲目的。不能使用會導致嚴重錯誤的類型(空指針、0除數、錯誤參數類型、不支持的圖像格式等)作爲返回值

4>參數類型:儘量使用Opencv中的常用數據結構類型:光柵圖像IplImage(CV 1.X),矩陣CvMat(常用於圖像矩陣 CV2.X~)、輪廓線CvSeq等。不建議使用簡單指針等。

5>參數順序:輸入參數、輸出參數、標記或可選參數。輸入參數一般用const修飾。對於矩陣操作或類局域函數(一般爲內部函數)順序爲:容器(指針),元素信息(位置)、標記或可選參數。可選參數或標記根據重要性依次排列,一般可賦初值。

6>參數默認值:簡化函數用法。C++編程環境中函數的參數可賦予默認值。在函數聲明中,使用宏CV_DEFAULT指定參數的默認值,與C語言編程環境相兼容。

可參考CV_DEFAULT宏定義

#ifndef CV_DEFAULT

#  ifdef __cplusplus

#    define CV_DEFAULT(val) = val

#  else

#    define CV_DEFAULT(val)

#  endif #endif

5.函數實現

主要對參數類型檢測、錯誤產生和處理、內存管理和資源回收、調用低級函數做出了規定:

1>參數類型檢測:OpenCV廣泛使用高級數據類型傳送和返回參數。簡化了函數使用,卻增加了錯誤參數調用函數的可能性。因此在使用輸入參數和返回參數時應該檢查參數類型是否正確。例如IplImage通過宏CV_CHECK_IMAGE被檢查。CV_CHECK_MASK_IAMGE可檢查掩碼圖像。

2>錯誤產生和處理:任何時候,當傳入一個錯誤的參數或在函數執行時發生其他嚴重錯誤時,應該通過cvError函數拋出一個錯誤信號。Opencv的錯誤機制是用一個全局錯誤狀態代替返回錯誤碼,實現方法是使用cvError函數設置、用cvClearErrStatus清除、用cvGetErrorStatus讀取。除了設置錯誤狀態和指定值外,cvError還能進行其他操作,依據錯誤處理的模式的不同而不同,錯誤處理模式可以通過cvSetErrorMode調整。在Silent模式或parent模式下,cvError以及返回;在子模式下,它打印錯誤消息並終止應用程序。爲了更方便的使用,可以通過使用宏來代替以上函數,如CV_ERROR和OPENCV_ERROR。用CV_CALL和OPENCV_CALL來代替函數和檢查狀態。

3>內存管理和資源回收:在opencv中臨時緩存用cvAlloc和cvFree函數分配和回收。函數應該注意適當對齊,對未釋放的內存保存跟蹤並檢查溢出。臨時圖像、內存存儲和其他結構使用cvCreate<object>和cvRelease<object>的方式來分配和回收。如果錯誤發生,並且CV_ERROR或CV_CALL宏被調用,那麼控制轉到exit標籤處,同時在程序流中可以通過EXIT宏跳轉控制。標籤可以通過手動或通過_BEGIN_宏來定義,引入此標籤是爲了資源回收。程序執行時可能經常會發生內存溢出的情況。使用OpenCV庫中的一些技術方法,可以幫助程序員避免大多數內存溢出錯誤。例如,在函數開始清除所有指針,在“exit”標籤後對每一個指針調用cvFree函數,在函數內部返回語句用EXIT宏代替,這樣可以確保內存回收。

4>調用低級函數:OpenCV中的低級函數主要是用C語言實現的原始操作。它們主要使用簡單指針和基本數值類型,幾乎不使用結構體,也不同於前面談論的錯誤處理方法,錯誤返回代碼而不是全局錯誤狀態。調用這些函數的安全方法是使用宏IPPI_CALL。

6.代碼佈局

每個文件必須使用一致的格式。

修改別人的代碼,應與原代碼格式一致。

7.可移植性

爲了滿足可移植性:

1>ANSI C 第一個語言標準ISO/IEC 9899-1990.

2>C9X(1999年修訂的新標準):ISO/IEC 9899

3>C++標準:ISO/IEC 14882-1998.

去掉依賴編譯器或者平臺和系統調用的一些寫法:

1>編譯器:pragma’s

2>特定關鍵字:_stdcall、_inline 和_int64,應分別使用CV_INLINE、CV_STDCALL和int64代替。

3>編譯器擴展

4>內聯彙編

5>Unix或Win32調用

6>用sizeof代替具體的數據大小,用簡單的字符處理數據,使用短形式或使用預處理指令包含非可移植性代碼片段。

8.文檔編寫

文檔以HTML格式提供。每個函數的文檔或相關函數組的文檔放入不同文件中,該文件可以通過主頁連接訪問。函數文檔的HTML文檔順序包含以下基本元素。

1>頁面標題:顯示在瀏覽器標題欄中,表示一個擴展的函數名或一組函數名

2>關鍵字列表:用於搜索引擎和各種工具檢索文檔

3>可見的頁面標題:重複頁面標題

4>函數名:真實函數名,作爲標籤

5>簡介:單行函數描述、

6>函數聲明:按其在頭文件中的形式,用<pre></pre>包含,

7>函數參數描述:用格式<參數名,描述>表示的列表。

8>討論:描述函數功能、允許或支持的參數組合的限制、算法參考

9>使用實例:可選的代碼片段或僞代碼,幾個相關的函數可以一併參考一個實例。

10>請參考:包括零個或多個

下表是毛星雲—《Opencv編程入門》裏面提到的命名規則,可以借鑑:書中還提到一種匈牙利命名法:變量名=屬性+類型+對象描述;

編程規範來自劉海波-《visual C++數字圖像處理技術詳解》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章