OpenCV 入門教程:開啟計算機視覺之旅

目錄

一、引言?

二、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()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918344.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++高頻知識點(十九)

文章目錄91. TCP斷開連接的時候為什么必須4次而不是3次?92. 為什么要區分用戶態和內核態?93. 說說編寫socket套接字的步驟1. 服務器端編寫步驟1.1 創建套接字1.2 綁定套接字1.3 監聽連接1.4 接受連接1.5 數據傳輸1.6 關閉套接字2. 客戶端編寫步驟2.1 創建…

一個基于 epoll 實現的多路復用 TCP 服務器程序,相比 select 和 poll 具有更高的效率

/*5 - 使用epoll實現多路復用 */ #include <stdio.h> // 標準輸入輸出函數庫 #include <stdlib.h> // 標準庫函數&#xff0c;包含exit等 #include <string.h> // 字符串處理函數 #include <unistd.h> // Unix標準函…

元數據管理與數據治理平臺:Apache Atlas 通知和業務元數據 Notifications And Business Metadata

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。Apache Atlas 框架是一套可擴展的核心基礎治理服務&#xff0c;使企業能夠有效、高效地滿足 Hadoop 中的合規性要求&#xff0c;并支持與整個企…

rem:CSS中的相對長度單位

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

【10】C#實戰篇——C# 調用 C++ dll(C++ 導出函數、C++導出類)

文章目錄1 導出C 類函數 、導出 C函數1.1 .h文件1.2 .cpp 文件1.3 C# 調用2 C與C#數據類型對應3 保姆級教程&#xff08;項目搭建、代碼、調用&#xff0c;圖文并茂&#xff09;1 導出C 類函數 、導出 C函數 C 生成動態庫.dll 詳細教程&#xff1a; C 生成動態庫.dll 及 C調用…

Flutter 與 Android NDK 集成實戰:實現高性能原生功能

Flutter 與 NDK 集成實現 Flutter 可以通過 Platform Channels 與原生代碼&#xff08;包括使用 NDK 編寫的 C/C 代碼&#xff09;進行交互。以下是實現 Flutter 與 NDK 集成的步驟&#xff1a; 基本步驟 1. 創建 Flutter 項目 flutter create flutter_ndk_example cd flutter_…

elementui cascader 遠程加載請求使用 選擇單項等

背景&#xff1a;小程序與后端使用自定義表單渲染視圖。發現若沒有全選&#xff08;如&#xff1a;省市縣全部選擇&#xff0c;指定的市3級&#xff09;在pc端就會無法渲染出已經選擇的區縣名稱。 解決方案&#xff1a;參考官方文檔&#xff0c;設置屬性可獨立勾選element ui c…

Unity WebGL打包后啟動方法,本地方法

引言&#xff1a;常見WebGL開啟方法常需要重新打包點擊Build and Run或者將游戲放到Unity的云服務器上&#xff0c;作為開發者而言這兩個方案一個為了開啟再次打包&#xff0c;另一個直接放到了公開環境都不太合適。所以我們需要一個能在本地開啟測試的WebGL的方法。 解決方案 …

安全引導功能及ATF的啟動過程(五)

安全引導功能及ATF的啟動過程&#xff08;五&#xff09; ATF中bl32的啟動 bl31中的runtime_svc_init函數會初始化OP-TEE對應的服務&#xff0c;通過調用該服務項的初始化函數來完成OP-TEE的啟動。對于OP-TEE的服務項會通過DECLARE_RT_SVC宏在編譯時被存放到rt_svc_des段中。該…

Numpy科學計算與數據分析:Numpy入門之多平臺安裝與基礎環境配置

Numpy環境搭建與基礎操作 學習目標 本課程將指導學員在Windows、macOS和Linux三種操作系統上安裝Numpy&#xff0c;并配置開發環境&#xff0c;包括使用Jupyter Notebook和Spyder等IDE的基本操作。通過本課程的學習&#xff0c;學員將能夠獨立搭建Numpy開發環境&#xff0c;并…

內存溢出的原因有哪些,如何排查線上問題?

1. java.lang.OutOfMemoryError: ......java heap space..... 堆棧溢出&#xff0c;代碼問題的可能性極大 2. java.lang.OutOfMemoryError: GC over head limit exceeded 系統處于高頻的GC狀態&#xff0c;而且回收的效果依然 不佳的情況&#xff0c;就會開始報這個錯誤&…

Cesium 無人機視角飛行漫游,截屏

1.實現Cesium模擬無人機離屏渲染&#xff0c;無人機視角飛行漫游。視錐體顯示 具體效果如下地址&#xff1a; 【CESIUM無人機視角飛行截屏】 https://www.bilibili.com/video/BV1zQ89zGE14/?share_sourcecopy_web&vd_source8239ec37df07d6a5d56c9ece00146783

vscode 打開設置

目錄 方法 1&#xff08;快捷鍵&#xff09;&#xff1a; 方法2&#xff0c;界面操作&#xff0c;有時沒有 方法 1&#xff08;快捷鍵&#xff09;&#xff1a; 按下&#xff1a;Cmd Shift P 輸入并選擇&#xff1a;Preferences: Open Settings (JSON) 方法2&#xff0c;…

繁花深處:花店建設的時代意義與多元應用—仙盟創夢IDE

花店當第一縷晨光透過花店的玻璃窗&#xff0c;落在帶著露水的玫瑰花瓣上時&#xff0c;這個空間便不再只是商品交易的場所。花店作為城市肌理中充滿生命力的細胞&#xff0c;承載著遠比銷售鮮花更豐富的社會意義。在快節奏的現代生活中&#xff0c;一束鮮花的綻放不僅是自然之…

AtomicStampedReference解決方案

1、通過引入版本戳(stamp)機制解決ABA問題&#xff1a; 每次修改時遞增版本號執行CAS時同時檢查值和版本號即使值相同但版本不同&#xff0c;操作也會失敗2、具體代碼實現 import java.util.concurrent.atomic.AtomicStampedReference;public class AtomicStampedReferenceDemo…

版本控制的詳細說明介紹(已有github賬號版)

說明 如果已經有一個GitHub賬號,這是一個很好的起點!版本控制是一個幫助你管理代碼或其他文件變化的工具,就像給你的項目加了一個“時間機器”,可以隨時回溯歷史、協作編輯,而不會亂套。下面我將從基礎開始,層層展開說明。整個內容分為幾個部分:介紹、原理、用途、操作…

基于Github Pages搭建個人博客站點:hexo環境搭建、本地預覽與發布

步驟確認 Hexo 博客的源文件在哪里安裝 Hexo 命令行工具&#xff1a;npm install -g hexo-cli在源文件目錄中使用 hexo new "文章標題" 創建新文章編輯生成的 Markdown 文件使用 hexo generate 生成靜態文件使用 hexo deploy 部署到這個 GitHub Pages 倉庫設置Hexo博…

Shell腳本實現自動封禁惡意掃描IP

iptables 簡介我們使用iptables工具實現功能iptables 是 Linux 系統上最常用的防火墻工具&#xff0c;可以指定策略。Shell文件創建首先我們先創建文件scanners.shvim /usr/local/bin/auto_block_ip.sh我的目標是每10分鐘自動掃描&#xff0c;再10分鐘內一個IP訪問50次以上就就…

LeetCode_哈希表

哈希表&#xff08;散列表&#xff09;一、哈希表二、有效的字母異位詞1、有效的字母異位詞(力扣242)2、贖金信(力扣383)3、字母異位詞分組(力扣49)4、找到字符串中所有字母異位詞(力扣438)三、兩個數組的交集1、兩個數組的交集(力扣349)2、兩個數組的交集 II(力扣350)三、其他…

2.變量和常量

1.變量2.2 變量的基本使用2.3 變量的本質 2.4 變量命名規則與規范 2.5 變量拓展-數組 1.數組的基本使用 2.常量