Python 利用OpenCV增强车灯的角点检测

Python 利用OpenCV增强车灯的角点检测,python,opencv,corner-detection,image-enhancement,Python,Opencv,Corner Detection,Image Enhancement,我使用下面的代码来检测明亮的灯光。照明可能会有所不同。我使用下面的代码来检测相同的情况 img = cv2.imread("input_img.jpg") rgb = img.copy() img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) while True: th3 = cv2.adaptiveThreshold(img_grey, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, \

我使用下面的代码来检测明亮的灯光。照明可能会有所不同。我使用下面的代码来检测相同的情况

img = cv2.imread("input_img.jpg")
rgb = img.copy()
img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
while True:

    th3 = cv2.adaptiveThreshold(img_grey, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, \
                                cv2.THRESH_BINARY, 11, 2)

    cv2.imshow("th3",th3)

    edged = cv2.Canny(th3, 50, 100)
    edged = cv2.dilate(edged, None, iterations=1)
    edged = cv2.erode(edged, None, iterations=1)

    cv2.imshow("edge", edged)

    cnts = cv2.findContours(edged.copy(), cv2.RETR_TREE,
                            cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    areaArray = []

    for i, c in enumerate(cnts):
        area = cv2.contourArea(c)
        areaArray.append(area)
    sorteddata = sorted(zip(areaArray, cnts), key=lambda x: x[0], reverse=True)

    thirdlargestcontour = sorteddata[2][1]
    x, y, w, h = cv2.boundingRect(thirdlargestcontour)
    cv2.drawContours(rgb, thirdlargestcontour, -1, (255, 0, 0), 2)

    cv2.rectangle(rgb, (x, y), (x + w, y + h), (0, 255, 0), 2)

    cv2.imshow("rgb", rgb)
    if cv2.waitKey(1) == 27:
        break
上面的代码有效,但是

  • 它只给出包围灯的矩形。如何精确获取灯的四个角点
  • 如何改进检测?目前,我正在挑选第三大轮廓,这并不保证它将始终是灯,因为环境构成了挑战
  • 当轮廓完成时,ApproxPolydp工作,但如果轮廓不完整,则ApproxPolydp不会返回正确的坐标。例如,在下图中,approxpolydp返回错误的坐标


    在Python/OpenCV中,有一种方法可以实现这一点

    • 读取输入图像并转换为灰度
    • 使用自适应阈值获得灯区域的粗轮廓
    • 找到轮廓
    • 过滤区域上的轮廓以去除无关区域,并仅保留两个区域中较大的区域(阈值区域的内轮廓和外轮廓)
    • 包围
    • 将周长拟合到多边形,该多边形应为具有正确参数选择的四边形
    • 在输入图像的副本上绘制轮廓(红色)和多边形(蓝色)作为结果
    输入:


    阈值图像:

    结果图像:

    角坐标:

    [[[233 145]]
    
     [[219 346]]
    
     [[542 348]]
    
     [[508 153]]]
    


    在Python/OpenCV中有一种方法可以做到这一点

    • 读取输入图像并转换为灰度
    • 使用自适应阈值获得灯区域的粗轮廓
    • 找到轮廓
    • 过滤区域上的轮廓以去除无关区域,并仅保留两个区域中较大的区域(阈值区域的内轮廓和外轮廓)
    • 包围
    • 将周长拟合到多边形,该多边形应为具有正确参数选择的四边形
    • 在输入图像的副本上绘制轮廓(红色)和多边形(蓝色)作为结果
    输入:


    阈值图像:

    结果图像:

    角坐标:

    [[[233 145]]
    
     [[219 346]]
    
     [[542 348]]
    
     [[508 153]]]
    


    灯是白色矩形物体吗?是的。。它是白色的长方形object@nathancy有什么办法可以精确地找到角点吗?你是在用霍夫线变换来检测“灯”的边界吗?如果是这样,您可以使用Hough给出的直线,并近似两条直线的可能交点。。。在每个角落都会发生。如果你通过外推点来计算直线,如果你不能很好地检测到每一个边界(如第二幅图像),那就不会有太大问题,因为你仍然可以通过外推直线的交点很好地猜出角点的位置。“灯”是白色矩形物体吗?是的。。它是白色的长方形object@nathancy有什么办法可以精确地找到角点吗?你是在用霍夫线变换来检测“灯”的边界吗?如果是这样,您可以使用Hough给出的直线,并近似两条直线的可能交点。。。在每个角落都会发生。如果您通过外推点来计算直线,如果您无法完美地检测到每个边界(如第二张图像中),那么问题不大,因为您仍然可以通过外推直线的交点很好地猜测角点的位置。谢谢!。。。当轮廓完成时,APROXPOLYDP工作。在某些情况下,当轮廓不完整时,角点是错误的。。请检查返回错误坐标的新图像仅使用自适应阈值参数以适合输入图像,以便轮廓完整或用形态学缩小小间隙。谢谢!。。。当轮廓完成时,APROXPOLYDP工作。在某些情况下,当轮廓不完整时,角点是错误的。。请检查返回错误坐标的新图像,仅选择自适应阈值参数以适合输入图像,以便轮廓完整或用形态学缩小小间隙。