【P18 3-10】OpenCV Python—— 鼠標控制,鼠標回調函數(鼠標移動、按下、。。。),鼠標繪制基本圖形(直線、圓、矩形)

P18 3-10

  • 1 鼠標回調函數
  • 2 鼠標繪制基本圖形(直線、圓、矩形)
    • 2.1 圖形繪制教程
    • 2.2 鼠標繪制基本圖形(直線、圓、矩形)代碼實現

1 鼠標回調函數

在這里插入圖片描述

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


import cv2
import numpy as npdef mouse_callback(event,x,y,flage,userdata):print(event,x,y,flage,userdata)cv2.namedWindow("mouse",cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse',640,360)#窗口尺寸,640行,360列cv2.setMouseCallback('mouse',mouse_callback,'123')#(高,寬,通道數)
img=np.zeros((360,640,3),np.uint8)#高=行數,寬=列數,3通道,每個通道是8位無符號整形數據
while True:cv2.imshow('mouse',img)key=cv2.waitKey(1)if key& 0xff == ord('q'):breakcv2.destroyAllWindows()

在這里插入圖片描述

當鼠標在,窗口內移動、點擊,等操作時,
event,x,y,flag會輸出相應的值;

在這里插入圖片描述

2 鼠標繪制基本圖形(直線、圓、矩形)

2.1 圖形繪制教程

圖形繪制教程:圖形繪制(line直線、ellipse橢圓、polylines多邊形、putText繪制文本)

2.2 鼠標繪制基本圖形(直線、圓、矩形)代碼實現

基本功能:

  • 1 畫線:當按下l鍵,即選擇了畫線。此時,滑動鼠標即可畫線。
  • 2 畫矩形:當按下r鍵,即選擇了畫矩形。此時,滑動鼠標即可畫矩形。
  • 3 畫圓:當按下c鍵,即選擇了畫圓。此時,滑動鼠標即可畫圓。
#全局變量
curshape=0
startpos=(0,0)img=np.zeros((480,640,3),np.uint8)
def mouse_callback(event,x,y,flag,userdata):if event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN:startpos=(x,y)elif event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP:if curshape==0:cv2.line(img,startpos,(x,y),(255,0,0))#起點startpos,終點是當前x,yelif curshape==1:cv2.rectangle(img,startpos,(x,y),(255,0,0))elif curshape==2:cv2.circle(img,startpos,max(abs(startpos[0]-x),abs(startpos[1]-y)),(255,0,0))#選擇dx,dy中最大值,作為半徑else:print('error : no shape')
 File "e:\Program_Py\1.py", line 25, in mouse_callbackcv2.line(img,startpos,(x,y),(255,0,0))#起點startpos,終點是當前x,y
UnboundLocalError: local variable 'startpos' referenced before assignment

意思是:局部變量’startpos’在賦值前被引用

#全局變量
將全局變量前加上global

 global curshape,startpos

name ‘curshape’ is not defined

File "e:\Program_Py\1.py", line 23, in mouse_callbackif curshape==0:
NameError: name 'curshape' is not defined
Traceback (most recent call last):File "e:\Program_Py\1.py", line 24, in mouse_callbackcv2.line(img,startpos,(x,y),(255,0,0))#起點startpos,終點是當前x,y
UnboundLocalError: local variable 'startpos' referenced before assignment

正確做法,在函數外面定義一次,在函數里面使用的時候,需要再次全局申明

#全局變量
curshape=0
startpos=(0,0)img=np.zeros((480,640,3),np.uint8)
def mouse_callback(event,x,y,flag,userdata):global curshape,startpos#需要再次全局申明

startpos=(x,y)
當獲取點startpo中x值時,startpos.x,報錯

File "e:\Program_Py\1.py", line 29, in mouse_callbackcv2.circle(img,startpos,max(abs(startpos.x-x),abs(startpos.y-y)),(255,0,0))
AttributeError: 'tuple' object has no attribute 'x'

改成,startpos[0],OK

#基本功能:
# 1 畫線:當按下l鍵,即選擇了畫線。此時,滑動鼠標即可畫線。
# 2 畫矩形:當按下r鍵,即選擇了畫矩形。此時,滑動鼠標即可畫矩形。
# 3 畫圓:當按下c鍵,即選擇了畫圓。此時,滑動鼠標即可畫圓。#curshape:0-drawline,1-drawrectangle,2-drawcircleimport cv2
import numpy as np#全局變量
curshape=0
startpos=(0,0)img=np.zeros((480,640,3),np.uint8)def mouse_callback(event,x,y,flag,userdata):global curshape,startpos#需要再次全局申明if event & cv2.EVENT_LBUTTONDOWN == cv2.EVENT_LBUTTONDOWN:startpos=(x,y)elif event & cv2.EVENT_LBUTTONUP == cv2.EVENT_LBUTTONUP:if curshape==0:cv2.line(img,startpos,(x,y),(255,0,0))#起點startpos,終點是當前x,yelif curshape==1:cv2.rectangle(img,startpos,(x,y),(255,0,0))elif curshape==2:cv2.circle(img,startpos,max(abs(startpos[0]-x),abs(startpos[1]-y)),(255,0,0))#選擇dx,dy中最大值,作為半徑else:print('error : no shape')cv2.namedWindow('drawshape',cv2.WINDOW_NORMAL)
cv2.setMouseCallback('drawshape',mouse_callback)while True:cv2.imshow("drawshape",img)key=cv2.waitKey(1) & 0xff if key == ord('q'):breakelif key==ord('l'):#linecurshape=0elif key==ord('r'):#rectcurshape=1elif key==ord('c'):#circlecurshape=2

在這里插入圖片描述

當把,函數外面的定義注釋掉,也會報錯,但是可以使用畫圖功能;

# #全局變量
# curshape=0
# startpos=(0,0)img=np.zeros((480,640,3),np.uint8)def mouse_callback(event,x,y,flag,userdata):global curshape,startpos#需要再次全局申明

: name ‘curshape’ is not defined

Traceback (most recent call last):File "e:\Program_Py\1.py", line 23, in mouse_callbackif curshape==0:
NameError: name 'curshape' is not defined

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

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

相關文章

微服務如何集成swagger3

文章目錄引言一、項目結構二、頂級pom依賴準備三、common-swagger模塊四、gateway模塊配置五、結果演示引言 我們在用springboot開發應用時,經常使用swagger來作為我們的接口文檔可視化工具,方便前端同事調用,集成也是比較簡單的&#xff0c…

特種行業許可證識別技術:通過圖像處理、OCR和結構化提取,實現高效、準確的許可證核驗與管理

在酒店、娛樂場所、典當行、危化品經營等特種行業管理中,許可證是合法經營的“生命線”。傳統人工核驗方式效率低下、易出錯,且難以應對海量數據和復雜偽造手段。特種行業許可證識別技術應運而生,成為智慧監管和優化服務的關鍵工具。特種行業…

零售行業新店網絡零接觸部署場景下,如何選擇SDWAN

一家連鎖超市在新疆偏遠地區的新店開業申請網絡專線,市政審批和架設電線桿的流程花了半個月,成本高企——而它的競爭對手在隔壁新店部署SD-WAN,從開箱到業務上線僅用了10分鐘。近年來,零售企業瘋狂擴張與下沉市場的趨勢愈演愈烈。…

python發布文章和同步文章到社區的工具小腳本

在開發過程中,開發者們往往需要頻繁地在社區中分享文章、解決方案以及技術文章來交流與成長。為了簡化這一過程,我將為你們介紹兩個基于Python腳本的自動化工具,可以幫助你發布文章到開發者社區,提高效率。一、從Markdown文件批量…

23.CNN系列網絡思考

為什么是卷積、池化的交替進行? 卷積做的是特征提取,池化做的是一種降采樣。 早期學習的主要是:低級特征(邊緣、角點、紋理、顏色)。這些特征分布相對局部且空間位置信息很重要。 卷積將這些特征學習出來,然后通過池化降采樣,突出其位置信息。然后再卷積進行學習池化后…

MySQL 8.x的性能優化文檔整理

一、內存與緩沖優化 # InnoDB緩沖池(內存的60%-80%) innodb_buffer_pool_size 12G # 核心參數 innodb_buffer_pool_instances 8 # 8核CPU建議分8個實例# 日志緩沖區與Redo日志 innodb_log_buffer_size 256M # 事務日志緩沖區 innodb_log_…

個人使用AI開發的《PlSqlRewrite4GaussDB(PLSQL自動轉換工具)1.0.1 BETA》發布

個人使用AI開發的《PlSqlRewrite4GaussDB(PLSQL自動轉換工具)1.0.1 BETA》發布 前言 基于語法樹的SQL自動改寫工具開發系列(1)-離線安裝語法樹解析工具antlr4 基于語法樹的SQL自動改寫工具開發系列(2)-使用PYTHON進行簡單SQL改寫…

python的校園研招網系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具:Navicat/SQLyog等都可以 摘要&…

如何高效撰寫AI領域學術論文——學習筆記

最開始寫的時候最好仿照著頂會來寫1. 標題(Title)?標題是論文的"門面",需要同時具備簡潔性和信息量:采用"XX方法 for XXX任務"的標準格式,包含核心創新點和應用領域,避免使用模糊詞匯,力求精準&a…

elasticsearch8.12.0安裝分詞

上篇說到,安裝了es后正常運行es分詞下載地址從 GitHub Release 下載(推薦) 👉 https://github.com/medcl/elasticsearch-analysis-ik/releases或https://release.infinilabs.com/analysis-ik/stable/安裝:選擇與你 ES …

強化學習算法分類與介紹(含權重更新公式)

強化學習算法種類豐富,可按學習目標(基于價值 / 基于策略 / 演員 - 評論家)、數據使用方式(在線 / 離線)、是否依賴環境模型(無模型 / 有模型)等維度分類。以下按核心邏輯梳理常見算法&#xff…

基于STM32F103單片機智能門禁熱釋人體感應報警設計

1 系統功能介紹 本設計基于 STM32F103C8T6 單片機,通過多種傳感器、執行器以及通信模塊實現智能門禁和安防報警功能。其主要功能是檢測門外人員情況,結合環境光照強度判斷是否需要照明,同時結合 GSM 模塊在異常情況下發送報警信息&#xff0c…

imx6ull-驅動開發篇33——platform 平臺驅動模型

目錄 Linux 驅動的分離與分層 驅動的分隔與分離 驅動的分層 platform 平臺驅動模型 platform 總線 bus_type 結構體 platform 總線 platform_match函數 platform 驅動 platform_driver 結構體 device_driver 結構體 platform_driver_register 函數 platform_drive…

Win/Linux筆記本合蓋不睡眠設置指南

在 筆記本電腦上,當你合上屏幕時,默認系統可能會進入“睡眠”或“休眠”狀態。如果你希望合上屏幕時系統繼續正常運行(例如后臺下載、運行程序、遠程訪問等),需要修改系統的電源設置。 一、以下是 Windows 10 / Windo…

(棧)Leetcode155最小棧+739每日溫度

739. 每日溫度 - 力扣(LeetCode) while要把stack的判斷放在前面,否則stack[-1]可能報錯 class Solution(object):def dailyTemperatures(self, temperatures):""":type temperatures: List[int]:rtype: List[int]""…

【NLP(01)】NLP(自然語言處理)基礎

目錄NLP基礎一、基本概念1. 自然語言處理的基本介紹1.1 與語言相關的概念1.2 為什么使用NLP2. NLP的應用方向2.1 **自然語言理解**2.2 自然語言轉換2.3 自然語言生成3. NLP基礎概念4. NLP的發展歷史5. NLP的基本流程二、NLP中的特征工程0. 引入1. 詞向量2. 傳統NLP中的特征工程…

Python工程師進階學習道路分析

本文將分為以下幾個核心部分: 心態與基礎重塑:從“會用”到“精通”核心語言深度:窺探Python的奧秘編程范式與設計模式:寫出優雅的代碼并發與異步編程:釋放多核時代的威力性能分析與優化:讓代碼飛起來深入…

IntelliJ IDEA中Maven的“Sync“與“Reload“詳解:小白的避坑指南

在IntelliJ IDEA中使用Maven時,Sync All Maven Projects(同步)和 Reload All Maven Projects(重新加載)是兩個最常用的操作按鈕。它們看似相似,實則承擔著完全不同的職責。本文將通過通俗易懂的對比和場景分…

網絡地址的詳細計算說明

IP地址分類與計算 IP地址分5類A類 :0開頭,適用于大型網絡 B類 :10開頭,適用于中型網絡 C類 :110開頭,適用于小型網絡 D類 :1110開頭,用于組播 E類 : 1110開頭&#xff0c…

人工智能驅動的現代電商前端開發:從基礎到智能體驗

引言:AI如何重塑電商體驗電子商務行業正在經歷一場人工智能革命。從個性化推薦到視覺搜索,從智能客服到預測分析,AI技術正在徹底改變用戶與電商平臺的交互方式。作為前端開發者,了解如何集成AI功能已成為必備技能。本文將帶您深入…