从相机图像中检测虚线 OpenCV
我正在制作一辆自动驾驶汽车。我想弄清楚如何在路面的图片中把实线和虚线分开,比如说。
我尝试沿着轮廓搜索并查看填充部分,但没有成功。
我之前在Stack Overflow上找到了一段代码,直接上传图片时效果很好,但如果连接相机就完全不工作了。
原始代码:
import cv2
import numpy as np
img=cv2.imread('test.jpg')
kernel1 = np.ones((3,5),np.uint8)
kernel2 = np.ones((9,9),np.uint8)
imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBW=cv2.threshold(imgGray, 230, 255, cv2.THRESH_BINARY_INV)[1]
img1=cv2.erode(imgBW, kernel1, iterations=1)
img2=cv2.dilate(img1, kernel2, iterations=3)
img3 = cv2.bitwise_and(imgBW,img2)
img3= cv2.bitwise_not(img3)
img4 = cv2.bitwise_and(imgBW,imgBW,mask=img3)
imgLines= cv2.HoughLinesP(img4,15,np.pi/180,10, minLineLength = 440,
maxLineGap = 15)
for i in range(len(imgLines)):
for x1,y1,x2,y2 in imgLines[i]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow('Final Image with dotted Lines detected', img)
尝试添加相机:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
ret, img = cap.read()
kernel1 = np.ones((3, 5), np.uint8)
kernel2 = np.ones((9, 9), np.uint8)
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBW = cv2.threshold(imgGray, 230, 255, cv2.THRESH_BINARY_INV)[1]
img1 = cv2.erode(imgBW, kernel1, iterations=1)
img2 = cv2.dilate(img1, kernel2, iterations=3)
img3 = cv2.bitwise_and(imgBW, img2)
img3 = cv2.bitwise_not(img3)
img4 = cv2.bitwise_and(imgBW, imgBW, mask=img3)
imgLines = cv2.HoughLinesP(img4, 15, np.pi / 180, 10,
minLineLength=440, maxLineGap=15)
for i in range(len(imgLines)):
for x1, y1, x2, y2 in imgLines[i]:
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow('img', img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
1 个回答
0
正确的方法。
代码片段:
import numpy as np
import cv2
cam = cv2.VideoCapture(0)
while cam.isOpened:
s, img = cam.read()
winName = "Movement Indicator"
cv2.namedWindow(winName, cv2.WINDOW_AUTOSIZE)
edges = cv2.Canny(img, 100, 200)
lines = cv2.HoughLinesP(edges, 15, np.pi / 180, 10,
minLineLength=440, maxLineGap=15)
if lines is not None:
for l in lines:
for x1, y1, x2, y2 in l:
cv2.line(img, (x1, y1), (x2, y2), (255, 255, 255), 20, 5)
cv2.imshow('edges', edges)
cv2.imshow('original', img)
if cv2.waitKey(10) == ord('q'):
break
cam.release()
cv2.destroyAllWindows()