- 前景
上文采用霍夫变换来获取坐标,可以看出直线误判了很多条所以改善了一下测距的方式改成用获取最小外接矩形的方式获取
测试图片
hsv调的数值,TrackBar调整hsv代码在上文, 获取hsv大小值后转到判断那里去
效果图
这里是判断了很多矩形的但我们通过观察激光的特征后发现可以通过筛选激光的的高和宽来获取我们所要的目标矩形,有了目标矩形获取的坐标后,通过cv2.line就可以把这条线给连接起来了
要注意矩形框没法在hsv通道的图画出来的,想要画的话要进行转通道处理
这里是代码
import numpy as np
import cv2
def 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 result
def 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 = 0
Coordinate = []
Numberx = []
Numbery = []
Ylabel = []
Xlabel = []
for i in range(0, len(contours)):
x, y, w, h = cv2.boundingRect(contours[i])
i += 1
if 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那里一定要调整好我们的数值