OpenCV 入門知識:圖片展示、攝像頭捕獲、控制鼠標及其 Trackbar(滑動條)生成!

在這里插入圖片描述
在這里插入圖片描述

😶?🌫?😶?🌫?😶?🌫?😶?🌫?Take your time ! 😶?🌫?😶?🌫?😶?🌫?😶?🌫?
💥個人主頁:🔥🔥🔥大魔王🔥🔥🔥
💥所屬專欄:🔥魔王的修煉之路–Computer vision🔥
如果你覺得這篇文章對你有幫助,請在文章結尾處留下你的點贊👍和關注💖,支持一下博主。同時記得收藏?這篇文章,方便以后重新閱讀。

文章目錄

顯示圖片(waitKey(),GUI 事件)

import cv2img = cv2.imread('D:/Zachary/6_OpenCV/images/1.png')cv2.namedWindow("new", cv2.WINDOW_NORMAL)
cv2.resizeWindow("new", 480, 360)
cv2.imshow('new', img)key = cv2.waitKey(0) # 單位毫秒,0 時不會跳過等待輸入,在顯示窗口時一般都要使用該函數。
# 這不用 key 接收,因為不作比較,想一直顯示圖片的話直接堵塞就行,參數為 0。cv2.destroyAllWindows()
  • imshow 第二個參數是圖片對象,不能是圖片路徑。

  • 記得最后釋放窗口資源。

  • cv2.waitKey(time),單位是毫秒,0 時不會跳過,等待輸入,所以圖片窗口才不會閃關。當為其他時間時,表示該函數等待的毫秒數。

  • cv2.waitKey(time) 返回的數據類型:返回按下鍵的 ASCII 值,int 類型。

  • waitKey():是 OpenCV 處理 GUI 事件的唯一入口。

  • GUI 事件:在圖形界面上的操作動作(比如點擊、拖動、輸入等),程序會 ”監聽“ 這些動作并 ”響應“ 他們。

  • GUI 事件處理流程:

    1. 用戶操作(點擊、輸入、拖動…)
    2. 操作觸發事件
    3. 程序注冊的回調函數被調用
    4. 程序根據事件做出響應
  • OpenCV 中的幾個 GUI 事件相關函數:

    函數名作用
    cv2.waitKey()等待鍵盤輸入,返回按鍵的編碼
    cv2.setMouseCallback()注冊鼠標事件回調
    cv2.createTrackbar()添加滑動條控件并監聽滑動變化
    cv2.namedWindow() + cv2.imshow()創建可響應事件的窗口

保存圖片

import cv2cv2.namedWindow("win", cv2.WINDOW_NORMAL)
cv2.resizeWindow("win", 480, 360)
img = cv2.imread("../images/1.png")
cv2.imshow("win", img)key = 0
while key != ord('q'):key & 0xff = cv2.waitKey(0) # 單位毫秒,0 時不會跳過等待輸入,在顯示窗口時一般都要使用該函數。單位毫秒。 key & 0xff,處理高字節問題。if key == ord('d'):cv2.imwrite("../images/2.png", img)print("保存完成")breakelse:print(key)cv2.destroyAllWindows()
  • key 作比較時,最好 & 0xff ,處理高字節問題。
  • ord 函數:返回字符對應的 ASCII 值。
  • ord -> ordinal,序號的意思,因為 ASCII 是給字符排序號作為 ASCII 值。
  • 所以要通過 ord 轉換才能進行比較,因為 python 沒有字符,底層不會將單個字符看成對應的 ASCII(int 類型),就算是單個字符 python 也會看作字符串,所以沒有對應的數值。

顯示攝像頭并保存

# 查看電腦攝像頭分辨率# import cv2# cap = cv2.VideoCapture(0)# # 確保攝像頭已打開
# if not cap.isOpened():
#     print("無法打開攝像頭")
#     exit()
# width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# fps = cap.get(cv2.CAP_PROP_FPS)  # 獲取攝像頭幀率
# if fps <= 0: fps = 30.0  # 默認30FPS# print(f"攝像頭分辨率: {width}x{height}, 幀率: {fps}")# 引入模塊
import cv2# 創建VedioWriter,為了寫多媒體文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG') # 寫入的多媒體文件的格式
vw = cv2.VideoWriter('../test/out.mp4', fourcc, 25, (640,480)) # 與攝像頭分辨率不一樣,讀取出來的無法播放# 創建窗口
cv2.namedWindow("win", cv2.WINDOW_NORMAL)# 調整窗口大小
cv2.resizeWindow("win", 640, 480)# 獲取視頻設備,創建連接,初始化資源后(攝像頭與硬件之間)返回一個對象給cap,cap是一個持久性對象,創立連接后維持與攝像頭的連接。
cap = cv2.VideoCapture(0)while cap.isOpened():# 檢查攝像頭實時更新的數據,看它是否還打開# 接收其返回的參數,第一為讀取成功 True,失敗 False,第二個為讀取到的幀ret, frame = cap.read()# 每次都讀的這個cap,不過cap這個對象內部狀態會隨著每次讀取而更新。# 展示幀是否讀取正確if ret == True:# 展示窗口,在同一個窗口展示不同的幀,就會形成視頻cv2.imshow("win", frame)# 重新將窗口設置為指定大小cv2.resizeWindow("win", 640, 480) # 這點有點不理解# 將幀寫入多媒體文件vw.write(frame)elif ret == False:breakkey = cv2.waitKey(1)if key & 0xff == ord('q'):break# 釋放 VideoCapture
cap.release()# 釋放 VideoWriter
vw.release()# 釋放窗口
cv2.destroyAllWindows()
  • 沒什么說的,注釋的很詳細。

控制鼠標

import cv2
import numpy as np # 重命名為 np# 鼠標回調函數
def mouse_callback(event, x, y, flags, userdata):print(event, x, y, flags, userdata)# 創建窗口
cv2.namedWindow("mouse", cv2.WINDOW_NORMAL)
cv2.resizeWindow("mouse", 640, 480)# 設置鼠標回調
cv2.setMouseCallback("mouse", mouse_callback, "123") # 第一個參數為窗口名,第二個參數為回調函數,第三個參數為回調函數的最后一個參數,即上面函數的 userdata# 顯示窗口和背景
img = np.zeros((480, 640, 3), np.uint8) # 調整窗口是 長、寬,這個參數順序是 寬,長。還有三通道的順序,是 BGR,和 RGB 是反著的。
# 參數
# 第一個,設置一個分辨率,(第一個為高,第二個為寬,BGR組數),這個函數默認bgr都為0,所以顯示出來為黑色。 bgr組數 3 是因為圖片的色彩就是三個通道
# 第二個參數是像素類型。數據類型是 uint8,即 0~255 的整數,圖像數據通常用這個。
img[:] = (0, 0, 255)  # 紅色(注意:OpenCV 是 BGR 不是 RGB)while True:cv2.imshow("mouse", img) # 因為這個代碼顯示的是圖片,所以可以不用循環,只控制 cv2.waitKey() 參數為 0 就行。key = cv2.waitKey(1)if key & 0xFF == ord('q'):breakcv2.destroyAllWindows()
  • cv2.imshow(“mouse”, img),因為這個代碼顯示的是圖片,所以可以不用循環,只控制 cv2.waitKey() 參數為 0 就行。但是如果用了循環,那么顯示窗口和 cv2.waitKey() 都要放在循環,因為如果想要畫面會變,需要不斷地刷新窗口才行,這段代碼的話沒必要,因為就是黑的,然后 cv2.waitKey() 也要在循環,不然窗口就顯示不出來了。
  • OpenCV 顏色三通道是 BGR,和 RGB 正好反著的。
目的是否必須循環調用 imshow()
僅靜態顯示一張圖片? 只用一次就夠
有窗口交互(鼠標、鍵盤)? 必須每幀都 imshow()
播放視頻或動畫? 必須每幀都 imshow()

Trackbar(控件:滑動條)

import cv2
import numpy as np# 創建窗口
cv2.namedWindow("trackbar", cv2.WINDOW_NORMAL)cv2.resizeWindow("trackbar", 640, 480)# 回調函數
def callback(pos): # 雖然不用回調函數,但要寫一個參數,因為改變滑動條時會底層會調用 crrateTrackbar() 的回調函數,并傳遞當前值,所以需要有參數接收。pass# 創建 trackbar:trackbar 是 滑動條的意思
cv2.createTrackbar("R", "trackbar", 0, 255, callback)
cv2.createTrackbar("G", "trackbar", 0, 255, callback)
cv2.createTrackbar("B", "trackbar", 0, 255, callback)while True: # 獲取當前 trackbar 的值:# 獲取滑動條當前位置:不會再去調用回調函數,它只是讀取滑動條當前的位置,不會觸發任何事件,也不會執行回調函數。r = cv2.getTrackbarPos("R", "trackbar")g = cv2.getTrackbarPos("G", "trackbar")b = cv2.getTrackbarPos("B", "trackbar")# 創建圖片img = np.zeros((360, 480, 3), np.uint8)# 改變圖片顏色img[:] = [b, g, r]cv2.imshow("trackbar", img)key = cv2.waitKey(10)if key & 0xff == ord('q'):breakcv2.destroyAllWindows()   
  • 博主長期更新,博主的目標是不斷提升閱讀體驗和內容質量,如果你喜歡博主的文章,請點個贊或者關注博主支持一波,我會更加努力的為你呈現精彩的內容。

🌈專欄推薦
😈魔王的修煉之路–C語言
😈魔王的修煉之路–數據結構
😈魔王的修煉之路–C++
😈魔王的修煉之路–QT
😈魔王的修煉之路–算法
😈魔王的修煉之路–力扣
😈魔王的修煉之路–牛客
😈魔王的修煉之路–劍指offer
😈魔王的修煉之路–Linux
😈魔王的修煉之路–Computer vision
更新不易,希望得到友友的三連支持一波。收藏這篇文章,意味著你將永久擁有它,無論何時何地,都可以立即找到重新閱讀;關注博主,意味著無論何時何地,博主將永久和你一起學習進步,為你帶來有價值的內容。

請添加圖片描述

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

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

相關文章

Elasticsearch是什么?

Elasticsearch&#xff08;簡稱ES&#xff09;是一種基于Lucene的分布式搜索引擎&#xff0c;廣泛應用于大數據、日志分析、全文搜索等場景。它的核心是提供高效、可擴展的搜索和分析能力。ES 提供了強大的全文搜索、聚合分析、數據可視化等功能&#xff0c;可以用來快速地對海…

(Arxiv-2025)OmniGen2:通向先進多模態生成的探索

OmniGen2&#xff1a;通向先進多模態生成的探索 paper title&#xff1a;OmniGen2: Exploration to Advanced Multimodal Generation paper是BAAI發布在Arxiv 2025的工作 Code:鏈接 Abstract 在本研究中&#xff0c;我們提出了 OmniGen2&#xff0c;這是一種多功能、開源的生成…

期權到期會對大盤有什么影響?

本文主要介紹期權到期會對大盤有什么影響&#xff1f;期權到期對大盤的影響主要體現在以下幾個方面&#xff0c;但整體影響通常有限且短期&#xff0c;具體效果需結合市場環境、期權規模及行權價位置綜合判斷。期權到期會對大盤有什么影響&#xff1f;1. 市場流動性波動到期日效…

【LeetCode刷題指南】--隨機鏈表的復制

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

系統學習算法:專題十四 鏈表

前提知識&#xff1a;1.畫圖&#xff0c;數據結構相關的題&#xff0c;畫圖必不可少&#xff0c;只要能畫出來&#xff0c;那么后面的代碼就很容易能寫出來&#xff0c;因為將抽象的數據結構轉換為直觀的圖畫2.引入虛擬頭結點&#xff0c;也叫哨兵位&#xff0c;能夠避免考慮很…

零基礎學后端-PHP語言(第一期-PHP環境配置)

從本期開始&#xff0c;我們學習PHP&#xff0c;但是我們要先配置PHP環境 PHP官網鏈接&#xff1a;PHP For Windows: Binaries and sources Releases 我們可以看到有以下資源 可以看到有很多php的版本&#xff0c;有Non Thread Safe和Thread Safe&#xff0c;還有zip&#xf…

C++ primer知識點總結

《C Primer》系統學習指南&#xff1a;從C到C的平滑過渡根據你提供的《C Primer》目錄和你的需求&#xff08;C語言背景轉C&#xff0c;側重網絡編程&#xff09;&#xff0c;我將為你制定一個全面的學習計劃&#xff0c;包含知識點詳解、C/C對比、實戰案例和分階段項目練習。第…

異構融合 4A:重構高性能計算與復雜場景分析的安全與效率邊界

當全球數據量以每兩年翻一番的速度爆炸式增長&#xff0c;高性能計算&#xff08;HPC&#xff09;與復雜場景分析正成為破解氣候預測、基因測序、金融風控等世界級難題的關鍵引擎。但異構計算環境的碎片化、多系統協同的復雜性、數據流動的安全風險&#xff0c;正在形成制約行業…

【華為機試】240. 搜索二維矩陣 II

文章目錄240. 搜索二維矩陣 II描述示例 1示例 2提示解題思路核心分析問題轉化算法實現方法1&#xff1a;右上角開始搜索&#xff08;推薦&#xff09;方法2&#xff1a;逐行二分查找方法3&#xff1a;分治法方法4&#xff1a;左下角開始搜索復雜度分析核心要點數學證明右上角搜…

瘋狂星期四文案網第16天運營日記

網站運營第16天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 昨日訪問量 昨日30多ip, 今天也差不多&#xff0c;同步上周下降了一些&#xff0c;感覺明天瘋狂星期四要少很多了&#xff0c;記得上周四700多ip&…

Linux系統基礎入門與配置指南

Linux基本概述與配置 一、我們為什么使用Linux&#xff08;Linux的優點&#xff09;開源與自由 免費&#xff1a; 無需支付許可費用&#xff0c;任何人都可以自由下載、安裝和使用。源代碼開放&#xff1a; 任何人都可以查看、修改和分發源代碼。這帶來了極高的透明度、安全性和…

如何刪除VSCode Marketplace中的publisher

網頁上并沒有提供刪除的按鈕&#xff0c;需要通過命令的形式刪除。 vsce delete-publisher [要刪除的名字]# 鍵入token # y 確認這里的token是之前在Azure DevOps中創建的token&#xff0c;忘了的話可以重建一個 刷新網頁看一下 成功刪除了。

Windows安裝git教程(圖文版)

Git 是一個分布式版本控制系統&#xff0c;用于跟蹤文件的變化&#xff0c;特別是在軟件開發中。它使得多個開發者可以在不同的機器上并行工作&#xff0c;然后將他們的改動合并在一起。是在開發過程中&#xff0c;經常會用到的一個工具。本章教程&#xff0c;主要介紹Windows上…

Remote Framebuffer Protocol (RFB) 詳解

RFC 6143 規范文檔&#xff1a;The Remote Framebuffer Protocol 文章目錄1. 引言2. 初始連接流程2.1 TCP連接建立2.2 協議版本協商2.3 安全握手3. 顯示協議機制3.1 核心概念3.2 像素格式4. 輸入協議4.1 鍵盤事件(KeyEvent)4.2 鼠標事件(PointerEvent)5. 協議消息詳解5.1 握手消…

從 DeepSeek-V3 到 Kimi K2:八種現代大語言模型架構設計

編譯&#xff1a;青稞社區Kimi 原文&#xff1a;https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison 首發&#xff1a;https://mp.weixin.qq.com/s/lSM2jk1UxJVz1WllWYQ4aQ 自原始 GPT 架構開發以來已經過去了七年。乍一看&#xff0c;從 2019 年的…

linux驅動開發筆記--GPIO驅動開發

目錄 前言 一、設備樹配置 二、驅動編寫 三、用戶空間測試 總結 前言 開發平臺&#xff1a;全志A133&#xff0c;開發環境&#xff1a;linux4.9andrio10&#xff0c;開發板&#xff1a;HelperBoard A133_V2.5。 一、設備樹配置 打開板級設備樹配置文件&#xff0c;路徑&a…

騰訊iOA:企業軟件合規與安全的免費守護者

人們眼中的天才之所以卓越非凡&#xff0c;并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆格拉德威爾 目錄 一、為什么要使用騰訊iOA&#xff1f; 二、中小企業軟件合規痛點 三、騰訊iOA解決方案 3.1 核心技…

C#定時任務實戰指南:從基礎Timer到Hangfire高級應用

高效管理后臺作業&#xff0c;讓定時任務成為應用的可靠引擎 在C#應用開發中&#xff0c;定時任務是實現數據同步、報表生成、系統維護等后臺作業的核心技術。本文將深入探討C#生態中主流的定時任務解決方案&#xff0c;從基礎的內置Timer到強大的Quartz.NET和Hangfire框架&…

軟件開發、項目開發基本步驟

? 立項階段&#xff1a;項目定義、需求收集與分析、可行性分析、風險評估與規劃、項目團隊組建、制定項目計劃、獲取批準與支持。? 需求評審與分析&#xff1a;? 項目團隊&#xff08;包括產品經理、開發人員、測試人員等&#xff09;共同參與&#xff0c;明確項目的目標、功…

慢 SQL接口性能優化實戰

在對某電商項目進行接口性能壓測時&#xff0c;發現 /product/search 接口響應緩慢&#xff0c;存在明顯性能瓶頸。通過慢查詢日志排查和 SQL 優化&#xff0c;最終實現了接口響應速度的顯著提升。本文完整還原此次優化過程&#xff0c;特別強調操作步驟和問題分析過程&#xf…