目錄
一、引言?
二、OpenCV 簡介
?(一)什么是 OpenCV
(二)OpenCV 的特點與優勢
(三)OpenCV 的應用領域
三、環境搭建
(一)安裝 OpenCV 庫?
四、OpenCV 基礎操作
(一)圖像讀取與顯示?
(二)圖像保存
(三)圖像基本屬性獲取
(四)圖像顏色空間轉換
(五)圖像的基本運算
一、引言?
在當今數字化時代,計算機視覺技術廣泛應用于各個領域,從安防監控中的人臉識別,到自動駕駛汽車的環境感知,再到圖像編輯軟件的智能功能,計算機視覺正悄然改變著我們的生活。OpenCV(Open Source Computer Vision Library)作為計算機視覺領域中最受歡迎的開源庫之一,為開發者提供了豐富的函數和工具,使得處理圖像和視頻變得更加高效和便捷。?
無論你是計算機科學專業的學生,對圖像處理和計算機視覺充滿好奇的愛好者,還是希望在項目中應用計算機視覺技術的開發者,本教程都將為你提供一個全面且易于理解的 OpenCV 入門指南。通過本教程的學習,你將掌握 OpenCV 的基本概念、安裝方法,學會使用 OpenCV 進行圖像讀取、顯示、處理以及視頻操作等基礎技能,為進一步深入研究計算機視覺打下堅實的基礎。
二、OpenCV 簡介
?(一)什么是 OpenCV
OpenCV 是一個開源的計算機視覺庫,由英特爾公司于 1999 年發起并開發,旨在提供一個通用的計算機視覺解決方案,幫助開發者快速實現各種計算機視覺應用。經過多年的發展,OpenCV 已經成為一個功能強大、應用廣泛的庫,擁有超過 2500 個優化算法,涵蓋了從基本的圖像處理和計算機視覺任務到復雜的機器學習算法等多個領域。
(二)OpenCV 的特點與優勢
1.跨平臺性:OpenCV 可以在多種操作系統上運行,包括 Windows、Linux、macOS 以及移動操作系統如 Android 和 iOS。這使得開發者可以在不同的平臺上開發和部署計算機視覺應用,而無需擔心平臺兼容性問題。?
2.多語言支持:OpenCV 提供了多種編程語言的接口,包括 C++、Python、Java、MATLAB 等。這使得不同背景的開發者都可以輕松地使用 OpenCV 進行開發,無論是喜歡使用 C++ 進行高性能計算的開發者,還是偏愛 Python 簡潔語法的初學者,都能找到適合自己的開發方式。?
3.豐富的功能:OpenCV 涵蓋了計算機視覺領域的各個方面,包括圖像濾波、特征提取、目標檢測、圖像分割、立體視覺、視頻分析等。開發者可以利用這些豐富的功能,快速實現各種復雜的計算機視覺應用,而無需從頭開始編寫算法。?
4.高效性:OpenCV 的算法經過了高度優化,采用了多種優化技術,如多線程處理、SIMD 指令集等,以提高計算效率。這使得 OpenCV 在處理大規模圖像和視頻數據時,能夠保持高效運行,滿足實時性要求較高的應用場景。?
5.活躍的社區:OpenCV 擁有一個龐大且活躍的社區,社區成員來自世界各地的開發者、研究人員和愛好者。在社區中,你可以找到豐富的文檔、教程、示例代碼以及開源項目,還可以與其他開發者交流經驗、分享見解,獲取幫助和支持。
(三)OpenCV 的應用領域
1.計算機視覺與圖像處理:OpenCV 最初就是為計算機視覺和圖像處理任務而設計的,它在這個領域有著廣泛的應用。例如,圖像濾波可以去除圖像中的噪聲,提高圖像質量;圖像增強可以突出圖像中的細節,改善圖像的視覺效果;圖像分割可以將圖像中的不同物體或區域分離出來,為后續的分析和處理提供基礎。?
2.安防監控:在安防監控領域,OpenCV 被廣泛應用于人臉識別、行為分析、目標跟蹤等方面。通過攝像頭采集視頻數據,利用 OpenCV 的算法對視頻中的圖像進行處理和分析,可以實現實時的安防監控,及時發現異常情況并發出警報。?
3.自動駕駛:自動駕駛汽車需要對周圍環境進行實時感知和理解,OpenCV 在其中發揮著重要作用。通過攝像頭采集道路圖像,利用 OpenCV 的目標檢測算法可以識別出車輛、行人、交通標志和信號燈等目標物體,為自動駕駛汽車的決策和控制提供依據。?
4.醫療影像分析:在醫療領域,OpenCV 可以用于醫療影像的處理和分析,如 X 光、CT、MRI 等影像的處理。通過圖像增強、分割和特征提取等技術,可以幫助醫生更準確地診斷疾病,提高醫療診斷的準確性和效率。?
5.工業檢測:在工業生產中,OpenCV 可以用于產品質量檢測、缺陷識別、尺寸測量等方面。通過對工業生產線上采集的圖像進行分析,可以實現自動化的質量檢測,提高生產效率和產品質量。?
6.智能機器人:智能機器人需要具備視覺感知能力,以便與周圍環境進行交互。OpenCV 可以為智能機器人提供圖像識別、目標定位、路徑規劃等功能,幫助機器人更好地完成任務。
三、環境搭建
(一)安裝 OpenCV 庫?
安裝好 Python 后,我們可以使用 pip 工具來安裝 OpenCV 庫。pip 是 Python 的包管理工具,它可以幫助我們方便地安裝、升級和管理 Python 庫。打開命令行終端,輸入以下命令安裝 OpenCV 庫:
pip install opencv - python
如果你需要安裝 OpenCV 的擴展模塊(如 contrib 模塊),可以使用以下命令:
pip install opencv - python - headless opencv - contrib - python - headless
在安裝過程中,pip 會自動下載并安裝 OpenCV 庫及其依賴項。安裝完成后,你可以在 Python 代碼中通過import cv2語句來導入 OpenCV 庫,如果沒有報錯,則說明安裝成功。
四、OpenCV 基礎操作
(一)圖像讀取與顯示?
1.讀取圖像:在 OpenCV 中,使用cv2.imread()函數來讀取圖像。該函數的第一個參數是圖像文件的路徑,第二個參數是讀取圖像的方式,常用的讀取方式有以下幾種:?
cv2.IMREAD_COLOR:以彩色模式讀取圖像,這是默認的讀取方式。在這種模式下,圖像的顏色通道順序為 BGR(Blue, Green, Red)。?
cv2.IMREAD_GRAYSCALE:以灰度模式讀取圖像,圖像將被轉換為單通道的灰度圖像。?
cv2.IMREAD_UNCHANGED:讀取圖像時保留圖像的原始格式,包括 alpha 通道(如果有的話)。?以下是讀取彩色圖像和灰度圖像的示例代碼:
import cv2# 讀取彩色圖像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:print('無法讀取圖像')
else:print('彩色圖像尺寸:', img_color.shape)# 讀取灰度圖像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:print('無法讀取圖像')
else:print('灰度圖像尺寸:', img_gray.shape)
在上述代碼中,首先使用cv2.imread()函數讀取圖像,然后通過判斷返回值是否為None來檢查圖像是否讀取成功。如果圖像讀取成功,可以通過img.shape屬性獲取圖像的尺寸,該屬性返回一個元組,包含圖像的高度、寬度和通道數(對于灰度圖像,通道數為 1;對于彩色圖像,通道數為 3)。
2. 顯示圖像:使用cv2.imshow()函數來顯示圖像。該函數的第一個參數是窗口的名稱,第二個參數是要顯示的圖像。在顯示圖像后,需要使用cv2.waitKey()函數等待用戶按鍵,否則圖像窗口會一閃而過。cv2.waitKey()函數的參數是等待的時間(單位為毫秒),如果參數為 0,則表示無限等待,直到用戶按下任意鍵。最后,使用cv2.destroyAllWindows()函數關閉所有打開的圖像窗口。?
以下是顯示彩色圖像和灰度圖像的示例代碼:
import cv2# 讀取彩色圖像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:print('無法讀取圖像')
else:cv2.imshow('彩色圖像', img_color)cv2.waitKey(0)cv2.destroyAllWindows()# 讀取灰度圖像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:print('無法讀取圖像')
else:cv2.imshow('灰度圖像', img_gray)cv2.waitKey(0)cv2.destroyAllWindows()
在上述代碼中,分別讀取彩色圖像和灰度圖像,并使用cv2.imshow()函數在不同的窗口中顯示圖像,通過cv2.waitKey(0)函數等待用戶按鍵,最后使用cv2.destroyAllWindows()函數關閉所有窗口。
(二)圖像保存
使用cv2.imwrite()函數可以將處理后的圖像保存到磁盤上。該函數的第一個參數是保存圖像的文件名,第二個參數是要保存的圖像。文件名的擴展名決定了保存圖像的格式,OpenCV 支持多種圖像格式,如 JPEG、PNG、BMP 等。?
以下是將彩色圖像轉換為灰度圖像并保存的示例代碼:
import cv2# 讀取彩色圖像
img_color = cv2.imread('image.jpg', cv2.IMREAD_COLOR)
if img_color is None:print('無法讀取圖像')
else:# 轉換為灰度圖像img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)# 保存灰度圖像cv2.imwrite('image_gray.jpg', img_gray)print('灰度圖像已保存')
在上述代碼中,首先讀取彩色圖像,然后使用cv2.cvtColor()函數將彩色圖像轉換為灰度圖像(關于cv2.cvtColor()函數將在后續介紹),最后使用cv2.imwrite()函數將灰度圖像保存為image_gray.jpg文件。
(三)圖像基本屬性獲取
通過圖像的shape屬性可以獲取圖像的高度、寬度和通道數等基本屬性。對于彩色圖像,shape屬性返回一個包含三個元素的元組,分別表示圖像的高度、寬度和通道數(BGR 通道數為 3);對于灰度圖像,shape屬性返回一個包含兩個元素的元組,分別表示圖像的高度和寬度(通道數為 1)。?
此外,還可以通過圖像的dtype屬性獲取圖像的數據類型,OpenCV 中圖像的數據類型通常為numpy.uint8,表示無符號 8 位整數,其取值范圍為 0 - 255。?
以下是獲取圖像基本屬性的示例代碼:
import cv2# 讀取彩色圖像
img_color = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_color is None:print('無法讀取圖像')
else:height, width, channels = img_color.shapeprint('彩色圖像高度:', height)print('彩色圖像寬度:', width)print('彩色圖像通道數:', channels)print('彩色圖像數據類型:', img_color.dtype)# 讀取灰度圖像
img_gray = cv2.imread('Dog.png', cv2.IMREAD_GRAYSCALE)
if img_gray is None:print('無法讀取圖像')
else:height, width = img_gray.shapeprint('灰度圖像高度:', height)print('灰度圖像寬度:', width)print('灰度圖像數據類型:', img_gray.dtype)
在上述代碼中,分別讀取彩色圖像和灰度圖像,并通過shape屬性和dtype屬性獲取圖像的基本屬性并打印輸出。
(四)圖像顏色空間轉換
在 OpenCV 中,圖像的顏色空間通常有 BGR、RGB、HSV、HLS、Lab 等。默認情況下,cv2.imread()函數讀取的圖像是 BGR 顏色空間。在某些情況下,我們需要將圖像從一種顏色空間轉換為另一種顏色空間,例如將 BGR 圖像轉換為灰度圖像、將 BGR 圖像轉換為 HSV 圖像等。?
使用cv2.cvtColor()函數可以實現圖像顏色空間的轉換。該函數的第一個參數是要轉換的圖像,第二個參數是轉換的代碼,用于指定源顏色空間和目標顏色空間。常用的顏色空間轉換代碼如下:?
cv2.COLOR_BGR2GRAY:將 BGR 圖像轉換為灰度圖像。?
cv2.COLOR_BGR2RGB:將 BGR 圖像轉換為 RGB 圖像。?
cv2.COLOR_BGR2HSV:將 BGR 圖像轉換為 HSV 圖像。?
cv2.COLOR_BGR2HLS:將 BGR 圖像轉換為 HLS 圖像。?
cv2.COLOR_BGR2Lab:將 BGR 圖像轉換為 Lab 圖像。?
以下是將 BGR 圖像轉換為灰度圖像、RGB 圖像和 HSV 圖像的示例代碼:
import cv2# 讀取BGR圖像
img_bgr = cv2.imread('Dog.png', cv2.IMREAD_COLOR)
if img_bgr is None:print('無法讀取圖像')
else:# 轉換為灰度圖像img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)cv2.imshow('灰度圖像', img_gray)# 轉換為RGB圖像img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)cv2.imshow('RGB圖像', img_rgb)# 轉換為HSV圖像img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)cv2.imshow('HSV圖像', img_hsv)cv2.waitKey(0)cv2.destroyAllWindows()
在上述代碼中,首先讀取 BGR 圖像,然后使用cv2.cvtColor()函數分別將 BGR 圖像轉換為灰度圖像、RGB 圖像和 HSV 圖像,并使用cv2.imshow()函數顯示轉換后的圖像。
(五)圖像的基本運算
1.圖像加法:在 OpenCV 中,可以使用cv2.add()函數對兩幅圖像進行加法運算。圖像加法通常用于圖像融合、圖像增強等場景。需要注意的是,參與加法運算的兩幅圖像必須具有相同的尺寸和數據類型。?
以下是圖像加法的示例代碼:
import cv2
import numpy as np# 讀取兩幅圖像
img1 = cv2.imread('image1.jpg', cv2.IMREAD_COLOR)
img2 = cv2.imread('image2.jpg', cv2.IMREAD_COLOR)if img1 is None or img2 is None:print('無法讀取圖像')
else:# 確保兩幅圖像尺寸相同if img1.shape == img2.shape:# 圖像加法img_add = cv2.add(img1, img2)cv2.imshow('圖像加法結果', img_add)cv2.waitKey(0)cv2.destroyAllWindows()else:print('兩幅圖像尺寸不同,無法進行加法運算')
(六)視頻讀寫
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))while cap.isOpened():ret, frame = cap.read()if not ret:breakout.write(frame)cv2.imshow('frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
out.release()
cv2.destroyAllWindows()