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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Angle Finder(角度测量)

發布時間:2025/3/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Angle Finder(角度测量) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一 前言

二 實現步驟

1 需要的第三方庫

2 讀取圖像

3 獲取鼠標點

(1)打印鼠標點擊的位置(演示,不一定要實現)

(2)創建列表存儲坐標并將點擊生成的點繪制出來

4 計算三個點組成的角的度數

5 潤色(繪制線段構成角度)?

三 整體代碼

四 結束語

一 前言

? ? ? ?在本次項目中,我們將會使用鼠標構建一個角,并顯示這個角的度數;即通過點擊鼠標來生成兩條線,如果這兩條線相交就會形成一個夾角,我們要做的就是測量這個夾角的度數。和之前的項目一樣,本項目也是博主在Github中找到的比較有趣的項目,大家如果感興趣可以嘗試著復現一遍,如果對其他項目感興趣可以關注下面這專欄,有時間我會更新一些比較有趣的項目分享給大家:
GitHub 計算機視覺項目實踐

Now, let's start!

二 實現步驟

? ? ? ?先來簡單介紹一下本次的任務,我們要通過點擊鼠標生成三個點,而這三個點剛好能夠組成兩條相交的射線,接下我們使用一些簡單的數學知識就可以得出這個角的度數了。不難看出,本次的項目并沒有太大的難度,主要是使用數學方法計算角度。

1 需要的第三方庫

? ? ? ?在本次項目中首先是要對圖像中的角度進行測量,所以需要的第一個庫是?OpenCV;然后需要計算角度,免不了數學計算,因此還需要 math 庫,使用這兩個庫就可以實現本次項目了。

2 讀取圖像

? ? ? ?本項目是在圖像中測量角度,所以第一步需要做的是讀取目標圖像。本次實驗中我使用的是隨便找的一幅圖像,只要是使用 CV2 第三方庫能夠讀取就到圖像就可以。

讀取圖像的代碼比較簡單,如下:

import cv2 import mathpath = 'test.jpg' #圖像讀取路徑 img = cv2.imread(path) #讀取圖像

如果你想將圖像顯示出來也可以:

3 獲取鼠標點

? ? ? ? 讀取圖像之后我們要操作的是能夠讓鼠標的點擊在圖像中起作用(點擊左鍵就可以創建一個點,通過三次點擊不同的點得到一個角)。在這里我們創建一個 mousepoint() 函數來完成這個任務。

(1)打印鼠標點擊的位置(演示,不一定要實現)

? ? ? ?通過下面的函數就可以實現鼠標點的檢測并將點擊的坐標,本過程只是顯示鼠標的點擊位置,在項目中不一定實現

def mousePoints(event, x, y, flags, params):if event == cv2.EVENT_LBUTTONDOWN: #檢測是否有鼠標左鍵按下print(x, y)cv2.setMouseCallback('Image', mousePoints) #鼠標的點擊返回到圖像中

通過點擊就可以打印出鼠標的位置?

(2)創建列表存儲坐標并將點擊生成的點繪制出來

每測量一個角度我們要生成不止一個點,所以我們可以將這些點的坐標存儲到一個列表中。

pointsList = [] #創建列表來存儲鼠標點擊的坐標點(這行代碼并不在定義的函數中)pointsList.append([x, y])#將坐標點存儲在列表中(這行代碼應該在函數中)cv2.circle(img, (x, y), 5, (0, 0, 255), cv2.FILLED) #在鼠標的點擊處繪制一個實心圓#上面的代碼都是實現功能的方式,并不會全都排列在一起

將存有坐標點的列表打印下來如下:?

4 計算三個點組成的角的度數

? ? ? ?當我們的列表中存儲的點的個數達到3的倍數(即圖像中的出現完整的角度時,我們該計算這些角的度數并將其繪制在圖中)

計算一個角的度數的方式如下(通過三角函數誘導公式就能得到):

創建一個函數來計算角的度數:

#------------------------------ #定義函數計算兩點之間的斜率 #------------------------------ def gradient(pt1, pt2):return (pt2[1] - pt1[1]) / (pt2[0] - pt1[0])#---------------------------- #定義函數計算角的度數 #--------------------------- def getAngle(pointsList):pt1, pt2, pt3 = pointsList[-3:] #列表中最后的三個坐標點m1 = gradient(pt1, pt2) #計算第一個點和第二個點之間的斜率m2 = gradient(pt1, pt3) #計算第一個點和第三個點之間的斜率angR = math.atan((m2 - m1) / (1 + (m2 * m1))) #計算正切值angD = round(math.degrees(angR)) #將弧度轉化為角度cv2.putText(img, str(angD), (pt1[0] - 40, pt1[1] - 20), cv2.FONT_HERSHEY_COMPLEX,1.5, (0, 0, 255), 2) #繪制文本

5 潤色(繪制線段構成角度)?

? ? ? ?其實到第四步我們的目標已經達成了,將前面的代碼整合起來就可以實現測量角度了,但我們可以在添加一些來繪制線段構成角度,代碼如下:

# -------------------#繪制線段構成一個角度# -------------------size = len(pointsList)if size != 0 and size % 3 != 0:cv2.line(img, tuple(pointsList[round((size - 1) / 3) * 3]), (x, y), (0, 0, 255), 2)

通過以上的步驟就能實現本次的角度測量了

由于線段寬度以及一些因素的影響,誤差在所難免,感興趣可以簡單嘗試一下。?

三 整體代碼

整體代碼如下:
?

""" Author:XiaoMa date:2022/03/30 """ import cv2 import mathpath = 'test.jpg' #圖像讀取路徑 img = cv2.imread(path) #讀取圖像 pointsList = [] #創建列表來存儲鼠標點擊的坐標點#------------------------------- #定義函數來檢測鼠標動作 #------------------------------- def mousePoints(event, x, y, flags, params):if event == cv2.EVENT_LBUTTONDOWN: #檢測是否有鼠標左鍵按下# -------------------#繪制線段構成一個角度# -------------------size = len(pointsList)if size != 0 and size % 3 != 0:cv2.line(img, tuple(pointsList[round((size - 1) / 3) * 3]), (x, y), (0, 0, 255), 2) #在兩點之間繪制直線cv2.circle(img, (x, y), 5, (0, 0, 255), cv2.FILLED) #在鼠標的點擊處繪制一個實心圓pointsList.append([x, y])#將坐標點存儲在列表中print(pointsList)#------------------------------ #定義函數計算兩點之間的斜率 #------------------------------ def gradient(pt1, pt2):return (pt2[1] - pt1[1]) / (pt2[0] - pt1[0])#---------------------------- #定義函數計算角的度數 #--------------------------- def getAngle(pointsList):pt1, pt2, pt3 = pointsList[-3:] #列表中最后的三個坐標點m1 = gradient(pt1, pt2) #計算第一個點和第二個點之間的斜率m2 = gradient(pt1, pt3) #計算第一個點和第三個點之間的斜率angR = math.atan((m2 - m1) / (1 + (m2 * m1))) #計算正切值angD = round(math.degrees(angR)) #將弧度轉化為角度cv2.putText(img, str(angD), (pt1[0] - 40, pt1[1] - 20), cv2.FONT_HERSHEY_COMPLEX,1.5, (0, 0, 255), 2) #繪制文本while True:if len(pointsList) % 3 == 0 and len(pointsList) != 0: #列表長度為3時得到角度getAngle(pointsList)cv2.imshow('Image', img)cv2.setMouseCallback('Image', mousePoints) #鼠標的點擊返回到圖像中 #------------------------------- #按下q鍵清除圖像中的點(刷新圖像) #-------------------------------if cv2.waitKey(1) & 0xFF == ord('q'):pointsList = []img = cv2.imread(path)

四 結束語

? ? ? ?本次項目的實現較為簡單,大家都可以嘗試一下,原理也是使用高中的知識就能搞懂,簡單的不達鳥,簡單的一塌糊涂啊!!

總結

以上是生活随笔為你收集整理的Angle Finder(角度测量)的全部內容,希望文章能夠幫你解決所遇到的問題。

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