- 開始檢測前首先對影像進行處理
- 處理的思路有很多種:
- 深度學習獲得紅線的位置, 這個沒時間就不展示了
- 為了能快速進行影像的處理,這里采用了TrackBar滑動條提取影像紅線的資訊, 這里講一下一些關于的用法,要注意的是這個方法魯棒性特別差,
- TrackBar: cv2.的一個滑動條函式,能夠使變數通過滑動的方式調整,
- 首先就是在本文中的用法, 利用TrackBar提取影像特定的顏色,???????
- 第二種,利用TrackBar調整Canny的值,可以快速得到影像的想要的輪廓,
- 第三種, 利用TrackBar調整二值化的值,獲得想要的資訊,
- 還能調整濾波????????,獲得自已想要的前景和背景,
- 本文通過TrackBar調整Hsv的代碼會放在后面.
- 經過影像處理后,我們以及獲取到我們想要的影像了,之后就可以利用cv2的函式進行獲取距離, 大概簡單的思路
- ??????通過簡單的Canny獲取激光的輪廓
- 霍夫變換,魯棒性也是比較差的有時間的話最好還是通過深度學習的方式來獲取坐標
- 獲取到一條直線坐標(x1, y1, x2, y2)后 [要注意的是,這里X1 == X2]
- 將所有直線的x坐標輸出來,你會發現檢測了很多條沒用的直線,這是因為影像的激光并不是直的所以這個檢測出很多直線,那我們只要將X坐標偏差一點點的全都取平均數就好了,這里我是直接取一個用了,然后X坐標差值大的自然就是寧外一段激光了,
- ???????這里還有一種比較好的辦法就是對兩條線段取外接矩形獲取那個矩形末端的兩個坐標取???????平均值來算距離
開始上測驗圖和代碼
目標影像(素材圖)

Hsv影像處理
不同的影像Hsv都要重新調整,因為光照因素的都不一樣,這也就是為什么魯棒性差
這是測驗的影像 
最終處理的結果
看到抗揍云的代碼都沒什么人下, 我就直接放出來了
TrackBar代碼,在這里調整好數值去最后的測驗代碼上Hsv的最大值和最小值
import cv2
import numpy as np
import numpy as py
img = cv2.imread("01.jpg")
def empyt(sum):
pass
cv2.namedWindow('TrackBar')
cv2.resizeWindow('TrackBar', 640, 320)
cv2.createTrackbar("Hue Min", 'TrackBar', 0, 179, empyt)
cv2.createTrackbar("Hue Max", 'TrackBar', 179, 179, empyt)
cv2.createTrackbar("Sat Min", 'TrackBar', 0, 255, empyt)
cv2.createTrackbar("Sat Max", 'TrackBar', 255, 255, empyt)
cv2.createTrackbar("Val Min", 'TrackBar', 0, 255, empyt)
cv2.createTrackbar("Val Max", 'TrackBar', 255, 255, empyt)
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
while 1:
h_min = cv2.getTrackbarPos("Hue Min", 'TrackBar')
h_max = cv2.getTrackbarPos("Hue Max", 'TrackBar')
s_min = cv2.getTrackbarPos("Sat Min", 'TrackBar')
s_max = cv2.getTrackbarPos("Sat Max", 'TrackBar')
v_min = cv2.getTrackbarPos("Val Min", 'TrackBar')
v_max = cv2.getTrackbarPos("Val Max", 'TrackBar')
print(h_min, h_max, s_min, s_max, v_min, v_max)
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
mask = cv2.inRange(hsv_img, lower, upper)
result = cv2.bitwise_and(img, img, mask=mask)
cv2.namedWindow('mask', 0)
cv2.resizeWindow('mask', (405, 394))
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', (405, 394))
cv2.namedWindow('hsv_img', 0)
cv2.resizeWindow('hsv_img', (405, 394))
cv2.namedWindow('result', 0)
cv2.resizeWindow('result', (405, 394))
cv2.imshow("mask", mask)
cv2.imshow("img", img)
cv2.imshow("hsv_img", hsv_img)
cv2.imshow("result", result)
cv2.waitKey(1)
cv2.waitKey()
Text的代碼
import numpy as np
import cv2
def findLine(img):
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 242])
upper = np.array([38, 48, 255])
mask = cv2.inRange(hsv_img, lower, upper)
result = cv2.bitwise_and(img, img, mask=mask)
# cv2.imshow("result", result)
return result
def HoughLine(img):
img = cv2.medianBlur(img, 5)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.Canny(img, 150, 200)
cv2.namedWindow('Canny', 0)
cv2.resizeWindow('Canny', (405, 394))
cv2.imshow("Canny", img)
lines = cv2.HoughLinesP(img, 1, np.pi/180, 7, 20, 20)
i = 0
for line in lines:
x1, y1, x2, y2 = line[0]
i+=1
print('This Line',i, x1)
cv2.line(img, (x1, y1), (x2, y2), (255,22,255), 3)
if i == 4:
print('This Line', i, x1,y1)
cv2.line(img, (x1, y1), (165, y1), (255,20,25), 5)
return x1, y1
cv2.imshow("HoughLine", img)
def Result(img, x1, y1):
cv2.line(img, (x1, y1), (165, y1), (255, 20, 25), 5)
print('兩激光線長', x1 - 165)
cv2.namedWindow('Result', 0)
cv2.resizeWindow('Result', (405, 394))
cv2.imshow("Result", img)
while True:
img = cv2.imread("01.jpg")
imgResult = img.copy()
cv2.resize(img, (405, 394))
img = findLine(img)
x1, y1 = HoughLine(img)
Result(imgResult, x1, y1)
cv2.waitKey()
有什么代碼上有不懂的(畢竟里邊都是沒打注釋的[doge])都可以來群954736632
歡迎在線打擾
最后如果你Opencv學完基礎了,可以嘗試借用mediapipe的庫完成一些基于谷歌開源的模型進行一些練習, 你也可以嘗試一些學習深度學習,比較有用的教程
- CvZone的一個官網(一些小專案里邊都有教學,可惜后邊比較進階的都要錢)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/396352.html
標籤:其他
上一篇:U-Net論文詳解
