使用 Hough OpenCV 时出错

Error when using Hough OpenCV

本文关键字:出错 OpenCV Hough 使用      更新时间:2023-10-16

如果我不执行任何操作(即不通过控件窗口更改颜色检测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++异常:cv::内存位置 0x000000A75E81EB70 处的异常。

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

OpenCV 错误:断言失败 (d == 2 && (size[0] == 1 || size[1] == 1 || size[0]

*size[1] == 0)) 在 cv::_OutputArray::create, 文件 OPENCV_DIR\opencv-sources\modules\core\src\matrix.cpp, 第 2363 行

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

经过大量的试验和错误,我终于找到了解决方案。实际上,检测中的输出应该是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 错误(未实现函数)

我也有类似的问题。我的代码是这样的:

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 *即.raw数据)

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

opencv_run = false;
this_boost_thread.join();

为了停止线程,我得到了无效参数异常。让我感到困惑的是,在线程返回后抛出了异常,这警告说这是堆栈损坏的经典案例。

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

所以我搜索了Visual Studio 2015 opencv libs,在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 库。