簡體   English   中英

為什么 Opencv/Hough 變換找不到整行?

[英]Why is Opencv/Hough Transform not finding the whole line?

我完成了關於 OpenCv 尋找車道的教程,我正在嘗試將其應用於在地板上尋找一塊膠帶。 我讓代碼運行並設置了感興趣的區域,但它只找到了磁帶的一些邊緣。 我認為這與厚度有關,但我不是 100% 確定。 任何幫助,將不勝感激。

追蹤 軌道 2 軌道 3

import cv2
import numpy as np
import matplotlib.pyplot as plt

def canny(image):
    gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    blur = cv2.GaussianBlur(gray, (5,5), 0)
    canny = cv2.Canny(blur, 50, 150)
    return canny

def display_lines(image, lines):
    line_image = np.zeros_like(image)
    if lines is not None:
        for line in lines:
            x1, y1, x2, y2 = line.reshape(4)
            cv2.line(line_image, (x1, y1), (x2, y2), (255, 0, 0), 10)
    return line_image

def region_of_interest(image):
    height = image.shape[0]
    polygons = np.array([
        [(200, height), (400, height), (355, 0)]
        ])
    mask = np.zeros_like(image)
    cv2.fillPoly(mask, polygons, 255)
    masked_image = cv2.bitwise_and(image, mask)
    return masked_image

image = cv2.imread('tape3.jpg')
lane_image = np.copy(image)
canny_image = canny(image)
cropped_image = region_of_interest(canny_image)
lines = cv2.HoughLinesP(cropped_image, 2, np.pi/180, 100, np.array([]), minLineLength=40, maxLineGap=5)
line_image = display_lines(lane_image, lines)
combo_image = cv2.addWeighted(lane_image, 0.8, line_image, 1, 1)
# cv2 print image
print(region_of_interest(image))
cv2.imshow("result", combo_image)
cv2.waitKey(0)

這可能無法回答您最初的問題,但這可能是實現您正在尋找的另一種方式。

我首先對圖像的灰度進行閾值化以嘗試隔離磁帶

在此處輸入圖像描述

然后我用opencv的findContours得到每個白色斑點的分割點

在此處輸入圖像描述

我使用的閾值方法對光和陰影很敏感,因此如果這不是可行的約束,您可能必須找到其他一些閾值方法。 如果擔心不同顏色的膠帶,您可以關閉其他值的閾值(轉換為 HSV 或 LAB 並分別關閉 H 或 B 通道以查找紅色)。

編輯:

如果您仍想使用 HoughLinesP,這里有一個適用於您的圖片的示例。

首先我申請了精明:

在此處輸入圖像描述

然后我使用了 HoughLinesP function:

在此處輸入圖像描述

我以前從未使用過 houghLinesP,所以我不確定潛在的陷阱,但它似乎有效,雖然它實際上用這些參數創建了一堆重疊的線,但你必須嘗試一下。

相關代碼:

# canny
canned = cv2.Canny(gray, 591, 269);

# dilate
kernel = np.ones((3,3), np.uint8);
canned = cv2.dilate(canned, kernel, iterations = 1);

# hough
lines = cv2.HoughLinesP(canned, rho = 1, theta = 1*np.pi/180, threshold = 30, minLineLength = 10, maxLineGap = 20);

編輯2:

我查看了 function 的文檔,第三個參數(theta)指的是角度分辨率。 我認為它可能在您的代碼中不起作用,因為您在 Canny 之后沒有對圖像運行膨脹。 使用 1 度搜索分辨率,不難想象我們可能會錯過 canny 返回的非常細的線。 通過使用更大的 kernel(或多次擴張),甚至可能比我在示例中所做的更多地擴張線條。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM