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模塊太多,太大,這個都不是事,關鍵是你會用嗎?