一、OpenCV簡介
OpenCV是一款由Intel公司俄羅斯團隊發起并參與和維護的一個計算機視覺處理開源軟體庫,支援與計算機視覺和機器學習相關的衆多算法,并且正在日益擴充。
1.1 OpenCV的優勢:
-
程式設計語言
OpenCV基于C++實作,同時提供python, Ruby, Matlab等語言的接口。OpenCV-Python是OpenCV的Python API,結合了OpenCV C++ API和Python語言的最佳特性。
-
跨平台
可以在不同的系統平台上使用,包括Windows,Linux,OS X,Android和iOS。基于CUDA和OpenCL的高速GPU操作接口也在積極開發中
- 活躍的開發團隊
-
豐富的API
完善的傳統計算機視覺算法,涵蓋主流的機器學習算法,同時添加了對深度學習的支援。
1.2 OpenCV-Python
OpenCV-Python是一個Python綁定庫,旨在解決計算機視覺問題。
Python是一種由Guido van Rossum開發的通用程式設計語言,它很快就變得非常流行,主要是因為它的簡單性和代碼可讀性。它使程式員能夠用更少的代碼行表達思想,而不會降低可讀性。
與C / C++等語言相比,Python速度較慢。也就是說,Python可以使用C / C++輕松擴充,這使我們可以在C / C++中編寫計算密集型代碼,并建立可用作Python子產品的Python包裝器。這給我們帶來了兩個好處:首先,代碼與原始C / C++代碼一樣快(因為它是在背景工作的實際C++代碼),其次,在Python中編寫代碼比使用C / C++更容易。OpenCV-Python是原始OpenCV C++實作的Python包裝器。
OpenCV-Python使用Numpy,這是一個高度優化的資料庫操作庫,具有MATLAB風格的文法。所有OpenCV數組結構都轉換為Numpy數組。這也使得與使用Numpy的其他庫(如SciPy和Matplotlib)內建更容易。
1.3 OpenCV部署方法
安裝OpenCV之前需要先安裝numpy, matplotlib。
建立Python虛拟環境cv, 在cv中安裝即可。
先安裝OpenCV-Python, 由于一些經典的算法被申請了版權,新版本有很大的限制,是以選用3.4.3以下的版本
pip install opencv-python==3.4.2.17
現在可以測試下是否安裝成功,運作以下代碼無報錯則說明安裝成功。
import cv2
# 讀一個圖檔并進行顯示(圖檔路徑需自己指定)
lena=cv2.imread("1.jpg")
cv2.imshow("image",lena)
cv2.waitKey(0)
如果我們要利用SIFT和SURF等進行特征提取時,還需要安裝:
pip install opencv-contrib-python==3.4.2.17
1.4 OpenCV的子產品
下圖列出了OpenCV中包含的各個子產品:
其中core、highgui、imgproc是最基礎的子產品,該課程主要是圍繞這幾個子產品展開的,分别介紹如下:
- core子產品實作了最核心的資料結構及其基本運算,如繪圖函數、數組操作相關函數等。
- highgui子產品實作了視訊與圖像的讀取、顯示、存儲等接口。
- imgproc子產品實作了圖像處理的基礎方法,包括圖像濾波、圖像的幾何變換、平滑、門檻值分割、形态學處理、邊緣檢測、目标檢測、運動分析和對象跟蹤等。
對于圖像處理其他更高層次的方向及應用,OpenCV也有相關的子產品實作
- features2d子產品用于提取圖像特征以及特征比對,nonfree子產品實作了一些專利算法,如sift特征。
- objdetect子產品實作了一些目标檢測的功能,經典的基于Haar、LBP特征的人臉檢測,基于HOG的行人、汽車等目标檢測,分類器使用Cascade Classification(級聯分類)和Latent SVM等。
- stitching子產品實作了圖像拼接功能。
- FLANN子產品(Fast Library for Approximate Nearest Neighbors),包含快速近似最近鄰搜尋FLANN 和聚類Clustering算法。
- ml子產品機器學習子產品(SVM,決策樹,Boosting等等)。
- photo子產品包含圖像修複和圖像去噪兩部分。
- video子產品針對視訊處理,如背景分離,前景檢測、對象跟蹤等。
- calib3d子產品即Calibration(校準)3D,這個子產品主要是相機校準和三維重建相關的内容。包含了基本的多視角幾何算法,單個立體攝像頭标定,物體姿态估計,立體相似性算法,3D資訊的重建等等。
- G-API子產品包含超高效的圖像處理pipeline引擎
二、圖像的基礎操作
2.1 圖像的IO操作
這裡我們會給大家介紹如何讀取圖像,如何顯示圖像和如何儲存圖像。
(1)讀取圖像
- API
cv.imread()
參數:
- 要讀取的圖像
- 讀取方式的标志
- cv.IMREAD*COLOR:以彩色模式加載圖像,任何圖像的透明度都将被忽略。這是預設參數。
- cv.IMREAD*GRAYSCALE:以灰階模式加載圖像
-
cv.IMREAD_UNCHANGED:包括alpha通道的加載圖像模式。
可以使用1、0或者-1來替代上面三個标志
- 參考代碼
import numpy as np
import cv2 as cv
# 以灰階圖的形式讀取圖像
img = cv.imread('messi5.jpg',0)
注意:如果加載的路徑有錯誤,不會報錯,會傳回一個None值
(2)顯示圖像
1 . API
cv.imshow()
參數:
- 顯示圖像的視窗名稱,以字元串類型表示
- 要加載的圖像
注意:在調用顯示圖像的API後,要調用cv.waitKey()給圖像繪制留下時間,否則視窗會出現無響應情況,并且圖像無法顯示出來。
另外我們也可使用matplotlib對圖像進行展示。
- 參考代碼
# opencv中顯示
cv.imshow('image',img)
cv.waitKey(0)
# matplotlib中展示
plt.imshow(img[:,:,::-1])
(3)儲存
- API
cv.imwrite()
參數:
- 檔案名,要儲存在哪裡
- 要儲存的圖像
- 參考代碼
cv.imwrite('messigray.png',img)
2.2 繪制幾何圖形
繪制直線
cv.line(img,start,end,color,thickness)
參數:
- img:要繪制直線的圖像
- Start,end: 直線的起點和終點
- color: 線條的顔色
- Thickness: 線條寬度
繪制圓形
cv.circle(img,centerpoint, r, color, thickness)
參數:
- img:要繪制圓形的圖像
- Centerpoint, r: 圓心和半徑
- color: 線條的顔色
- Thickness: 線條寬度,為-1時生成閉合圖案并填充顔色
繪制矩形
cv.rectangle(img,leftupper,rightdown,color,thickness)
參數:
- img:要繪制矩形的圖像
- Leftupper, rightdown: 矩形的左上角和右下角坐标
- color: 線條的顔色
- Thickness: 線條寬度
向圖像中添加文字
cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
參數:
- img: 圖像
- text:要寫入的文本資料
- station:文本的放置位置
- font:字型
- Fontsize :字型大小
效果展示
我們生成一個全黑的圖像,然後在裡面繪制圖像并添加文字
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 建立一個空白的圖像
img = np.zeros((512,512,3), np.uint8)
# 2 繪制圖形
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.circle(img,(447,63), 63, (0,0,255), -1)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
# 3 圖像展示
plt.imshow(img[:,:,::-1])
plt.title('比對結果'), plt.xticks([]), plt.yticks([])
plt.show()
結果:
2.3 擷取并修改圖像中的像素點
我們可以通過行和列的坐标值擷取該像素點的像素值。對于BGR圖像,它傳回一個藍,綠,紅值的數組。對于灰階圖像,僅傳回相應的強度值。使用相同的方法對像素值進行修改。
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
# 擷取某個像素點的值
px = img[100,100]
# 僅擷取藍色通道的強度值
blue = img[100,100,0]
# 修改某個位置的像素值
img[100,100] = [255,255,255]
2.4 擷取圖像的屬性
圖像屬性包括行數,列數和通道數,圖像資料類型,像素數等。
2.5 圖像通道的拆分與合并
有時需要在B,G,R通道圖像上單獨工作。在這種情況下,需要将BGR圖像分割為單個通道。或者在其他情況下,可能需要将這些單獨的通道合并到BGR圖像。你可以通過以下方式完成。
# 通道拆分
b,g,r = cv.split(img)
# 通道合并
img = cv.merge((b,g,r))
2.6 色彩空間的改變
OpenCV中有150多種顔色空間轉換方法。最廣泛使用的轉換方法有兩種,BGR↔Gray和BGR↔HSV。
API:
cv.cvtColor(input_image,flag)
參數:
- input_image: 進行顔色空間轉換的圖像
- flag: 轉換類型
- cv.COLOR_BGR2GRAY : BGR↔Gray
- cv.COLOR_BGR2HSV: BGR→HSV