在計算機視覺領域,OpenCV 無疑是最受歡迎的開源庫之一。它由 Intel 公司俄羅斯團隊發起,如今已成為處理圖像和視頻的強大工具。本文我會介紹OpenCV 的基礎知識,從圖像的讀寫顯示到實時視頻流處理,邁出計算機視覺的第一步。
目錄
OpenCV 為何值得學習?
圖像的基本操作
讀取、顯示與保存圖像
圖像的像素操作
繪制幾何圖形
實時視頻流處理
總結
OpenCV 為何值得學習?
OpenCV 之所以被廣泛應用,得益于其三大優勢:
首先是多語言支持,雖然基于 C++ 實現,但提供了 Python、Ruby、Matlab 等多種語言接口,其中 OpenCV-Python 結合了 C++ 的高性能和 Python 的簡潔易讀性。
其次是跨平臺特性,可在 Windows、Linux、OS X、Android 和 iOS 等系統上運行,甚至支持基于 CUDA 和 OpenCL 的 GPU 加速。
最后是豐富的 API,涵蓋了傳統計算機視覺算法、主流機器學習算法,還添加了對深度學習的支持,滿足各種視覺處理需求。
對于 Python 開發者來說,安裝 OpenCV 非常簡單,使用國內鏡像源可快速完成:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
圖像的基本操作
讀取、顯示與保存圖像
處理圖像的第一步是掌握基本的 IO 操作。OpenCV 提供了簡潔的接口完成這些任務:
import cv2
import numpy as np# 讀取圖像(默認彩色模式)
img = cv2.imread('image.jpg')# 顯示圖像
cv2.imshow("Image Window", img)
# 等待用戶按鍵(0表示無限等待)
cv2.waitKey(0)
# 關閉所有窗口
cv2.destroyAllWindows()# 保存圖像
cv2.imwrite("saved_image.jpg", img)
需要注意的是,cv2.waitKey()
是顯示圖像不可或缺的部分,它給圖像繪制留下時間,API里面填寫的為多少毫秒,否則窗口可能無響應。
圖像的像素操作
在計算機中,圖像由像素組成。彩色圖像通常由 RGB(紅、綠、藍)三個通道構成,每個通道的像素值范圍是 0-255。在OpenCV中使用的BGR通道,我們可以直接操作像素值:
# 獲取某個像素點的值(BGR格式,注意與RGB順序不同)
px = img[100, 100]
print(px) # 輸出 [B, G, R] 值# 修改像素值(設置為紅色)
img[100, 100] = [0, 0, 255]
繪制幾何圖形
OpenCV 提供了繪制各種幾何圖形的函數,方便我們在圖像上添加標記:
# 繪制直線(起點、終點、藍色、線寬2)
cv2.line(img, (100, 100), (200, 200), (255, 0, 0), 2)# 繪制圓形(圓心、半徑50、黃顏色、線寬2)
cv2.circle(img, (300, 300), 50, (0, 255, 255), 2)# 繪制矩形(左上角、右下角、藍色、線寬2)
cv2.rectangle(img, (100, 200), (300, 300), (255, 0, 0), 2)# 添加文字(內容、位置、字體、大小、青藍色、線寬4、抗鋸齒)
cv2.putText(img, 'Hello OpenCV', (100, 200), cv2.FONT_ITALIC, 1, (255, 255, 0), 4, cv2.LINE_AA)
注意:在OpenCV中添加文字無法使用中文字符,會顯示亂碼,所以實際中常使用三大庫中的matplotlib來實現添加中文字符。
?
實時視頻流處理
除了靜態圖像,OpenCV 還能輕松處理實時視頻流。通過電腦攝像頭捕獲視頻的代碼如下:
import cv2# 創建VideoCapture對象,參數0表示使用默認攝像頭
cap = cv2.VideoCapture(0)while True:# 讀取一幀視頻(ret為是否成功讀取的標志,frame為幀數據)ret, frame = cap.read()# 如果讀取失敗則退出循環if not ret:break# 在這里可以添加對幀的處理(如灰度化、繪制圖形等)# 示例:轉為灰度圖gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 顯示處理后的幀cv2.imshow('Camera Feed', gray_frame)# 按'q'鍵退出循環if cv2.waitKey(1) & 0xFF == ord('q'):break# 釋放攝像頭資源并關閉所有窗口
cap.release()
cv2.destroyAllWindows()
這段代碼的核心是VideoCapture
類,它負責從攝像頭獲取視頻流。通過循環不斷讀取幀并處理,實現實時視頻處理的效果。參數為0表示使用默認攝像頭,也可以傳入視頻所在地址。
waitKey(1)
確保每幀之間有 1 毫秒的延遲,既保證視頻流暢,又能檢測按鍵輸入。
總結
本文我介紹了 OpenCV 的基本操作,包括圖像的讀寫顯示、像素操作、幾何圖形繪制以及實時視頻流處理。這些基礎操作是進行更復雜計算機視覺任務的基石,例如目標檢測、圖像分割等。
OpenCV 的強大之處在于它將復雜的視覺算法封裝成簡單易用的接口,讓開發者可以專注于業務邏輯而非底層實現。