2016-02-28 5 views
3

Если я ничего не делаю (т. Е. Не изменяю HSV контроля цвета через окно управления), приложение работает нормально. Однако, если я изменяю значения HSV при запуске приложения, я получаю следующие ошибки. Я тестировал код без Hough, он работает нормально.Ошибка при использовании Hough OpenCV

ЦП Ошибка -

Unhandled exception at 0x00007FF9ECA64388 (ucrtbase.dll) in HoughFinder.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.

Это мой код -

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); 

Extra Info -

Если я использую CUDA код, чтобы использовать Хью, я получаю эту ошибку -

Unhandled exception at 0x00007FF9F561A1C8 in HoughFinder.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000A75E81EB70.

App Error (Не получаю эту ошибку при использовании кода CPU) -

OpenCV Error: Assertion failed (d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0)) in cv::_OutputArray::create, file OPENCV_DIR\opencv-sources\modules\core\src\matrix.cpp, line 2363

Может кто-нибудь помочь? Если какой-либо ЦП или код CUDA фиксирован, его штраф, но я бы предпочел, чтобы ошибка CUDA была исправлена ​​(поскольку CUDA имеет дополнительную скорость).

+0

У меня такая же проблема. Я трансформируюсь в серый цвет, я применяю медианный фильтр, я выполняю обнаружение края Canny, а затем линии Hough.Если я изменяю параметры предыдущих операций, HoughLines выдает исключение недопустимых параметров. Я заметил, что иногда у выхода Canny много линий. Может, в этом проблема? –

+0

Перестроить OpenCV из источника и ** НЕ использовать ** WITH_QT' и ** ИСПОЛЬЗОВАТЬ ** 'WITH_CUDA' в настройках CMake. – FadedCoder

ответ

1

У меня была аналогичная проблема. Мой код-то вроде этого:

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, который я использую.

Итак, я искал opencv libs для Visual Studio 2015, нашел некоторые в 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, которые, похоже, работают.

3

После многих испытаний и ошибок я наконец нашел решение. Фактически вывод в детекторе должен быть 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

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