【问题标题】:Error when using Hough OpenCV使用 Hough OpenCV 时出错
【发布时间】:2016-02-28 18:05:36
【问题描述】:

如果我什么都不做(也就是说,不要通过控制窗口更改颜色检测 HSV),应用程序运行正常。但是,如果我在应用程序运行时更改 HSV 值,则会出现以下错误。我已经在没有 Hough 的情况下测试了代码,它运行良好。

CPU 错误 -

HoughFinder.exe 中 0x00007FF9ECA64388 (ucrtbase.dll) 处的未处理异常:将无效参数传递给认为无效参数致命的函数。

这是我的代码 -

VideoCapture capture(0); // 0 is my webcam

...

capture.read(displayOriginal))
...(Code to detect colors for extra accuracy)
cudaCanny->detect(imgThresholded, imgCanny);

vector<Vec2f> lines;
//Ptr<HoughLinesDetector> hough = createHoughLinesDetector(1, CV_PI / 180, 100); CUDA code...
//hough->detect(imgCanny, lines); CUDA code...
HoughLines(displayCanny, lines, 1, CV_PI / 180, 100, 0, 0); // CPU code...
    for (size_t i = 0; i < lines.size(); i++)
    {
        float rho = lines[i][0], theta = lines[i][1];
        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));
        line(displayHough, pt1, pt2, Scalar(0, 0, 255), 3, CV_AA);
    }

imshow("Hough", displayHough);
imshow("Live Video", displayOriginal);

额外信息 -

如果我使用 CUDA 代码来使用 Hough,我会收到此错误 -

HoughFinder.exe 中 0x00007FF9F561A1C8 处未处理的异常:Microsoft C++ 异常:内存位置 0x000000A75E81EB70 处的 cv::Exception。

应用程序错误(使用 CPU 代码时不会出现此错误)-

OpenCV 错误:CV 中的断言失败(d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0)): :_OutputArray::create,文件 OPENCV_DIR\opencv-sources\modules\core\src\matrix.cpp,第 2363 行

有人可以帮忙吗?如果 CPU 或 CUDA 代码是固定的,那很好,但我更希望修复 CUDA 错误(因为 CUDA 有额外的速度)。

【问题讨论】:

  • 我也有同样的问题。我转换为灰度,应用中值滤波器,执行 Canny 边缘检测,然后执行霍夫线。如果我更改先前操作的参数,HoughLines 会抛出无效参数异常。我注意到有时 Canny 的输出有很多行。也许这就是问题所在?
  • 从源代码重建 OpenCV 并且不要在 CMake 选项中使用 WITH_QTUSE WITH_CUDA

标签: c++ opencv hough-transform


【解决方案1】:

经过多次尝试和错误,我终于找到了解决方案。实际上检测中的输出应该是GpuMat 而不是vect2d。我早就知道了,但是 OpenCV 的文档非常混乱。这是编辑后的代码 -

Ptr<HoughLinesDetector> houghLines = createHoughLinesDetector(1, CV_PI / 180, 120);
GpuMat tmpLines; // This should be GpuMat...
vector<Vec2d> lines;
GpuMat imgCanny;
... 
while(true) {
    ...
    houghLines->detect(imgCanny, tmpLines);
    houghLines->downloadResults(tmpLines, lines);
    ...
}

OpenCV GPU Error (Function Not Implemented) in Hough Transform

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。我的代码是这样的:

    cv::Mat src, src_gray, src_blured, detected_edges, hough_lines;
    std::vector<cv::Vec4i>  lines;
    src = cv::cvarrToMat(img, false);
    
    opencv_run_ = true;
    while (opencv_run_) {
        cv::cvtColor(src, src_gray, CV_BGR2GRAY);
        cv::medianBlur(src_gray, src_blured, blur_size_);
        cv::Canny(src_blured, detected_edges, canny_low_threshold_, canny_max_threshold_, canny_aperture_size_);
        cv::HoughLinesP(detected_edges, lines, 2, CV_PI / 2, hough_votes_, hough_min_line_length_, hough_max_line_gap_);
        hough_lines = cv::Mat::zeros(size_horizontal_, size_vertical_, CV_8UC4);
        for (size_t i = 0; i < lines.size(); i++) {
            cv::line(hough_lines, cv::Point(lines[i][0], lines[i][1]), cv::Point(lines[i][2], lines[i][3]), cv::Scalar(0, 0, 255), 3, 8);
        }
        if (lines.size() > 0) lines.clear();
    
        cv::imshow("Gray scale", src_gray);
        cv::imshow("Edges", detected_edges);
        cv::imshow("Hough", hough_lines);
    
        //Some logic in waitKey and sleeptime
        cv::waitKey(sleep_time);
    }
    
    cvDestroyAllWindows();
    cvReleaseImageHeader(&img);
    

    其中img 是指向IplImage 的指针,我在其中手动配置值。 (我的图像数据来自一个相机,它的 API 给了我void * 即原始数据)

    这段特殊的代码在 boost::thread 中运行。虽然在循环内一切都运行良好,但当我这样做时

    opencv_run = false;
    this_boost_thread.join();
    

    为了停止线程,我得到了无效参数异常。让我感到困惑的是,异常是在线程返回之后引发的,这让我感到这是一个典型的堆栈损坏案例。

    经过数小时的搜索,我在某个论坛上发现了一些帖子,说这可能是链接库的问题。所以我检查了我的 opencv 安装,发现我的库位于 vc12 文件夹中,这意味着 Visual Studio 2014(我喜欢安装预构建的,因为我是个白痴),与我使用的 VS 2015 不同。

    所以我搜索了 Visual Studio 2015 opencv 库,在 opencv 3.1 版本 https://sourceforge.net/projects/opencvlibrary/files/opencv-win/ 中找到了一些库,而我使用的是 opencv 2.4.13。我决定不使用它们并从头开始构建 opencv。所以我从这里克隆https://github.com/opencv/opencv,按照这里给出的说明http://docs.opencv.org/2.4/doc/tutorials/introduction/windows_install/windows_install.html 并构建了似乎可以工作的vc14 x86 opencv3.1 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2020-02-04
      相关资源
      最近更新 更多