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)通過以上的步驟就能實現本次的角度測量了
由于線段寬度以及一些因素的影響,誤差在所難免,感興趣可以簡單嘗試一下。?
三 整體代碼
整體代碼如下:
?
四 結束語
? ? ? ?本次項目的實現較為簡單,大家都可以嘗試一下,原理也是使用高中的知識就能搞懂,簡單的不達鳥,簡單的一塌糊涂啊!!
總結
以上是生活随笔為你收集整理的Angle Finder(角度测量)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 科学计算库 Numpy (
- 下一篇: 程序设计语言python语言概述