OpenCV3學習筆記(一) OpenCV簡介及安裝
因為最近想做圖像處理、人臉檢測/識別之類的相關開發,所以就開始補OpenCV的相關知識,便開個專欄用於記錄學習歷程和在學習過程中遇到的一些值得注意的重點和坑。學習過程基本上也是面向官方文檔和Google。
簡介
OpenCV(開源的計算機視覺庫)是基於BSD協議,因此它可免費用於學術和商業用途。其提供C++,C,Python和Java介面,支持Windows,Linux,Mac OS,iOS和Android。OpenCV致力於高效運算和即時應用開發。因其是用優化的C/C++編寫的,故其可以充分利用多核處理優勢。並且還啟用了OpenSL,它可以利用底層異構計算平台的硬體加速。廣泛運用在世界各地,OpenCV擁有超過4.7萬人的用戶社區和超過1400萬的下載次數。從互動藝術、礦山檢查、網路地圖到先進的機器人技術都有OpenCV的身影。
它包含了數百個計算機視覺演算法。它有一個模塊化的結構,囊括了幾個共享的或靜態的庫,其中包括:
- Core functionality(核心功能):一個簡潔基本且模塊化的數據結構,包含了多維數組(矩陣)和用於其他模塊的基本功能。
- Image processing(圖像處理):包括線性和非線性的圖像濾波、幾何圖像轉換(縮放、仿射和透視調整)、顏色模式轉換、直方圖等等。
- Video(視頻):一個視頻分析模塊,其包含了運動估計、背景消除和目標跟蹤演算法。
- Calib3d:提供基本的多視圖幾何演算法、平面和立體影像校正、物體定位、立體通信演算法和三維重建。
- Features2d:顯著特徵探測器、描述符和描述符匹配器。
- Objectect:檢測對象和預定義的類的實例(例如:臉部、眼睛、杯子、人、車等等)。
- Highgui(圖形界面):提供一個簡單易用的UI。
- Video I/O:提供一個簡單易用的視頻捕獲和編碼解碼界面。
- GPU:來自於不同的OpenCV模塊的GPU加速演算法。
- ......一些其他的輔助模塊,例如FLANN(神經網路)和Google測試封裝、Python綁定等等。
下面來講一下OpenCV的下載和安裝(C++和Python3 API)。
C++
先從官網上下載好文件包:Releases - OpenCV library
建議選擇最新的3.3.1 Win Pack。
下載好後,雙擊運行exe程序解壓,選擇一個解壓後的目錄。(其會自動生成一個opencv目錄,不需要單獨再創一個opencv目錄。另,不建議將其解壓到C盤根目錄下的Program Files或Program File (x86)目錄下,可能會因系統許可權導致各種問題)
解壓完畢後,將其寫入系統的環境變數中,向Path中添加一條:"解壓後opencv所在的文件夾目錄opencvuildx64vc14in",例如我將其解壓在C:Leon下,則添加:C:Leonopencvuildx64vc14in。
這樣OpenCV3.3.1就算安裝好了,接下來就在自己IDE中配置一下就行。
例如我C++開發環境是Visual Studio 2017,相應的項目創建配置流程如下:
1. 打開Visual Studio,新建一個項目(快捷鍵Ctrl+Shift+N),項目名自取,選擇好創建目錄。
2. 新建一個C++文件(快捷鍵Ctrl+Shift+A)。
3. 將菜單欄下的Debug後的x86改為x64。
4. 單擊右側窗口的Property Manager(屬性管理),或者點擊菜單欄中的View(視圖)->Other Windows(其他窗口)->Property Manager(屬性管理)。
5. 右鍵屬性管理窗口中的Debug | x64,選擇Property(屬性),編輯包含目錄。
6. 添加三個目錄路徑並確定。(注意路徑是你opencv安裝的路徑)
7. 同理,添加庫目錄,如圖所示。
8. 添加附加依賴項。鏈接器->輸入->附加依賴項。將open_world331d.lib鍵盤敲入(注意opencv版本,3.3.1是331,其他版本自行腦補)。
9. 確定,應用。庫的導入已經完成了。接下來就可以開始OpenCV相關開發了。
10. 先將以下代碼(功能是顯示一張圖片)寫入項目中的Source.cpp文件,編譯鏈接運行(快捷鍵Ctrl+F5),看是否能跑起來,跑起來了說明配置成功!
#include <opencv2/opencv.hpp>using namespace cv;int main() { Mat img = imread("C:\Users\11537\Desktop\新垣結衣.jpg"); //引號內選一張自己計算機內的圖片的路徑 imshow("新垣結衣", img); //打開一個窗口,顯示圖片 waitKey(0); //在鍵盤敲入字元前程序處於等待狀態 destroyAllWindows(); //關閉所有窗口 return 0;}
測試效果圖如下:
Python 3.x
相對於C++,Python的Opencv庫導入就相對簡單很多了。一提及Python安裝第三方庫,大家第一時間會想到pip,的確pip是Python第三方庫安裝的利器。
首先我們得先安裝另一個第三方庫numpy,這是opencv的依賴庫,沒有它無法進行python-opencv開發。
很簡單,保持有網狀態命令行下輸入pip install numpy,自動下載安裝完後搞定。
比較遺憾的是默認的pip源中沒有opencv這個庫,不能直接pip install opencv,不過這時候我們可以下載其whl文件,下載地址:Python Extension Packages for Windows
在頁面中找到OpenCV欄,根據自己計算機中Python解釋器版本選擇下載文件。
下載好後,通過命令行到whl文件目錄下,pip install [下載的whl完整文件名]。例如pip install opencv_python-3.3.1-cp36-cp36m-win_amd64.whl
tip: 可以通過這個方法下載其他whl文件,用法一樣,可以在無網狀態下直接pip install whl文件導入第三方庫
對於PyCharm用了Virtualenv虛擬環境的用戶,可以在IDE中打開命令行界面到該項目venv/Scripts目錄下./pip install numpy以及whl文件導入虛擬目錄site-packages文件夾中。
同樣上個測試代碼(功能是顯示一張圖片):
import numpy as npimport cv2def cv2_imread(file_path, flag=1):"""解決包含中文的路徑cv2.imread無法打開的問題的函數""" return cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), flag)if __name__ == "__main__": img = cv2_imread("C:\Users\11537\Desktop\長澤雅美.jpg") #第一個參數選一張自己計算機內的圖片的路徑 cv2.imshow("Nagasawa Masami", img) #python的cv2.imshow第一個參數(即窗口名)為中文會亂碼,至今未找到有效解決方案 cv2.waitKey(0) #在鍵盤敲入字元前程序處於等待狀態 cv2.destroyAllWindows() #關閉所有窗口
測試效果圖如下:
小結
一次OpenCV初體驗,個人覺得可能是歷史遺留問題(以前的OpenCV是完全由C實現的),OpenCV的OOP特性並不強,跟Python的另一個圖像庫pillow相比用起來感覺有點怪。不過不得不說,OpenCV還是挺強大的。至於C++和Python關於OpenCV介面問題,其實實現都大同小異,也沒必要糾結於到底用C++好還是Python好,移植重構很容易。後續打算記錄一下OpenCV關於圖像和基於矩陣處理的相關筆記。
參考文獻
- OpenCV: Introduction
推薦閱讀:
※請教各位朋友cv2的python版本中imwrite無法生成帶有中文路徑的圖片?
※OpenCV人臉識別之二:模型訓練
※[171106] 基於 Python OpenCV 圖像處理和機器學習的光學字元識別(OCR)
※opencv Mat類型的轉換問題?
※[171102] Python3 OpenCV3 圖像處理基礎(Python3 + Numpy + Matplotlib + OpenCV3 + PyQt5 ...)