初識 OpenCV

初識 OpenCV

簡介

OpenCV(Open Source Computer Vision Library)是一個涵蓋了數百種計算機視覺算法的開源算法庫。

OpenCV 具有模塊化結構,這意味著該軟件包包含多個共享或靜態庫。其中包含以下模塊:

  1. Core functionality (core):一個定義基本數據結構的基礎模塊,包括密集多維數組 Mat 和所有其他模塊使用的基本函數。

  2. Image Processing (imgproc):圖像處理模塊,包括線性和非線性圖像過濾、幾何圖像變換(調整大小、仿射和透視變形、基于通用表的重新映射)、色彩空間轉換、直方圖等。

  3. Video Analysis (video):視頻分析模塊,包括運動估計、背景扣除和對象跟蹤算法。

  4. Camera Calibration and 3D Reconstruction (calib3d):基本的多視圖幾何算法、單相機和立體相機校準、物體姿態估計、立體對應算法和 3D 重建元素。

  5. 2D Features Framework (features2d):顯著特征檢測器、描述符和描述符匹配器。

  6. Object Detection (objdetect):檢測預定義類的對象和實例(例如,面部、眼睛、杯子、人、汽車等)。

  7. High-level GUI (highgui):易于使用的界面和簡單的 UI 功能。

  8. Video I/O (videoio): 易于使用的視頻捕獲和視頻編解碼器接口。

  9. … 其他一些幫助模塊,例如 FLANN 和 Google 測試包裝器、Python 綁定等。

OpenCV 早期的 API 是使用 C 語言編寫的,然而基于 C 語言的 API 目前已經廢棄。目前 OpenCV API 已經是 C++ 編寫的,因此你可以十分高效的在 C++ 項目中使用 OpenCV。除此之外,OpenCV 官方還提供了其它語言的 API 調用支持,例如 Java、Python 以及 Matlab。當然,你還可以選擇其它的編程語言,例如 JavaScript、Rust 等,這些語言的社區也提供了方案來使用 OpenCV。

在本篇文章中,我們將主要使用 Python 語言來介紹 OpenCV 的一些基礎功能。

下載安裝

在對 OpenCV 有一個基礎的了解之后,我們可以開始嘗試在本地中配置 OpenCV 環境來進行一些簡單的功能測試。

基礎環境

  • Windows 11 22H2

  • Visual C++ Redistributable for Visual Studio 2015

  • Python 3.7.0

首先我們在用戶目錄創建一個文件夾,這里我們將其命名為 OpenCV_Test。隨后我們進入該目錄。

mkdir ~/OpenCV_Test && cd OpenCV_Test

我們需要創建一個 Python 的虛擬環境。

python -m venv .venv

創建完成之后我們直接激活虛擬環境。

.venv/scripts/activate

(可選)確保虛擬環境 pip 版本大于 19.3。

python -m pip install --upgrade pip

在虛擬環境下載 opencv-contrib-python==4.8.1.78(contrib 為包含了額外模塊的版本)。

pip install opencv-contrib-python==4.8.1.78

至此,我們已經完成了 OpenCV 的環境配置,現在可以在項目根目錄下創建一個 opencv_test.py 文件,并追加以下內容。

import cv2 as cvprint(cv.__version__)

在終端通過 python opencv_test.py 進行測試,如果終端成功輸出版本號則代表安裝成功。

由于在之后的內容中,我們需要使用到一些測試數據,因此我們需要將 OpenCV 倉庫的 samples 拷貝到我們的項目根目錄下。

你可以通過 Github 瀏覽這些數據 - https://github.com/opencv/opencv/tree/4.x/samples/data

然后直接下載壓縮包,并將 samples 拷貝至項目根目錄下。https://github.com/opencv/opencv/archive/refs/heads/4.x.zip

圖像功能測試

該部分主要涉及到圖像的讀取,展示以及寫入 API。

import cv2 as cv
import sys, os# 添加當前目錄下的samples/data作為數據搜索路徑
cv.samples.addSamplesDataSearchPath(os.path.join(os.getcwd(), "samples", "data"))
# 讀取樣例數據中的圖片
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
if img is None:sys.exit("Could not read the image.")
# 展示圖片
cv.imshow("Display window", img)
k = cv.waitKey(0)
# 當按下 s 時,寫入一張新的圖片至當前目錄
if k == ord("s"):cv.imwrite("starry_night1.png", img) 

視頻功能測試

從攝像頭捕獲視頻

在該項任務中,我們通過攝像頭捕獲視頻幀,并將其轉為灰度幀展示出來。

import cv2 as cv# 視頻捕獲對象,用于調用系統攝像頭(測試環境為筆記本攝像頭)
cap = cv.VideoCapture(0)
if not cap.isOpened():print("Cannot open camera")exit()
while True:# 逐幀進行視頻捕獲ret, frame = cap.read()# 如果幀被捕獲,ret 為 trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# 將捕獲的幀轉為灰度gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 顯示當前灰度幀cv.imshow('frame', gray)# 當按下 q 鍵時,結束捕獲if cv.waitKey(1) == ord('q'):break
# 釋放捕獲對象
cap.release()
# 銷毀所有窗口
cv.destroyAllWindows()

從文件播放視頻

在該項任務中,我們通過已有文件讀取視頻幀信息,并展示其灰度幀。

import cv2 as cv
import os# 添加樣例資源搜索路徑
cv.samples.addSamplesDataSearchPath(os.path.join(os.getcwd(), "samples", "data"))
# 讀取樣例視頻文件
cap = cv.VideoCapture(cv.samples.findFile('vtest.avi'))while cap.isOpened():# 逐幀讀取視頻ret, frame = cap.read()# 當幀讀取成功,ret 為 trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# 獲取灰度幀gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 展示灰度幀cv.imshow('frame', gray)# 當按下 q 鍵時中斷播放if cv.waitKey(1) == ord('q'):break
# 釋放捕獲對象以及窗口資源
cap.release()
cv.destroyAllWindows()

錄制視頻的保存

在該項任務中,我們將使用攝像頭捕獲視頻幀,并將每幀都垂直翻轉,然后將其保存為新的視頻文件。

import cv2 as cv# 視頻捕獲窗口
cap = cv.VideoCapture(0)
# 定義編碼器與視頻寫入對象
fourcc = cv.VideoWriter_fourcc(*'XVID')
# 輸出名稱,編碼器,幀速率,幀尺寸
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():# 逐幀讀取攝像頭信息ret, frame = cap.read()# 正常讀取 ret 為 trueif not ret:print("Can't receive frame (stream end?). Exiting ...")break# 垂直翻轉視頻幀frame = cv.flip(frame, 0)# 寫入翻轉后的幀至輸出文件out.write(frame)# 展示翻轉后的幀信息cv.imshow('frame', frame)if cv.waitKey(1) == ord('q'):break
# 釋放全部資源
cap.release()
out.release()
cv.destroyAllWindows()

圖形的繪制

在該項任務中,我們將通過 OpenCV 繪制不同的幾何圖形。

直線
import numpy as np
import cv2 as cv# 創建一個黑色背景
img = np.zeros((512, 512, 3), np.uint8)
# 在 img 繪制一條粗細為 5 px 的藍色對角線
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)cv.imshow("img", img)
cv.waitKeyEx(0)
矩形
# 在 img 繪制一條左上到右下坐標的藍色矩形
cv.rectangle(img, (384,0), (510,128), (0,255,0), 3)
# 在 img 繪制一個基于圓心加半徑的圓
cv.circle(img,(447,63), 63, (0,0,255), -1)
橢圓
# 參數分別為圖片、中心點,主副軸長度,橢圓逆時針旋轉角度,橢圓弧的起始角度,橢圓弧的結束角度,畫筆顏色等
cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)
多邊形
# 要繪制多邊形,首先需要頂點坐標。將這些點放入形狀為 ROWSx1x2 的數組中,其中 ROWS 是頂點數,其類型應為 int32
pts = np.array([[100, 100], [100, 200], [200, 200], [200, 100]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (0, 255, 255))

如果第三個參數為 False,您將得到連接所有點的折線,而不是閉合形狀。

文字
# 參數分別為圖片,文字,坐標,字體,字體縮放,顏色,粗細,線型
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)

結語

在結束這篇介紹 OpenCV 的文章之際,我們希望你已經對這一強大的計算機視覺庫有了初步的了解。通過下載和安裝 OpenCV,你已經邁出了探索計算機視覺世界的第一步。

在文章中,我們探討了 OpenCV 的基礎部分,包括圖像處理、視頻處理和圖形繪制等方面的核心 API。這些功能為開發者提供了豐富的工具箱,可以用于解決各種計算機視覺問題,從簡單的圖像處理到復雜的目標檢測和跟蹤。

然而,OpenCV 是一個龐大而靈活的庫,我們只觸及了其中的冰山一角。我們鼓勵你繼續深入學習,探索 OpenCV 更高級的功能和技術。無論是在工業自動化、醫學影像、安防監控還是虛擬現實等領域,OpenCV 都發揮著至關重要的作用。

作為一個開源項目,OpenCV 的社區一直在不斷發展和改進。在進一步的學習之后,你也可以通過參與社區,貢獻你的力量,使這個強大的工具變得更加完善。(提出有效 issues 以及文檔的勘誤也是一份貢獻!)

在這個計算機視覺的精彩世界中,OpenCV 為你打開了大門。希望你能夠在這個旅程中找到樂趣,創造出令人驚嘆的視覺應用。

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

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

相關文章

機器學習硬件十年:性能變遷與趨勢

本文分析了機器學習硬件性能的最新趨勢,重點關注不同GPU和加速器的計算性能、內存、互連帶寬、性價比和能效等指標。這篇分析旨在提供關于ML硬件能力及其瓶頸的全面視圖。本文作者來自調研機構Epoch,致力于研究AI發展軌跡與治理的關鍵問題和趨勢。 &…

【送書活動四期】被GitHub 要求強制開啟 2FA 雙重身份驗證,我該怎么辦?

記得是因為fork了OpenZeppelin/openzeppelin-contracts的項目,之后就被GitHub 要求強制開啟 2FA 雙重身份驗證了,一拖再拖,再過幾天帳戶操作將受到限制了,只能去搞一下了 目錄 2FA是什么為什么要開啟 2FA 驗證GitHub 欲在整個平臺…

消息隊列 - RabbitMQ

消息隊列 - RabbitMQ 1. 初識 MQ1.1 同步調用1.2 異步調用1.3.技術選型 2. RabbitMQ2.1 安裝2.2 收發信息2.2.1 交換機(Exchange)2.2.2 隊列2.2.3 綁定關系2.2.4 發送消息 2.3 數據隔離 1. 初識 MQ 微服務一旦拆分,必然涉及到服務之間的相互調用,之前講…

MySQL六 | 存儲引擎

目錄 存儲引擎 存儲引擎特點 存儲引擎選擇 Innodb與MyISAM區別 存儲引擎 默認存儲引擎:InnoDB show engines;#展示當前數據庫支持的存儲引擎 存儲引擎特點 特點InnoDBMyISAMMemory存儲限制64TB有有事務安全支持--鎖機制行鎖表鎖表鎖Btree鎖支持支持 支持 Hash索引--支…

編譯 Android gradle-4.6-all.zip 報錯問題記錄

編譯 Android gradle-4.6-all.zip 報錯問題記錄 方法一:替換資源:方法二:修改源方法三:修改版本 編譯時候無法下載 gradle-4.6-all Downloading https://services.gradle.org/distributions/gradle-4.6-all.zip 方法一&#xf…

《一念關山》熱度破萬,愛奇藝古裝賽道出盡風頭

?劉詩詩重回古裝劇、新式武俠公路片、質感細膩的鏡頭美學......看點滿滿的《一念關山》頻頻登上熱搜,俘獲了大批觀眾的心。 開播首日熱度就刷新了愛奇藝2023年站內紀錄,《一念關山》作為2023年愛奇藝在古裝賽道的收官之作,口碑和熱度兼收。…

Linux內核-標準IO和系統IO的區別

概念 標準IO:指的是C語言實現的文件操作的函數 系統IO(文件IO):指的是linux或windows或unix,實現文件操作的函數。 為什么要有兩種IO C語言要實現跨平臺,所以C語言在不同操作系統中實現文件操作方式是不一…

一文詳解Java反射

文章目錄 反射是什么?反射的作用所有方法匯總一、加載Class對象二、加載類的構造器對象三、加載類的成員變量四、加載類的成員方法 反射是什么? 反射就是:加載類,并允許以編程的方式解剖類中的某個成分(成員變量&#…

實戰:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服務協同部署(包含解決瀏覽器訪問Linux部署服務器本地資源問題)

1. 背景 在該實戰中,我們將探討如何使用Docker Compose協同部署Nginx、Java、Mysql和Redis服務,實現一個視頻上傳與展示的應用。具體需求如下: Java應用負責上傳視頻和圖片資源到Nginx目錄下,作為資源服務器。Nginx服務作為靜態…

Numpy數組常用屬性匯總(第5講)

Numpy數組常用屬性匯總 (第5講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ????????????????????????????????????????????????????????????????????????????????????…

【JavaEE進階】 Spring使用注解存儲對象

文章目錄 🌴序言🍀前置?作:配置掃描路徑🎄添加注解存儲 Bean 對象🌳類注解🚩為什么要這么多類注解🚩注解之間的聯系 🎋?法注解 Bean🚩?法注解需要配合類注解使? ?總…

探索AIGC未來:CPU源碼優化、多GPU編程與中國算力瓶頸與發展

★人工智能;大數據技術;AIGC;Turbo;DALLE 3;多模態大模型;MLLM;LLM;Agent;Llama2;國產GPU芯片;GPU;CPU;高性能計算機;邊緣計算;大模型顯存占用;5G…

如何夸張孩子

你剛才很努力啊!——表揚努力盡管艱難,但你一直沒有放棄——表揚耐心和堅持你做事情的態度非常不錯——表揚態度你在_____上進步了很多!——表揚細節這個方法真有新意!——表揚創意你和小伙伴合作得真棒!——表揚合作精…

中國特供閹割版 RTX 4090 曝光,老黃這操作絕了

到了現在大伙兒應該發現:國內禁售 NVIDIA RTX 4090 顯卡這事兒基本實錘了。 實際上根據老美規定,從上個月 17 號開始,凡是公司主體在中國的顯卡品牌,就已經不能生產和銷售 RTX 4090。 以后廠商想要賣 4090 只能以整機形式出售&am…

藝術畫廊展廳網站制作的效果如何

藝術展廳往往有很多人前往,在主要城市有不少畫廊,對經營者來說,不同于銷售行業,其更多的是打造品牌吸引用戶前來或合作等形式,而由于行業特殊性,需要準屬性用戶才會前往。 因此在品牌打造及信息承載宣傳方…

防止企業敏感數據泄露

敏感數據泄露是指意外或故意泄露關鍵信息,例如個人身份信息(PII)、支付卡信息(PCI)、受保護的電子健康信息(ePHI)和知識產權(IP),數據保護措施不足的組織會在…

10-Hadoop組件開發技術

單選題 題目1:下列選項描述錯誤的是? 選項: A Hadoop HA即集群中包含Secondary NameNode作為備份節點存在。 B ResourceManager負責的是整個Yarn集群資源的監控、分配和管理工作 C NodeManager負責定時的向ResourceManager匯報所在節點的資源使用情況…

Spark---DataFrame存儲、Spark UDF函數、UDAF函數

四、DataFrame存儲Spark UDF函數 1、儲存DataFrame 1)、將DataFrame存儲為parquet文件 2)、將DataFrame存儲到JDBC數據庫 3)、將DataFrame存儲到Hive表 2、UDF:用戶自定義函數 可以自定義類實現UDFX接口 java: …

案例062:基于微信小程序的健身房私教預約系統

文末獲取源碼 開發語言:Java 框架:SSM JDK版本:JDK1.8 數據庫:mysql 5.7 開發軟件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序開發軟件:HBuilder X 小程序…

模塊式雨水調蓄池施工簡單,無需大型機械,可實現當天開挖當天回填

模塊式雨水調蓄池的施工過程非常簡單,無需大型機械和繁瑣的施工工藝。在施工過程中,只需要進行簡單的開挖和回填即可,而且可以在當天完成。這種施工方式不僅節省了施工時間和成本,還可以避免因大型機械和繁瑣工藝引起的安全隱患。…