cv :: gpu :: HoughLines无法正常工作

时间:2013-11-21 12:50:59

标签: c++ opencv image-processing cuda gpu

我试图在cv::gpu::GpuMat结构上使用 Hough Transform 检测一些行。我已尝试同时使用gpu::HoughLinesgpu::HoughLinesP,但即使阈值极低,我也无法获得任何结果。在调试过程中,我看到应该包含结果的容器(houghLines)中只存储了零。我写的代码如下:

static cv::Mat drawHoughLinesOnMat (cv::gpu::GpuMat hough_Mat, cv::gpu::GpuMat houghLines)
{
    cv::Mat output_Mat;
    cv::cvtColor(cv::Mat(hough_Mat), output_Mat, CV_GRAY2BGR);

    std::vector<cv::Vec4i> lines_vector;
    if (!houghLines.empty())
    {
        lines_vector.resize(houghLines.cols);
        cv::Mat temp_Mat (1, houghLines.cols, CV_8UC3, &lines_vector[0]);
        houghLines.download (temp_Mat);
    }

    for (size_t i=0; i<lines_vector.size(); ++i)
    {
        cv::Vec4i l = lines_vector[i];
        cv::line(output_Mat, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar(0, 0, 255), 1, 8);
    }

    return output_Mat;
}


int main()
{
    cv::Mat input = cv::imread(INPUT_DATA_1->c_str(), CV_LOAD_IMAGE_GRAYSCALE);
    std::string imageType = getImgType(input.type());

    cv::gpu::GpuMat mat_input(input), bil_out, mat_thresh, hough_lines;
    cv::gpu::HoughLinesBuf hough_buffer;

    int bilateral_thresh = 15; // 5 == 0.085s; 15 == 0.467s at run-time
    cv::gpu::bilateralFilter(mat_input, bil_out, bilateral_thresh, bilateral_thresh*2, bilateral_thresh/2);
    //cv::gpu::threshold(bil_out, mat_thresh, 10, 255, CV_THRESH_BINARY);
    cv::gpu::Canny(bil_out, mat_thresh, 10, 60, 5);

    cv::gpu::HoughLinesP(mat_thresh, hough_lines, hough_buffer, 1.0f, (float)(CV_PI/180.0f), 5, 1);
    //cv::Mat test_hough(hough_lines);
    cv::Mat hough_Mat = drawHoughLinesOnMat(mat_input, hough_lines);
    cv::gpu::HoughLines(mat_thresh, hough_lines,  1.0f, (float)(CV_PI/180.0f),   1, true);
    /*cv::Mat */hough_Mat = drawHoughLinesOnMat(mat_input, hough_lines);

    return EXIT_SUCCESS
}

我正在使用的图片是,

enter image description here

有人能告诉我我做错了什么吗?在此先感谢。!

Canny过滤器的输出是,

enter image description here

编辑:

我已经测试了HoughLines的CPU版本,它看起来效果很好。

EDIT_2:

@ jet47发布的解决方案完美无缺。

2 个答案:

答案 0 :(得分:2)

您使用不正确的代码将结果从GPU下载回CPU:

lines_vector.resize(houghLines.cols);
cv::Mat temp_Mat (1, houghLines.cols, CV_8UC3, &lines_vector[0]);
houghLines.download (temp_Mat);

您对temp_Mat - CV_8UC3使用了错误的类型,它必须是CV_32SC4

正确的代码是:

lines_vector.resize(houghLines.cols);
cv::Mat temp_Mat(1, houghLines.cols, CV_32SC4, &lines_vector[0]);
houghLines.download(temp_Mat);

答案 1 :(得分:0)

我的猜测是你使用的方法已经过时(但我不完全确定)。

我就是这样做的(如Example Code所示):

//d_src filled with your image somewhere
GpuMat d_lines;
{
    Ptr<cuda::HoughSegmentDetector> hough = cuda::createHoughSegmentDetector(1.0f, (float) (CV_PI / 180.0f), 50, 5);

    hough->detect(d_src, d_lines);
}

vector<Vec4i> lines_gpu;
if (!d_lines.empty())
{
    lines_gpu.resize(d_lines.cols);
    Mat h_lines(1, d_lines.cols, CV_32SC4, &lines_gpu[0]);
    d_lines.download(h_lines);
}

for (size_t i = 0; i < lines_gpu.size(); ++i)
{
    Vec4i l = lines_gpu[i];
    line(dst_gpu, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA);
}

编辑以上使用OpenCv 3.0界面