Python-Opencv激光测距
生活随笔
收集整理的這篇文章主要介紹了
Python-Opencv激光测距
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 前景
上文采用霍夫變換來獲取坐標,可以看出直線誤判了很多條所以改善了一下測距的方式改成用獲取最小外接矩形的方式獲取
測試圖片
hsv調的數值,TrackBar調整hsv代碼在上文, 獲取hsv大小值后轉到判斷那里去
?效果圖
這里是判斷了很多矩形的但我們通過觀察激光的特征后發現可以通過篩選激光的的高和寬來獲取我們所要的目標矩形,有了目標矩形獲取的坐標后,通過cv2.line就可以把這條線給連接起來了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 要注意矩形框沒法在hsv通道的圖畫出來的,想要畫的話要進行轉通道處理
這里是代碼
import numpy as np import cv2def findLine(img):hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)lower = np.array([0, 0, 255])upper = np.array([147, 8, 255])mask = cv2.inRange(hsv_img, lower, upper)result = cv2.bitwise_and(img, img, mask=mask)cv2.namedWindow('result', 0)cv2.resizeWindow('result', (405, 394))cv2.imshow("result", result)return resultdef rectangle(img, imgResult):img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)t, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)contours, hierarchy = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)i = 0Coordinate = []Numberx = []Numbery = []Ylabel = []Xlabel = []for i in range(0, len(contours)):x, y, w, h = cv2.boundingRect(contours[i])i += 1if w > 30 and h > 30:if w < 100:Ylabel.append(y)Coordinate.append(x)cv2.rectangle(imgResult, (x, y), (x + w, y + h), (255, 20, 25), 20)Numberx.append(x + w)Numbery.append(y + h)cv2.line(imgResult, (Numberx[1], Numbery[1]), (Coordinate[0], Ylabel[0]), (0,255,0), 50)cv2.namedWindow('Canny', 0)cv2.resizeWindow('Canny', (405, 394))cv2.imshow("Canny", imgResult)return imgResult, Coordinate while True:img = cv2.imread("02.jpg")cv2.resize(img, (405, 394))imgResult = img.copy()img = findLine(img)Result, Coordinate = rectangle(img, imgResult)print('左邊坐標點為', Coordinate[0], '右邊坐標點為', Coordinate[1])print('相差距離為', Coordinate[1]-Coordinate[0])cv2.waitKey()要注意的是如果獲取的圖像信息,滿足不了直線的數據會報錯,就是圖像處理后激光處理的太糊了,檢測不出來矩形是會直接報錯的
?所以我們在hsv那里一定要調整好我們的數值
總結
以上是生活随笔為你收集整理的Python-Opencv激光测距的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五个比SCI-Hub还牛的下载文献方法,
- 下一篇: 计算激光雷达各点的仰角并分析其线数——根