opencv-python基礎

一.opencv-python簡述

其使用Numpy,所有OpenCV數組結構都轉換為Numpy數組,是一個高度優化的數據庫操作庫。

二.環境安裝

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

三.基本概念

- 像素是圖像的基本單元,每個像素存儲著圖像的顏色、亮度和其他特征。

- 數字圖像利用0/1編碼記錄信息,opencv中常用的是8位圖像,大多數彩色和灰度圖像使用8位(uint8)表示每個通道的像素值,范圍從0到255,其中?0?最黑,1(255)?最白。

- 幾乎所有顏色都可以通過RGB三原色按照不同比例調配而成。

四.圖像存儲

- 彩色圖像:三維數組

- 灰度圖像:二維數組(矩陣)

- 在OpenCV中,默認情況下,彩色圖像是以BGR藍-綠-紅)順序存儲

- 形狀(Shape):

圖像的尺寸由其高(h)、寬(w)和通道數(c)決定。可以通過 img.shape 屬性獲取(h,w,c)。

? - 彩色圖像,返回一個包含三個值的元組 (height, width, channels)。

? - 灰度圖像,返回一個包含兩個值的元組 (height, width),因為其只有一個通道。

- 數據類型(dtype):圖像中的每個像素值的數據類型決定了可以存儲的最大值。例如,8位無符號整數(uint8)允許的范圍是從0到255。

? - 單通道(灰度圖像):每個像素由一個數值表示,代表該點的亮度。值越低越暗,值越高越亮。

五.圖像基本操作

5.1 創建窗體(窗口)

cv2.namedWindow(winname ?[,窗口屬性])

參數:

- winname:窗口名

- 窗口屬性:窗口大小是否可調整

? ? - cv2.WINDOW_AUTOSIZE :默認,窗口會根據加載的圖像自動調整到合適的大小,并且用戶不能拖動窗口邊緣來調整窗口大小。

? ? - cv2.WINDOW_NORMAL :窗口大小是可調整的,用戶可以通過鼠標拖動窗口邊緣來自由改變窗口大小。

import cv2 as cv
import numpy as np# 創建窗體
cv.namedWindow("win1",cv.WINDOW_AUTOSIZE)
cv.imshow("win2",cv.WINDOW_NORMAL)

運行后會出現兩塊窗口,暫時不管。

5.2 讀取圖像

cv2.imread(path ?[,讀取方式])

? 參數:

? - filename:圖像路徑

? - 讀取方式:彩色·默認、灰色等

# 讀取方式為灰色
img = cv.imread("../images/cat1.png", cv.IMREAD_GRAYSCALE)

繼續往下

5.3 圖像顯示

cv2.imshow(winname,img)

參數:

- winname:顯示圖像的窗口名,以字符串類型表示

- img:要顯示的圖像

cv.imshow("win1",img)
cv.imshow("win2",img)# cv.waitKey(n):n>0,意味著程序將等待n毫秒。
cv.waitKey(0)# cv2.destroyAllWindows(winname):會在當前程序執行到該語句時立即銷毀打開的窗口,并釋放與這些窗口相關的資源。
# 默認關閉所有
cv.destroyAllWindows()

5.4 保存圖像

cv2.imwrite(path,img)

參數:

- path:圖片保存的路徑和圖片名

- img:要保存的圖像

cv.imwrite('output.jpg', img)

5.5 創建黑色圖像

使用 np.zeros() 創建全黑圖像,再修改像素值(255)成為全白圖像。

numpy.zeros((height,width,channels),dtype=np. uint8)

import cv2 as cv
import numpy as npw = 480
h = 640# c = 1 的時候就是灰度圖像,單通道,但是為二維圖像
c = 3b = np.zeros((h,w,c),dtype=np.uint8)
cv.imshow("black",b)cv.waitKey(0)
cv.destroyAllWindows()

# 更改為白色圖像
# 利用數組切片更改值
b[:,:,:] = 255cv.imshow('white',b)
cv.waitKey(0)
cv.destroyAllWindows()

# 隨機像素值圖像b[:,:,:] = np.random.randint(0,256,(h,w,c))cv.imshow('random',b)
cv.waitKey(0)
cv.destroyAllWindows()

5.6 圖像裁剪(切片)

img[y:y+h,x:x+w]

提取的是從 (x,y) 開始,高度為 h,寬度為 w 的矩形區域

import cv2 as cv
import numpy as npf = cv.imread('../images/cat1.png')y = 200
x = 200
h = 400
w = 400s = f[y:y+h,x:x+w]
cv.imshow('s',s)
cv.waitKey(0)
cv.destroyAllWindows()

5.7 調整大小

cv2.resize(img,dsize,dts)

- img:輸入圖像,通常是二維或三位NumPy數組。

- dsize:輸出圖像的尺寸,是一個二元組 (w,h)

- dst:縮放后的圖像

import cv2 as cv
import numpy as np
f = cv.imread('../images/cat1.png')s = cv.resize(f, (100,100))
cv.imshow('s', s)
cv.waitKey(0)
cv.destroyAllWindows()

六.圖像繪制

6.1 直線

cv2.line(img,start,end,color,thickness)

參數:

? - img:要繪制直線的圖像

? - startend:直線的起點和終點,都是兩個元組(坐標)

? - color:直線的顏色,對于彩色圖像,使用 BGR 格式(b,g,r)指定顏色

? - thickness:線條粗細,值越大越寬

? - 隱藏參數,cv2.LINE_AA ,表示使用抗鋸齒算法繪制圖像,這在每個繪制函數中都隱式存在,默認為 cv2.LINE_8

import cv2 as cvimg = cv.imread('../images/cat1.png')# 畫一條直線,起點終點分別指定,同時為藍色
cv.line(img,(100,100),(200,200),(255,0,0),3)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()

6.2 圓形

cv2.circle(img,centerpoint,r,color,thickness)

參數:

? - img:要繪制圓形的圖片

? - centerpointr:圓心和半徑

? - color:線條顏色

? - tnickness:線條寬度,為-1時生成閉合圖案并填充顏色

import cv2 as cvimg = cv.imread('../images/cat1.png')cv.circle(img, (100, 100), 50, (255, 0, 0), -1)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.3 繪制矩形

cv2.rectangle(img,leftupper,rightdown,color,thickness)

參數:

? - img:要繪制矩形的圖像

? - leftupperrightdown:矩形的左上角和右下角坐標

? - color:線條的顏色

? - thickness:線條的寬度

import cv2 as cvimg = cv.imread('../images/cat1.png')cv.rectangle(img, (100, 100), (300, 300), (0, 255, 0), 2)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.4 繪制文本(向圖片中添加文字)

cv2.putText(img,text,station,font,Fontscale,color,thickness,cv2.LINE_AA)

參數:

? - img:要添加文字的圖像

? - text:要寫入的文本數據(此處是不能加中文的,會顯示問號(?),matplotlib可以顯示中文)

? - station:文本的放置位置

? - font:字體樣式

? - Fontscale:字體大小

? - thickness:字體線條寬度

? - cv2.LINE_AA?:使用反走樣技術繪制文本邊框

import cv2 as cvimg = cv.imread('../images/cat1.png')cv.putText(img, 'Hello World', (50, 50), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.5 讀取視頻

cap = cv2.VideoCapture(path)

- path?: 為0代表從默認攝像頭捕獲視頻流

ret,frame = cap.read()

- 得到一個布爾值和一幀圖像,布爾值表示是否成功讀取到幀,如果為False,可能是因為視頻結束或讀取失敗,如果為True,frame則是當前幀的圖像數據。

import cv2 as cv# 本地視頻
cap = cv.VideoCapture('../video/arknights_run.mp4')# 循環獲取視頻每一幀
while True:ret, frame = cap.read()# 考慮視頻最后一幀為空,跳出循環if not ret:breakcv.imshow('frame', frame)# 0xFF把鍵盤敲入的鍵轉換為ASCII碼if cv.waitKey(40) & 0xFF == ord('q'):breakcap.release()
cv.destroyAllWindows()
# 獲取攝像頭
cap = cv.VideoCapture(0)
while True:# 讀取攝像頭ret, frame = cap.read()# 顯示cv.imshow('frame', frame)# 按q鍵退出if cv.waitKey(1) & 0xFF == ord('q'):break
# 釋放攝像頭
cap.release()
# 釋放窗口
cv.destroyAllWindows()

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

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

相關文章

ReentrantLock 實現公平鎖和非公平鎖的原理!

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗! 🌟了解 ThreadLocal請看: ThreadLocal有趣講解,小白也能聽懂&#xff…

NLP高頻面試題(四十一)——什么是 IA3 微調?

隨著大型語言模型的廣泛應用,如何高效地將這些模型適配到特定任務中,成為了研究和工程實踐中的重要課題。IA3(Infused Adapter by Adding and Adjusting)微調技術,作為參數高效微調的一種新穎方法,提供了在保持模型性能的同時,顯著減少可訓練參數數量的解決方案。 IA3 …

swift菜鳥教程14(閉包)

一個樸實無華的目錄 今日學習內容:1.Swift 閉包1.1閉包定義1.2閉包實例1.3閉包表達式1.3.1sorted 方法:據您提供的用于排序的閉包函數將已知類型數組中的值進行排序。1.3.2參數名稱縮寫:直接通過$0,$1,$2來順序調用閉包的參數。1.3.3運算符函…

藍橋杯-藍橋幼兒園(Java-并查集)

并查集的核心思想 并查集主要由兩個操作構成: Find:查找某個元素所在集合的根節點。并查集的特點是,每個元素都指向它自己的父節點,根節點的父節點指向它自己。查找過程中可以通過路徑壓縮來加速后續的查找操作,即將路…

ruby內置全局變量

以下是 Ruby 中常見的 內置全局變量 及其用途的詳細說明。這些變量以 $ 開頭,由 Ruby 解釋器自動管理,用于訪問系統狀態、異常、輸入輸出等核心信息。 一、異常處理相關 全局變量說明示例$!當前作用域最后拋出的異常對象(等同于 rescue >…

tcp轉串口

windows 在 Windows 系統上,可以使用以下成熟的串口轉 TCP 工具: HW VSP3 (HW Virtual Serial Port) 提供串口到 TCP/IP 的映射功能。支持虛擬串口和網絡通信。下載地址:HW Group com0com com2tcp 開源工具,支持虛擬串口和 TCP…

HTML視頻和音頻

<video>元素 <video>元素用于在HTML文檔中嵌入視頻內容。 <video controls><source src"movie.mp4" type"video/mp4"><source src"movie.ogg" type"video/ogg">您的瀏覽器不支持 HTML5 video 標簽。 …

DeepSeek:重構辦公效率的AI新范式

目錄 一、效率躍遷的三重引擎 二、效率提升的量級突破 三、智能辦公的范式轉移 四、未來辦公的效率奇點 當企業主面對堆積如山的文件審批、跨時區協作的溝通損耗、重復機械的數據整理時&#xff0c;是否想過這些場景正在吞噬團隊的生產力&#xff1f;據麥肯錫研究顯示&…

redis 延遲雙刪

Redis延遲雙刪是一種用于解決緩存與數據庫數據一致性問題的策略&#xff0c;通常在高并發場景下使用。以下是其核心內容&#xff1a; 1. 問題背景 當更新數據庫時&#xff0c;如果未及時刪除或更新緩存&#xff0c;可能導致后續讀請求仍從緩存中讀取舊數據&#xff0c;造成數…

Python設計模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一系列算法&#xff0c;將每個算法封裝起來&#xff0c;并使它們可以互換。策略模式使得算法的變化獨立于使用算法的客戶。換句話說&#xff0c;策略模式允許在運…

SpringBoot集成Ollama本地模型

SpringBoot集成Ollama本地模型 目錄 項目準備創建Ollama服務客戶端創建控制器配置應用屬性創建前端界面添加靜態資源支持完整項目結構啟動應用高級功能擴展部署注意事項性能優化 1. 項目準備 創建一個SpringBoot項目&#xff0c;可以使用Spring Initializr或IDE創建添加必要…

ResNet改進(19):基于PyTorch的ResNet改進方案詳解:Mish激活+SPP模塊+MixUp數據增強

1. 前言 ResNet作為深度學習領域里程碑式的網絡架構,在圖像分類等計算機視覺任務中表現出色。然而,隨著研究的深入和技術的發展,原始的ResNet架構仍有改進空間。本文將詳細介紹一種基于PyTorch的ResNet改進方案,該方案融合了Mish激活函數、SPP模塊和MixUp數據增強等先進技…

leetcode68.左右文本對齊

思路源自 leetcode-字符串篇 68題 文本左右對齊 難度高的模擬類型題目&#xff0c;關鍵點在于事先知道有多少單詞要放在本行并且還要知道本行是不是最后一行&#xff08;最后一行需要全部單空格右對齊&#xff0c;不是最后一行就空格均攤&#xff09;&#xff0c;非最后一行的空…

深入理解 Spring 的 MethodParameter 類

MethodParameter 是 Spring 框架中一個非常重要的類&#xff0c;它封裝了方法參數&#xff08;或返回類型&#xff09;的元數據信息。這個類在 Spring MVC、AOP、數據綁定等多個模塊中都有廣泛應用。 核心功能 MethodParameter 主要提供以下功能&#xff1a; 獲取參數類型信息…

Qt 5.14.2入門(一)寫個Hello Qt!程序

目錄 參考鏈接&#xff1a;一、新建項目二、直接運行三、修改代碼增加窗口內容1、Qt 顯示一個 QLabel 標簽控件窗口2、添加按鍵 參考鏈接&#xff1a; Qt5教程&#xff08;一&#xff09;&#xff1a;Hello World 程序 Qt 編程指南 一、新建項目 1、新建一個項目&#xff08…

Spring Boot 3.x 集成 MongoDB 的 默認配置項及默認值,以及 常用需要修改的配置項 的詳細說明

以下是 Spring Boot 3.x 集成 MongoDB 的 默認配置項及默認值&#xff0c;以及 常用需要修改的配置項 的詳細說明&#xff1a; 一、默認配置項及默認值 Spring Boot 對 MongoDB 的默認配置基于 spring.data.mongodb 前綴&#xff0c;以下是核心配置項&#xff1a; 配置項默認…

【QT】 進程

目錄 QT 多進程復習 Linux-C 多進程QProcess 進程類常用方法簡單示例信號與槽應用場景 跨平臺注意事項技巧&#xff1a;使用宏控制平臺命令 QProcess 在嵌入式系統中的使用示例&#xff1a;調用 ALSA 播放音頻示例&#xff1a;調用 arecord 錄音示例&#xff1a;QProcess Shel…

原子操作(cpp atomic)

目錄 一.原子操作 1.原子操作的概念 2.原子變量 二.原子性 1.中間狀態描述 2.單處理器單核 3.多處理器或多核的情況下 4.cache&#xff08;高速緩沖器的作用&#xff09; 5.在cpu cache基礎上,cpu如何讀寫數據&#xff1f;&#xff1f;&#xff1f; 6.為什么會有緩存…

Unet網絡的Pytorch實現和matlab實現

文章目錄 一、Unet網絡簡介1.1 輸入圖像1.2 編碼器部分&#xff08;Contracting Path&#xff09;1.3 解碼器部分&#xff08;Expanding Path&#xff09;1.4 最后一層&#xff08;輸出&#xff09;1.5 跳躍連接&#xff08;Skip Connections&#xff09; 二、Unet網絡的Pytorc…

記錄一次JVM調優過程1

如何通過jmap 診斷&#xff0c;服務運行一段時間后內存使用量飆升的問題 通過 jmap 診斷服務運行一段時間后內存使用量飆升的問題&#xff0c;需結合堆轉儲分析、對象分布統計及工具鏈配合。以下是具體操作步驟和關鍵方法&#xff1a; 一、實時監控與初步分析 獲取進程 PID 使…