日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV利用鼠标操作测量角度

發布時間:2023/12/9 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV利用鼠标操作测量角度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


前言

本文介紹一種在OpenCV中定義鼠標事件來進行對兩條直線之間夾角的計算以及輸出。

一、本文內容

? ? ? ? 利用OpenCV設置鼠標操作來進行測量角度,基本思路是通過定義鼠標事件得到三角形的三個點的坐標位置,通過我們熟知的余弦定理來進行對夾角的求解,大概程序分為以下部分:

? ? ? ? 1.加載圖片

? ? ? ? 2.定義鼠標事件,鼠標按下左鍵后會在當前鼠標位置畫下實心圓點。

? ? ? ? 3.繪制交線,我們通過鼠標點擊3次后,會在屏幕中留下三個實心點,第一個圓點代表兩條直線的交點,剩下兩點分別代表兩條線上任意一線,這樣通過OpenCV自帶繪制直線函數,將其畫出。

? ? ? ? 4.求取角度,可以將這三個點看做是三角形的三個頂點,分別利用兩點之間距離公式求出三角形的各個邊長,再利用余弦定理進行角度的求解。

? ? ? ? 5.將求出的角度利用OpenCV.putText()函數在合適的位置在圖片中打印出來。

? ? ? ? 本案例也在程序中加入循環條件,可以進行多次測量一張圖片上的角度值。

????????

二、使用步驟

1.代碼及注釋

代碼及注釋如下:

# 開發時間:2022/3/21 10:44 import cv2 as cv import math def mouse_event(event,x,y,flags,params): ##鼠標事件(看過一個視頻,定義鼠標事件必須要協商這幾個參數變量(我可以不用,但是必須有!!)(event事件名稱,x坐標,y坐標,flags(我也沒用過),params(這個也還不太清楚))))global i ##將i設成全局變量,(line(37)注釋只是交代了i存在的意義,并給i附初始值i=0,并沒有進行對i變量全局化的操作)if event==cv.EVENT_LBUTTONDOWN: ##如果鼠標左鍵按下:cv.circle(img,(x,y),5,(0,0,255),-1) ##在當前坐標位置畫一個實心圓,當做點0pointslist.append((x,y)) ##并且把這個點添加進我們之前準備好的點坐標列表pointlist[]中i+=1 ##i+1#print(pointslist,i) ##輸出當前坐標列表里面的坐標和列表里面點的個數i (這個是我測試程序時候用到的,可寫可不寫)if event==cv.EVENT_MOUSEMOVE: ##(看過的那個視頻還告訴我,鼠標事件還必須定義鼠標的移動事件)pass ##(我沒用到,就pass 帶過了)if event==cv.EVENT_LBUTTONUP: ##(看過的那個視頻又告訴我,鼠標事件還必須定義鼠標的抬起事件)pass ##(我還用到,又pass 帶過了)###我們依次點完三個點后(因為i=3了現在),程序就會跳轉至line(37)行了!! def printAngle():global angle ##定義全局變量angle,為了下步輸出用c2=((pointslist[1][1]-pointslist[0][1])**2+(pointslist[1][0]-pointslist[0][0])**2) ##利用兩點之間距離公式計算各邊邊長的平方b2=((pointslist[2][1]-pointslist[0][1])**2+(pointslist[2][0]-pointslist[0][0])**2)a2=((pointslist[2][1]-pointslist[1][1])**2+(pointslist[2][0]-pointslist[1][0])**2)cosangle=(b2+c2-a2)/(2*math.sqrt(b2)*math.sqrt(c2)) ##余弦定理求夾角angle=float(math.acos(cosangle)) ##將計算出的夾角強制轉化為小數型,注意:此時得到的是弧度angle=math.degrees(angle) ##這個函數是將弧度制轉換為角度angle = round(angle) ##取整數角度的部分print(angle,"°") ##輸出角度值###輸出角度值之后,程序繼續執行至——→line(32)(printAngle()功能可以直接寫在getAngle()功能里面,不用單獨寫出來,但是這樣我比較習慣,看個人的思路了!!) def getAngle():cv.line(img, pointslist[0], pointslist[1], (0, 0, 255), 2, 8) ##畫第一條直線,(由第一個點位到第二個點位)cv.line(img, pointslist[0], pointslist[2], (0, 0, 255), 2, 8) ##畫第一條直線,(由第一個點位到第二個點位)printAngle() ##這里再去調用printAngle()(line(17)),去計算角度cv.putText(img,str(angle)+"°",(pointslist[0][0]+30,pointslist[0][1]+30),cv.FONT_HERSHEY_DUPLEX,2,(0,0,255),2) ##在img圖像中合適的地方輸出角度值 ###程序開始 img=cv.imread("E:/cvpicture/angle.jpg") ##加載圖片 cv.namedWindow("img",0) pointslist = [] ##初始化定義一個可以存放點坐標的列表 i=0 ##為了檢測鼠標所畫點的個數,需要有一個全局變量i來進行計數 while True:cv.imshow("img", img) ##顯示圖片cv.setMouseCallback("img",mouse_event) ##創建鼠標事件——→程序跳轉到mouse_event()事件處(line4)c=cv.waitKey(1) ##時刻等待鼠標操作if i==3: ##若鼠左鍵已點擊3次,說明這時已經存儲完成我們所需要的3個點坐標getAngle() ##當按下三次鼠標左鍵之后,(i=3),程序跳轉至getAngle()功能——→line(28)pointslist=[] ##待getAngle()功能結束后,我們已經完成了角度的標注,可以開始進行下一個角度的測量了,因此需要將已有點坐標列表進行清空i =0 ##同理,也需要重新計算點的個數icv.imshow("img",img) ##以及繼續加載圖片 cv.destroyAllWindows() ##釋放窗口

2.運行結果

???????

?

總結

? ? ? ? 純小白,第一次寫文章,希望大家都會有一點收獲!!

總結

以上是生活随笔為你收集整理的OpenCV利用鼠标操作测量角度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。