OpenCV CMake 模塊裁剪


OpenCV架構與模塊組成

01

OpenCV是一個大而全的完整的計算機視覺庫,有時候我們項目只是用到了一些基礎功能,並沒有必要用OPenCV的官方編譯好的版本,那個對我們來說太大啦,這個時候其實我們可以重新對OpenCV編譯,在編譯時候選擇我們需要的模塊,其它不需要的統統去掉,然后再完成cmake編譯,這樣得到的就是一個OpenCV的精簡版本,一般情況會比現在的小很多,而且很多傳統的算法都還可以很好的工作,要完整這樣一件事情,首先需要了解一下OpenCV模塊的整體的架構與設計。

 

 

對上圖說明如下:

水平橫着的都是基礎模塊,這個是OpenCV模塊裁剪的時候必須選上的。豎直的模塊都是OpenCV中在CMake生成階段可配置選擇的模塊,如果需要你就加上,如果不需要就去掉。

 

我們一般的圖像處理,都可以通過 基礎模塊 + 自定義算法實現,我一般重新編譯的時候都會把DNN模塊也選擇上,基本上是 基礎模塊 + DNN + 自定義算法實現,其它的模塊沒有必須則不必勾選,這樣整個OpenCV編譯完成以后,體積會下降,有利於打包。這點在嵌入式設備上特別重要。

 

CMake配置與生成

02

通過前面的介紹我們已經知道如何去做了,現在我們以windows下面編譯OpenCV源碼為例來說明。首先需要對整個源碼進行cmake,生成VS工程,在cmake階段,我們可以通過配置來選擇需要的模塊,我的選擇最終如下:

 

 

可以看到,只選擇基礎模塊,其它的都沒有被勾選,這里有一點需要注意,記得把:

BUILD_opencv_world

這個選項勾上,在VS生成install階段時候只生成一個lib與dll文件。

 

生成好的VS工程之后,雙擊 OpenCV.sln 就可以打開。先生成debug版本,在切換到release模式下就可以生成release版本。VS編譯結果如下:

 

 

可以看到,這里我們只編譯很少部分的模塊,總計21個模塊,可以滿足大部分應用場景使用,真正的80/20規則。這個對我們來說是個好消息,下面我就一起來驗證下,我們這樣編譯出來的OpenCV是否可以用?

 

驗證裁剪編譯版本OpenCV功能

03

重新配置好開發環境(包含目錄 + 庫目錄 + 連接器 + 環境變量, 然后重啟VS2015/VS2019),運行以下測試代碼:

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 
 4 using namespace cv;  5 using namespace std;  6 
 7 int main(int argc, char** argv) {  8     Mat src = imread("D:/images/test.png");  9     if (src.empty()) { 10         printf("could not load image file..."); 11         return -1; 12  } 13     namedWindow("input", WINDOW_AUTOSIZE); 14     imshow("input", src); 15     waitKey(0); 16     return 0; 17 }

運行結果如下:

 

我已經做過的一個項目,我知道它只用了圖像處理模塊,重新編譯運行測試結果如下:

 

 

 OpenCV重新編譯與模塊裁剪技能GET,從此以后千萬別在我面前說OpenCV模塊太多,太大,這個都不是事,關鍵是你會用嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM