从相机图像中检测虚线 OpenCV

0 投票
1 回答
52 浏览
提问于 2025-04-14 16:15

我正在制作一辆自动驾驶汽车。我想弄清楚如何在路面的图片中把实线和虚线分开,比如说。

我尝试沿着轮廓搜索并查看填充部分,但没有成功。

我之前在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()

撰写回答