OpenCV(Open Source Computer Vision Library)是一個開源軟體(原始碼可以任意取用的電腦軟體)的計算機視覺和機器學習軟件庫(是一個跨平台的電腦視覺庫)。 OpenCV 旨在為計算機視覺應用程序提供通用基礎設施,並加速機器感知在商業產品中的使用。是由Intel發起並參與開發,能夠使用不同語言開發例如: Java、Python、C/C++、MATLAB...主要為C++,也可以在不同環境下使用例如:Windows, Linux, Android and Mac OS,甚至可以使用於擴增實境、人機互動、運動跟蹤、物體辨識、圖像分割、機器人等領域。
OpemCV 的函式庫非常巨大,舉例來說單論物件追蹤OpenCV就提供了非常多種演算法:
2018年10月4.0.0釋出,OpenCV開始需要支援C++11的編譯器才能編譯,同時對幾百個基礎函式使用 "wide universal intrinsics" 重寫,在深度學習部份也有重大變革,這些行內函數(inline function)可以根據目標平臺和編譯選項對映為SSE2、 SSE4(for x86)、 AVX2(for ARM)、MSA(for MIPS)或者 VSX (for PowerPC)行內函數,獲得性能提升,此外還有一些重要更新如下:
在objdetect module中加入了QR code的檢測和識別
增加ONNX 轉換格式(Open Neural Network Exchange是一套開放神經網路交換格式 )等新特點
實現Kinect Fusion algorithm,是一個基於RGBD相機的適用於任何環境光照的實時重建追蹤和重建演算法
為 CPU 和 GPU (OpenCL) 進行優化
持續改善和擴充DNN module(Deep Neural Networks, 深度神經網路),DNN module 新增加了一項實驗性的Vulkan 後端功能,Vulkan 是跨平台的 3D 圖形計算 API
從4.0版本開始移除了從1.x板本就存在的C API
新增加module G-API ,這個module是一個基於圖像處理流程(graph-based image processing pipelines)非常高效的引擎
core module中的 Persistence(用於存儲和加載 XML、YAML 或 JSON 格式的結構化數據)可以完全使用 C++ 來重新實現
右側的影片中測試了 Opencv 4 和 3.2的 proformance,均未使用GPU,使用 i7 處理器將程式環境盡可能的優化。
首先,進入OpenCV官網,點入Releases,便會列出OpenCV歷代的版本提供使用者下載,我並未選擇最新的版本,而是選擇OpenCV-4.6.0的Windos版本來下載。
下載完成後開起執行檔開始安裝OpenCV,選擇要下載的路徑後等待程式安裝完成。
安裝完成後,打開系統管理員輸入兩行指令:
[System.Environment]::SetEnvironmentVariable("PATH",$Env:Path+";C:\OpenCV\opencv\build\x64\vc15\bin","Machine")
[environment]::GetEnvironmentVariable("PATH","Machine")
確認環境變數已設置完成。
本次練習欲於Visual Studio的環境中編譯OpenCV 的Example ,在引入OpenCV 的Example 前需先進行一些前置作業,步驟如下。
首先,打開 Visual Studio,建立一個空白專案。
進入專案後,叫出屬姓管理員的路徑,如上圖所示: 檢視 > 其他視窗 >屬性管理員
於屬性管理員中,於Debug x64的根目錄中建立新的專案屬性工作表,將之命名為"opencv460",以方便後續管理。
在專案屬性工作表的"屬性"選項中開啟屬性頁,接著開始設定屬性,一共有三個部分需要設定,如下所示。
於 "VC++目錄 > 包含目錄" 下寫入:
C:\OpenCV\opencv\build\include
於 "VC++目錄 > 程式庫目錄" 下寫入:
C:\OpenCV\opencv\build\x64\vc15\lib
打開 OpenCV的檔案確認要引入的library,路徑為"opencv > build > x64 > vc15 > lib"
接著於 "連結器 > 輸入 > 其他相依性" 下寫入: opencv_world460d.lib
"屬性" 皆設定好後,就可以寫入要執行的程式碼。
其中程式碼需修改成要載入的圖片的路徑,即為修改成:
string image_path = "C:/Users/oscar/Downloads/opencv_image.png"; //寫入欲載入圖片的路徑
Code:
#include<opencv2/core/core.hpp> //引入library
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace cv; //命名空間宣告
using namespace std;
int main() {
string image_path = "C:/Users/oscar/Downloads/opencv_image.png"; //寫入要載入圖片的路徑
Mat image = imread(image_path, IMREAD_COLOR); //以矩陣的形式將路徑所指向的資料儲存起來
//Mat意思是矩陣(Matrix)大小是固定的,包含矩陣的大小,儲存的方式,矩陣儲存的地址
resize(image, image, { 500, 500 }, 0, 0, cv::INTER_NEAREST); //將圖片為500*500的矩陣並以最近臨插值呈現
imshow("Image", image); //輸出圖片
waitKey(0);
return 0;
}
輸入程式碼後,接著開始進行編譯(compiler),最後便會跑出路徑所指向的圖片,執行結果如下圖所示。了解以上程式碼各行所代表的意思後,驗證結果正確。
https://steam.oxxostudio.tw/category/python/ai/ai-tracker.html#a1
https://funvision.blogspot.com/2018/11/people-head-detection-performance.html
https://blog.tibame.com/?p=15141
https://www.youtube.com/watch?v=wn96sXxAnDE&t=81s
https://www.itread01.com/liycc.html