2016-02-24 5 views
5

Мне сложно найти линии на шахматной доске на этом изображении, используя HoughLinesP с OpenCV в Python.Параметры OpenCV houghLinesP

В попытке понять параметры HoughLinesP, я придумал следующий код:

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
from matplotlib import image as image 

I = image.imread('chess.jpg') 
G = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY) 

# Canny Edge Detection: 
Threshold1 = 150; 
Threshold2 = 350; 
FilterSize = 5 
E = cv2.Canny(G, Threshold1, Threshold2, FilterSize) 

Rres = 1 
Thetares = 1*np.pi/180 
Threshold = 1 
minLineLength = 1 
maxLineGap = 100 
lines = cv2.HoughLinesP(E,Rres,Thetares,Threshold,minLineLength,maxLineGap) 
N = lines.shape[0] 
for i in range(N): 
    x1 = lines[i][0][0] 
    y1 = lines[i][0][1]  
    x2 = lines[i][0][2] 
    y2 = lines[i][0][3]  
    cv2.line(I,(x1,y1),(x2,y2),(255,0,0),2) 

plt.figure(),plt.imshow(I),plt.title('Hough Lines'),plt.axis('off') 
plt.show() 

Проблема, которую я имею, что это поднимает только одну строку. Если я уменьшу maxLineGap до 1, он заберет тысячи.

Я понимаю, почему это может быть, но как выбрать подходящий набор параметров, чтобы объединить все эти линейные линии? Я что-то упускаю?

Я хотел бы оставить код простым, поскольку я использую его в качестве примера этой функции в действии.

Заранее благодарим за любую помощь!

Обновление: Это отлично работает с HoughLines.

И, похоже, проблем с обнаружением кромок не возникает, поскольку Canny работает нормально.

Однако мне все еще нужно заставить HoughLinesP работать. Есть идеи??

Изображения здесь: Results

ответ

14

Хорошо, я, наконец, нашел проблему и подумал, что я поделюсь решением для кого-то еще с помощью гаек. Проблема заключается в том, что в функции HoughLinesP имеется дополнительный параметр «линии», который является избыточным, потому что выход функции тот же:

cv2.HoughLinesP (изображение, rho, theta, threshold [, строк [, minLineLength [, maxLineGap]]])

Это вызывает проблемы с параметрами по мере их чтения в неправильном порядке. Для того, чтобы избежать путаницы с порядком параметров, самое простое решение, чтобы указать их внутри функции следующим образом:

lines = cv2.HoughLinesP(E,rho = 1,theta = 1*np.pi/180,threshold = 100,minLineLength = 100,maxLineGap = 50) 

Это полностью фиксированная моя проблема, и я надеюсь, что это поможет другим.

+0

Удивительный. Вы должны принять свой ответ – Phani

+0

Спасибо за напоминание, Фани! Сделаю. –

-1

Это не HoughLinesP вопрос, используя этот метод будет получить только все строки, обнаруженные на картинке и вернуться к вам.

Для того, чтобы получить нужные строки, вам необходимо сгладить изображение перед использованием метода. Однако, если вы слишком много сглаживаете, для HoughLinesP не будет никаких границ для обнаружения.

Вы можете узнать больше о сглаживающих эффектах OpenCV here.

+0

Спасибо, что вернулись. Кажется, что нет проблем с сглаживанием, поскольку: (a) он отлично работает для HoughLines, (2) Результаты функции Canny прекрасны (если я так говорю сам!) И (d) Canny Edge Detection включает сглаживание в любом случае. Любые другие идеи? Помогите! –

+0

Сглаживание приведет к удалению фоновых шумов изображения. Canny не сглаживает. Сглаживание «размывает» изображение, которое будет обеспечивать меньшие края после обнаружения края (canny). – Meaniegy

+0

Итак, я дал вам пользу от сомнений и попробовал сглаживание. Я также проверил код функции Canny, чтобы убедиться, что он работает сглаженными, как предполагает алгоритм.(а) Сглаживание не устранило проблему, просто уменьшило количество ребер (но я доволен количеством ребер), и (б) код Canny действительно включает сглаживание, так как это должно привести к лишнему сглаживанию. Еще раз спасибо за вашу помощь, но любые другие идеи? –

Смежные вопросы