0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenCV4源碼分析

汽車電子技術 ? 來源:云深之無跡 ? 2023-02-22 10:00 ? 次閱讀

之前文章寫完有個Flag,要寫OpenCV的解讀,后面寫了展會,看書等無關緊要的文章,現在距離12點還有21分鐘,我就簡短的寫一點分析。

首先,源碼我是從Github上面直接拉的最新的代碼,刪除一些無關緊要的文件,就變成了下面這樣。

圖片

其實在4的時代,只要導入這個頭文件就行,因為這個文件就是把所有的實現做了一個匯總。

圖片

里面集成了所有要使用的頭文件

圖片

里面有著條件宏來控制功能的開關與否

圖片

每次處理都需要的圖片讀取函數,在這里被定義

圖片

整個文件里面有的函數和信息空間

圖片

這個函數就是判斷是不是一個圖像文件

圖片

我們注意到前面有個宏

圖片

這個是官方文檔給的函數的說明,看源碼之前一定要很熟悉官方的文檔才行

圖片

支持讀取的文件

圖片

所以這個宏是什么意思呢?

這里也插一句,我以前看騰訊的TinyOS就看到了很多這樣的函數定義,我就很疑惑,這個到底是怎么個用法?我為什么學的里面就有。

其實我理解的應該是,這個宏首先不影響函數的功能,就是有或沒有都沒有關系,那作用是啥?

是說明!說明這個函數的一些屬性,比如它是不是一個系統(tǒng)的API,或者是需要你調用的時候自己實現的。我是這樣的理解,如果不對也請聯系我,讓我搞明白這個事情。

這里解釋一下C++里面的這個前置宏(前綴?)的大致用法。

CV_EXPORTS_W在

modules/core/include/opencv2/core/types_c.h

中定義為 的別名

CV_EXPORTS

,并且在同一文件

CV_EXPORTS

中定義為:

#if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CVAPI_EXPORTS
# define CV_EXPORTS __declspec(dllexport)
#else
# define CV_EXPORTS
#endif

換句話說,它是定義:

__declspec(dllexport)

在windows平臺上的別名CVAPI_EXPORTS,否則為空。

上面代碼里面的_delcspce(dllexport)被定義為宏,這樣可以提高程序的可讀性!這個的作是是將函數定義為導出函數,也就是說這個函數要被包含這個函數的程序之外的程序調用!

CV_WARP 用作腳本的標志以創(chuàng)建函數或方法的包裝器。它用于創(chuàng)建 PythonJava 包裝器。

應該是多平臺之間不同的編譯器有不同的編譯選項,只是為了以后其它平臺有需要添加的或擴展的編譯時選項而預留的。例如在VC環(huán)境下進行回調函數的聲明時,很多時候都會加上**_stdcall、_cdecl、 _fastcall**這三個在windows平臺下指定函數調用的方式的編譯選項。所以,這種定義為空的宏的作用是預留下以后平臺移植時的其它選項的定義。應該僅僅是為了移植的方便。有時候也有可能是為了對函數進行標識,說明。

提高代碼的可移植性和平臺/編譯器無關性

宏定義必須寫在函數之外,其作用域是 #define 開始,到源程序結束。如果要提前結束它的作用域則用 #undef 命令

圖片

這樣的代碼幾乎在每個開源庫中都可能見到,主要的目的就是 C 和 C++ 混合編程,具體來說就是:

如果使用 gcc 來編譯,那么宏 __cplusplus 將不存在,其中的 extern "C" 將會被忽略;

如果使用 g++ 來編譯,那么宏 __cplusplus 就存在,其中的 extern "C" 就發(fā)生作用,編譯出來的函數名 hello 就不會被 g++ 編譯器改寫,因此就可以被 C 代碼來調用。

通過函數來實現:

形參的類型需要確定,調用時對參數進行檢查;

調用函數時需要額外的開銷:操作函數棧中的形參、返回值等;

通過宏來實現:

不需要檢查參數,更靈活的傳參;

直接對宏進行代碼擴展,執(zhí)行時不需要函數調用;

如果同一個宏在多處調用,會增加代碼體積;

時間太短只能寫這么多了~

圖片

晚安~

https://www.51cto.com/article/645044.html
https://zhuanlan.zhihu.com/p/447763456
https://pangda.blog.csdn.net/article/details/125497601
https://answers.opencv.org/question/6528/cv_wrap-and-cv_exports_w/
https://blog.csdn.net/lh1573378488/article/details/50519577
https://stackoverflow.com/questions/12083583/what-cv-exports-w-means
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4263

    瀏覽量

    62244
  • 源程序
    +關注

    關注

    63

    文章

    1693

    瀏覽量

    45354
  • 作用域
    +關注

    關注

    0

    文章

    6

    瀏覽量

    6097
收藏 人收藏

    評論

    相關推薦

    OpenCV4.8 CUDA編程代碼教程

    OpenCV4支持通過GPU實現CUDA加速執(zhí)行,實現對OpenCV圖像處理程序的加速運行,當前支持加速的模塊包括如下。
    的頭像 發(fā)表于 12-05 09:56 ?916次閱讀
    <b class='flag-5'>OpenCV</b>4.8 CUDA編程代碼教程

    魯班貓0 -安裝opencv

    ON OPENCV_GENERATE_PKGCONFIG 因為opencv4默認不生成.pc文件,所以加上這句用于生成opencv4.pc文件,支持pkg-config功能。opencv4
    發(fā)表于 04-09 13:29

    OpenCV3編程入門-源碼例程全集-OpenCV開發(fā)環(huán)境的配置

    OpenCV3編程入門-源碼例程全集-OpenCV開發(fā)環(huán)境的配置,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 16:27 ?20次下載

    OpenCV3編程入門-源碼例程全集-HoughLinesP函數

    OpenCV3編程入門-源碼例程全集-HoughLinesP函數用法示例
    發(fā)表于 09-18 16:38 ?10次下載

    OpenCV3編程入門-源碼例程全集-GaussianBlur函

    OpenCV3編程入門-源碼例程全集-GaussianBlur函數用法示例
    發(fā)表于 09-18 16:38 ?1次下載

    OpenCV3編程入門-源碼例程全集-點追蹤

    OpenCV3編程入門-源碼例程全集-點追蹤
    發(fā)表于 09-18 16:38 ?0次下載

    OpenCV3編程入門-源碼例程全集-播放視頻

    OpenCV3編程入門-源碼例程全集-播放視頻
    發(fā)表于 09-17 22:54 ?18次下載

    OpenCV3編程入門-源碼例程全集-人臉識別

    OpenCV3編程入門-源碼例程全集-人臉識別
    發(fā)表于 09-17 22:55 ?2次下載

    OpenCV3編程入門-源碼例程全集-模板匹配

    OpenCV3編程入門-源碼例程全集-模板匹配
    發(fā)表于 09-17 22:55 ?4次下載

    OpenCV進行基本繪圖_OpenCV3編程入門-源碼例程

    OpenCV3編程入門-源碼例程全集-用OpenCV進行基本繪圖,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 09-18 17:02 ?3次下載

    OpenCV的混合高斯背景模型源碼程序免費下載

    本文檔的主要內容詳細介紹的使用OpenCV的混合高斯背景模型源碼程序免費下載
    發(fā)表于 10-18 11:55 ?5次下載

    基于opencv4和Yolo-Fastest,實現PC和單片機通信,控制步進電機捕獲目標

    效果視頻 基于opencv4和yolo,實現PC和單片機通信,控制步進電機捕獲目標
    發(fā)表于 11-23 17:36 ?16次下載
    基于<b class='flag-5'>opencv4</b>和Yolo-Fastest,實現PC和單片機通信,控制步進電機捕獲目標

    如何在Raspberry Pi 3上安裝OpenCV4

    今天我們將學習如何在 Raspberry Pi 3 上安裝 OpenCV4 庫,以便我們可以將其用于計算機視覺應用程序。這將允許 OpenCV 在像 Pi 這樣的便攜式設備上運行,從而打開許多可能性的大門。所以讓我們開始吧
    的頭像 發(fā)表于 09-08 16:09 ?1553次閱讀
    如何在Raspberry Pi 3上安裝<b class='flag-5'>OpenCV4</b>庫

    qt opencv opencl opengl源碼例程

    qt-opencv-opencl-opengl-源碼例程
    發(fā)表于 09-27 14:42 ?1次下載

    學習OpenCV4的系統(tǒng)化路線圖

    OpenCV4發(fā)布測試版本開始,作者就一直關注!根據自己近十年圖像處理OpenCV開發(fā)相關工作經驗,花了七個月的時間,針對OpenCV4、精心選擇OpenCV中常用模塊與知識點,構建
    的頭像 發(fā)表于 07-05 11:30 ?563次閱讀
    學習<b class='flag-5'>OpenCV4</b>的系統(tǒng)化路線圖