检测2行opencv

时间:2013-12-10 11:12:08

标签: c++ 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函数

任何想法怎么做到这一点!

1 个答案:

答案 0 :(得分:5)

我不能使用hough变换,但使用概率版本cv :: 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

用于旋转图像:

和一些不同的交叉角: 在那里,您可以看到一些线条检测到的略微错误的角度从右上角开始并在交叉点附近结束(后面关闭),但这些线条很容易按长度或其他东西过滤。