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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV4源碼分析

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

之前文章寫完有個(gè)Flag,要寫OpenCV的解讀,后面寫了展會(huì),看書等無關(guān)緊要的文章,現(xiàn)在距離12點(diǎn)還有21分鐘,我就簡(jiǎn)短的寫一點(diǎn)分析。

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

圖片

其實(shí)在4的時(shí)代,只要導(dǎo)入這個(gè)頭文件就行,因?yàn)檫@個(gè)文件就是把所有的實(shí)現(xiàn)做了一個(gè)匯總。

圖片

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

圖片

里面有著條件宏來控制功能的開關(guān)與否

圖片

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

圖片

整個(gè)文件里面有的函數(shù)和信息空間

圖片

這個(gè)函數(shù)就是判斷是不是一個(gè)圖像文件

圖片

我們注意到前面有個(gè)宏

圖片

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

圖片

支持讀取的文件

圖片

所以這個(gè)宏是什么意思呢?

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

其實(shí)我理解的應(yīng)該是,這個(gè)宏首先不影響函數(shù)的功能,就是有或沒有都沒有關(guān)系,那作用是啥?

是說明!說明這個(gè)函數(shù)的一些屬性,比如它是不是一個(gè)系統(tǒng)的API,或者是需要你調(diào)用的時(shí)候自己實(shí)現(xiàn)的。我是這樣的理解,如果不對(duì)也請(qǐng)聯(lián)系我,讓我搞明白這個(gè)事情。

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

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平臺(tái)上的別名CVAPI_EXPORTS,否則為空。

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

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

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

提高代碼的可移植性和平臺(tái)/編譯器無關(guān)性

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

圖片

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

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

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

通過函數(shù)來實(shí)現(xiàn):

形參的類型需要確定,調(diào)用時(shí)對(duì)參數(shù)進(jìn)行檢查;

調(diào)用函數(shù)時(shí)需要額外的開銷:操作函數(shù)棧中的形參、返回值等;

通過宏來實(shí)現(xiàn):

不需要檢查參數(shù),更靈活的傳參;

直接對(duì)宏進(jìn)行代碼擴(kuò)展,執(zhí)行時(shí)不需要函數(shù)調(diào)用;

如果同一個(gè)宏在多處調(diào)用,會(huì)增加代碼體積;

時(shí)間太短只能寫這么多了~

圖片

晚安~

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
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • 源程序
    +關(guān)注

    關(guān)注

    63

    文章

    1693

    瀏覽量

    45311
  • 作用域
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    6092
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    OpenCV4.8 CUDA編程代碼教程

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

    魯班貓0 -安裝opencv

    ON OPENCV_GENERATE_PKGCONFIG 因?yàn)?b class='flag-5'>opencv4默認(rèn)不生成.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函數(shù)

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

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

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

    OpenCV3編程入門-源碼例程全集-點(diǎn)追蹤

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

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

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

    OpenCV3編程入門-源碼例程全集-人臉識(shí)別

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

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

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

    OpenCV進(jìn)行基本繪圖_OpenCV3編程入門-源碼例程

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

    OpenCV的混合高斯背景模型源碼程序免費(fèi)下載

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

    基于opencv4和Yolo-Fastest,實(shí)現(xiàn)PC和單片機(jī)通信,控制步進(jìn)電機(jī)捕獲目標(biāo)

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

    如何在Raspberry Pi 3上安裝OpenCV4

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

    qt opencv opencl opengl源碼例程

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

    學(xué)習(xí)OpenCV4的系統(tǒng)化路線圖

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