在OpenCV庫中新增自定義函式和修改庫函式
目錄

在OpenCV庫中新增自定義函式和修改庫函式

OpenCV庫函式功能強大,但是有時候並不能滿足我們搞影象處理的,所以有時候想修改庫函式或者新增自定義函式,然後在自己編寫的程式中像OpenCV那樣呼叫它。修改庫函式比較簡單,新增自定義函式也不是很複雜。下面給大家一個修改OpenCV庫函式文章

一、修改OpenCV庫函式

先要下載cmake對OpenCV進行編譯。

‘’我給的文章有cmake編譯連結,很簡單,選好自己的VS版本,比如我是VS2010,我就選生成的檔案是VS2010版本的OpenCV.sln檔案。開啟.sln檔案,就可以看見OpenCV的C 原始碼了。

準備工作完畢,則開始修改庫函式。

‘’(注意:這裡是修改庫函式裡面的程式碼,如果您想新增自定義引數,請看本文的第二節“新增自定義函式”,因為修改庫函式程式碼和新增引數或者新增庫函式不是一個方法。)連結的文章講的比較清楚了,這裡也不再贅述,如果有什麼不懂的地方,您可以私信我。

二、在OpenCV中新增自定義函式

新增庫函式的引數和新增自定義函式是一個道理,心細的同學可以看出,沒編譯之前,我們用OpenCV做影象處理時,需要在VS中在專案中新增OpenCV相關.dll檔案和.lib檔案,所以我們新增庫函式也需要修改對應的.dll檔案和.lib檔案。

在VS中開啟OpenCV.sln檔案,新增您自己定義的函式需要以下步驟:

‘’我以在modules下的opencv_imgproc專案中新增自定義C 程式碼函式“newCorner()”為例。

1、開啟“imgproc.hpp”

‘’opencv_imgproc專案中找到Include資料夾並開啟,,是C 語言寫的,“imgproc_c.h”是C語言標頭檔案,如果你是C語言編寫的,那就開啟這個個檔案。

2、新增自定義函式

‘’找到程式碼中很多庫函式定義語句處,仿造OpenCV庫函式定義的程式碼寫進去**,比如看圖:
這裡寫圖片描述圖中“newCorner()”是我自定義函式,注意影象格式Mat型別也要轉換成InputArray型別,再在自定義函式中新增如下語句:

Mat img=_img.getMat();

其實大家可以參考OpenCV庫函式寫,它怎麼改的我們也怎麼改,這樣在重新生成的時候不會出錯。

3、在cpp中新增函式程式碼

‘’檔案包含檔案寫進了函式,儲存一下,然後開啟該專案下的Src資料夾,看到很多cpp檔案,你可以新增cpp檔案,也可以開啟某個cpp檔案再新增你的自定義函式程式碼。我這裡為了以後好查詢修改,自己新增了cpp檔案,命名為“newCorner.cpp”,我也建議我們自己新增單獨的cpp檔案,以後好查詢修改。

4、#include裡寫什麼呢?

‘’因為你本身在OpenCV庫函式中,所以可以不需要再#include< opencv2/……hpp>類似的程式碼了,不過你也可以寫,應該沒關係,我是沒寫。涉及到什麼就#include什麼就行。

5、複製你的C 原始碼。

‘’將測試沒問題的函式程式碼複製過來,要確保沒問題,有問題在這上面除錯很麻煩很麻煩,建議之前測試100%沒問題就複製過來。複製過來需要改的地方不太多,不過有幾個重要的。

1)你等下在外部專案中呼叫這個自定義“newCorner”函式時,除了剛才所說的引數種Mat全部換成InputArray型別外,還需要在函式前面加上cv::,比如void cv::newCorner(InputArray _img),然後再函式第一行加第二步所提到的語句就可以隨意使用Mat型別,其他非呼叫函式可以不修改。

2)對於非呼叫函式引數,無需修改其他地方,但是如果在外面也需要單獨呼叫該函式,就需從第一步跟newCorner函式一樣加入相關程式碼。

比如看下面的一段程式碼:

......
void Fmans(Mat img)//只能是被該cpp呼叫的函式寫法
{
......
}
void cv::newCorner(InputArray _img)//需要被外部呼叫函式寫法
{
Mat img=_img.getMat();
Fmans(img);
.......
}

從上面一段程式碼就一個很好理解了,具體原理需要懂得C ,對我來說C 是硬傷,就不想去深究了。

6、重新生成dll和lib檔案。

‘’現在選擇“opencv_imgproc”專案,滑鼠右擊,點選“重新生成”,會提示“重新生成工作開始..”,耐心等待一會,如果出現“重新生成完成”,那麼恭喜你,程式編譯通過了,注意只是通過了,並不代表程式碼跑起來沒有問題。如果“重新生成失敗”,然後下面一大堆問題,不著急,對著問題自己一個一個修改,修改過程中對照OpenCV庫函式,它們怎麼寫的,你也就跟著怎麼修改的就好了,如果修改後還是有問題,沒關係,多查查問題,相信通過自己的細心觀察會解決好這些問題的, 也可以私信我和我交流,我能力也有限,我們共同探討問題解決問題。

7、替換.lib和.dll。

‘’重新生成成功之後,找到OpenCV.sln所在資料夾,找到bin資料夾並開啟,再開啟Debug資料夾,找到“opencv_imgproc2410d.dll”檔案。(這裡我是在opencv_imgproc專案中修改的併成功重新生成,所以我找“opencv_imgproc2410d.dll”檔案,如果你是修改其他專案的程式碼,那麼需要找到您所修改專案對應名稱的.dll檔案,這裡要注意看清楚是.dll檔案。)複製“opencv_imgproc2410d.dll”檔案,找到您安裝的opencv目錄,開啟build->x86->vc10->bin,點選貼上,選替換。
‘’這個路徑是因專案而異,根據您所建立的外部專案中連結OpenCV庫的路徑,可以選擇專案右擊->屬性->配置屬性->VC 目錄->庫目錄,把.dll檔案放到該目錄下的bin檔案裡即可。同樣的,”opencv_imgproc2410d.lib”檔案就放在lib資料夾裡。建議都儲存一下之前相關的.dll和.lib檔案。ok了!

8、最後一步,寫的好累。

‘’回到您的外部專案,當你滿懷欣喜的敲入cv::,發現並沒有這個newCorner()函式,很傷心,前面的都白寫了?no!你回到你安裝opencv的目錄下,開啟build->include->opencv2->imgproc->imgproc.hpp,這裡跟第一步一樣加入那句程式碼–“CV_EXPORTS_W void newCorner……”,儲存就可以了。你重新回到您的專案中,再次cv::,發現newCorner沒?如果沒有,可以私信我,如果看見了,就自己默默開心一下。

**總結

修改庫函式比較簡單,注意的地方比較少,新增庫函式後你就把自定義函式看成是OpenCV的 庫函式。如果你只是修改函式裡面的程式碼,只需要按照第一節說的那樣,只需要替換.dll檔案就行了,如果是修改庫函式引數,或者新增,就安裝第二節那樣做。圖片很少,基本上都是文字敘述,囉囉嗦嗦地說完了。只是希望自己走錯的路不想讓別人也走,在新增或者修改時遇到什麼問題都可以和我交流,共同提高進步,我自己也是被逼無奈自己瞎琢磨出來的,可能有些不對的地方,望見諒,謝謝!