2013-12-10 4 views
0

У меня есть изображение, на котором я бегу дилатацию, и работает отлично, теперь я хочу, чтобы обнаружить две линии Дика на него:обнаруживая 2 линии OpenCV

DilationResult

и при запуске на нем часть код:

cv::Canny(dilationResult,canny,50,200,3); 
    cv::cvtColor(dilationResult,dilationResult,CV_BGR2GRAY); 
    cv::HoughLines(canny,lines,30,CV_PI/180,500,0); 
    cv::cvtColor(mask,mask,CV_GRAY2BGR); 
     if(lines.size()!=0){ 
       std::cout << " line Size " << lines.size()<< std::endl; 
    for(size_t i = 0; i < lines.size(); i++) 
     { 
      float rho = lines[i][0], theta = lines[i][2]; 
      cv::Point pt1, pt2; 
      double a = cos(theta), b = sin(theta); 
      double x0 = a*rho, y0 = b*rho; 
      pt1.x = cvRound(x0 + 1000*(-b)); 
      pt1.y = cvRound(y0 + 1000*(a)); 
      pt2.x = cvRound(x0 - 1000*(-b)); 
      pt2.y = cvRound(y0 - 1000*(a)); 
      angle = atan2f((pt2.y-pt1.y),(pt2.x-pt1.x))*180.0/CV_PI; 
      std::cout << "angle " << angle<< std::endl; 
      line(mask, pt1, pt2, cv::Scalar(0,0,255), 3, CV_AA); 
     } 
    } 
    cv::imshow("mask " ,mask); 

вот результат:

detection result

, что я хотел бы получить что-то вроде этого:

the perfect result

получает только 2 линии, которые имеют одинаковую ширину, и, кстати, я не хочу использовать findcontour функцию

любой идеи как это можно сделать!

+0

вы можете попробовать фильтр Собеля на первом изображении (возможно, после медианного размытия), давая края на границе между белым и черным. Затем снова попробуйте линии hough! – Micka

+0

Вы рисуете результат на изображении «маска», которое нигде не определено. Пожалуйста, покажите результат функции canny, потому что вы запускаете hough на этом изображении. – littleimp

+0

, поскольку я сказал, что это часть кода, я получил много шума на этом снимке – Engine

ответ

5

Я не заставить его работать с поджилки преобразования, но с вероятностной версии сорта :: HoughLinesP

с lineDetection_Input.jpg быть вашим связано изображение lineDetection_Input.jpg

int main() 
{ 
    cv::Mat color = cv::imread("../lineDetection_Input.jpg"); 

    cv::Mat gray; 
    cv::cvtColor(color, gray, CV_RGB2GRAY); 

    std::vector<cv::Vec4i> lines; 
    cv::HoughLinesP(gray, lines, 1, 2*CV_PI/180, 100, 100, 50); 

    for(size_t i = 0; i < lines.size(); i++) 
    { 
     cv::line(color, cv::Point(lines[i][0], lines[i][1]), 
       cv::Point(lines[i][2], lines[i][3]), cv::Scalar(0,0,255), 1); 
    } 

    cv::imwrite("lineDetection_Output.jpg", color); 
    cv::namedWindow("output"); cv::imshow("output", color); cv::waitKey(-1); 

    return 0; 
} 

lineDetection_Output.jpg: lineDetection_Output.jpg

для повернутого изображения:

и для некоторого различного угла пересечения: там вы можете увидеть некоторые строки, обнаруженные с немного фальшивой углом, которые начинаются в верхнем правом углу и заканчиваются вблизи пересечения (близко позади), но это может быть легко фильтруется по длине или чему-то еще.

+0

@ Мика благодарен за ваш ответ, но вы считаете, что линии всегда имеют 90 градусов, а это не так. – Engine

+0

нет, линии проверены с шагом в 2 ° в моем коде, можно изменить на другие размеры шага (например, 1 °), я думаю. Протестировал тот же код с повернутым изображением и отредактировал проводку с новыми изображениями. Попробуйте 'cv :: HoughLinesP' (вместо' cv :: HoughLines'), это действительно приятно =) – Micka

+0

как вы повернули изображение? – Engine

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