2016-03-24 3 views
3

Я новичок в обоих python и opencv и я столкнулся с проблемой при обнаружении линий в следующем изображении, который имеет полосы черных линий, проложенных по земле:Как правильно определить линии с помощью преобразования HoughLines в openCV python?

enter image description here

Я использовал Следующий код:

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
edges = cv2.Canny(gray,50,150,apertureSize = 3) 
print img.shape[1] 
print img.shape 
minLineLength = img.shape[1]-1 
maxLineGap = 10 
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap) 
for x1,y1,x2,y2 in lines[0]: 
    cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) 

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

+2

Эти линии не очень прямые. Я обнаружил, что мой собственный код для преобразования Hough дал мне больше информации, чем использование консервированного решения (поскольку этот вопрос, похоже, касается понимания). См. Простой пример формообразования, например, Hough. здесь: https://nabinsharma.wordpress.com/2012/12/26/linear-hough-transform-using-python/ Если вы визуализируете результат преобразования самостоятельно, вы быстро увидите, играет ли качество входных строк роль (более широкий пик в пространстве преобразования, менее ясный, где лежит максимум). – roadrunner66

ответ

8

Sanj,

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

Вы можете далее настроить параметры, однако, я думаю, что контур подход в вашем другом посте, скорее всего, будет лучше подход к решению вашей задачи, как показано здесь: How to detect horizontal lines in an image and obtain its y-coordinates using python and opencv?

import numpy as np 
import cv2 

img = cv2.imread('lines.jpg') 

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
edges = cv2.Canny(gray,50,150,apertureSize = 3) 
print img.shape[1] 
print img.shape 
minLineLength=img.shape[1]-300 
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500, threshold=10,lines=np.array([]), minLineLength=minLineLength,maxLineGap=100) 

a,b,c = lines.shape 
for i in range(a): 
    cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA) 


cv2.imshow('edges', edges) 
cv2.imshow('result', img) 

cv2.waitKey(0) 
cv2.destroyAllWindows() 
0

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

Mat img = imread(argv[1]); 

if(!src.data) 
    cerr << "Problem loading image!!!" << endl; 

imshow("img .jpg", img); 

cvtColor(img, gray, CV_BGR2GRAY); 
imshow("gray", gray); 


Mat binary_image; 
adaptiveThreshold(gray, binary_image, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); 
imshow("binary.jpg", binary_image); 

// Create the images that will use to extract the horizontal and vertical lines 
Mat horizontal = binary_image.clone(); 
Mat vertical = binary_image.clone(); 

int horizontalsize = horizontal.cols/30; 

Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontalsize,1)); 


erode(horizontal, horizontal, horizontalStructure, Point(-1, -1)); 
dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1)); 
imshow("horizontal", horizontal); 

int verticalsize = vertical.rows/30; 

Mat verticalStructure = getStructuringElement(MORPH_RECT, Size(1,verticalsize)); 

erode(vertical, vertical, verticalStructure, Point(-1, -1)); 
dilate(vertical, vertical, verticalStructure, Point(-1, -1)); 

imshow("vertical", vertical); 

bitwise_not(vertical, vertical); 
imshow("vertical_bit", vertical); 


Mat edges; 
adaptiveThreshold(vertical, edges, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2); 
imshow("edges", edges); 

Mat kernel = Mat::ones(2, 2, CV_8UC1); 
dilate(edges, edges, kernel); 
imshow("dilate", edges); 

Mat smooth; 
vertical.copyTo(smooth); 

blur(smooth, smooth, Size(2, 2)); 

smooth.copyTo(vertical, edges); 

imshow("smooth", vertical); 
waitKey(0); 
return 0; 

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

  • Нет связанных вопросов^_^