做地方旅游網(wǎng)站目的意義正規(guī)的教育培訓機構有哪些
一、準備軟件
- OpenCV源碼
- CMake工具
- MinGW工具鏈(需要選用 posix 線程版本:原因見此)
二、操作步驟
官網(wǎng)提供了VC16構建版本的二進制包,但是沒有給出GCC編譯的版本。所以如果使用MinGW進行構建,那就只能從源碼開始構建了。
但是如果你愿意用MSVC的話,那就可以跳過編譯的步驟(當然也可以不跳過),直接使用二進制文件,進行后面的軟件設計:
2.1 使用cmake
打開 cmake-gui.exe
。
選擇目錄、選擇編譯器。通常應該能自動選上MinGW,如果沒有選上的話,可能MinGW路徑沒有加入環(huán)境變量:
輸入 world
,打開 BUILD_opencv_world
的開關,這控制著將所有有關OpenCV的函數(shù)全部輸出到一個文件中。
如果你不需要這一點,也可以不選。
中途可能報錯,但是沒有關系,OpenCV的主要函數(shù)功能應該都是可以編譯通過的:
2.2 使用mingw
在build目錄下打開cmd,運行下面兩行。其中 -j8
表示啟用8線程并行編譯,也可以不加:
mingw32-make -j8
mingw32-make install
第一條命令會運行很長很長時間。
第二條命令會創(chuàng)建一個名為 install
的文件夾,目錄結構大概是這個樣子:
這個文件夾路徑要記住,后面要用。
2.3 編寫OpenCV程序
寫一段計算兩個旋轉矩形的IoU的算法,其中 rotatedRectIOU
函數(shù)來自于 ~\opencv\modules\dnn\src\nms.cpp
文件。
但是由于原本的這個函數(shù)是 inline 的,所以無法直接調用。
我這里直接復制過來了:
/* main.cpp */#include "opencv2/opencv.hpp"using namespace cv;float rotatedRectIOU(const RotatedRect& a, const RotatedRect& b) {std::vector<Point2f> inter;int res = rotatedRectangleIntersection(a, b, inter);if (inter.empty() || res == INTERSECT_NONE)return 0.0f;if (res == INTERSECT_FULL)return 1.0f;float interArea = contourArea(inter);return interArea / (a.size.area() + b.size.area() - interArea);
}int main() {auto rect1 = RotatedRect(Point2f(2, 2), Size2f(3, 4), 45);auto rect2 = RotatedRect(Point2f(2, 2), Size2f(4, 3), 30);auto iou = rotatedRectIOU(rect1, rect2);std::cout << "IoU: " << iou << std::endl;return 0;
}
測試輸入的兩個旋轉矩形,畫出來是這么個效果:
我拿尺子測量了一下,矩形面積12平方 ,平行四邊形面積9.3平方。
按照定義,IoU應大致為:
I o U = 9.3 / ( 12 + 12 ? 9.3 ) = 0.633 IoU = 9.3 / (12 + 12 - 9.3) = 0.633 IoU=9.3/(12+12?9.3)=0.633
拿程序驗證一下,編寫 dist.bat
文件,其中 ^
是轉義的意思,可以方便將多行代碼寫到一行內:
@echo offset install=<INSTALL_FOLDER>g++ main.cpp -o main.exe ^-I %install%/include ^-L %install%/x64/mingw/lib ^-l opencv_world490
其中 -I
控制的是頭文件目錄,-L
控制的是庫文件目錄,-l
是具體要鏈接的庫文件的名字(去掉開頭的 lib
和后面的 .dll.a
后綴)。
INSTALL_FOLDER
:這里填寫前面 mingw32-make install
命令生成出來的文件夾路徑。如果操作步驟都和我一致的話,路徑應該是 ~/opencv/build/install
。
mingw
:這里使用MinGW編譯,所以文件夾是在 mingw
路徑。如果使用MSVC編譯,文件夾路徑應該類似于是 vc16
。
world
:前面勾選了 BUILD_opencv_world
開關,所以這里會是 opencv_world
這個庫文件名。如果你前面沒有勾選,則你在程序中引用了哪個庫文件的函數(shù),則需要加上哪個庫的名字。
490
:我這里使用的是 4.9.0
的版本,所以數(shù)字編號是 490
。如果版本不同,需要根據(jù)實際情況修改。
2.4 運行程序
運行程序,需要將 ~\install\x64\mingw\bin
目錄下的 libopencv_world490.dll
文件拷貝到運行程序的同級目錄下。
最后運行 main.exe
,返回結果為:
IoU: 0.634597
和繪圖計算結果驗證正確。