2013-03-30 2 views
0

Я застрял в этой проблеме в течение нескольких дней;Программа вылетает при использовании cv :: findContours с Qt Gui

Я создал проект консоли Qt, связал его с OpenCV, и все работало нормально;

Я создал проект Qt Gui, добавил кнопку и скопировал один и тот же код из предыдущего проекта в слот кнопки, я получил окно segFault и программу, выходящую с кодом -1073741819.

Таким образом, я использовал отладчик для обнаружения проблемы, и оказалось, что он использует функцию cv::threshold.

Я изменил его и вместо этого использовал cv::Canny, но тогда у меня была такая же проблема с cv::findContours!

Странно то, что когда я вызывал кнопку «MainWindow :: on_pushButton_clicked()» в конструкторе окон, это сработало !!!

вот выход отладчик:

 
0 cv::thresh_8u(cv::Mat const&, cv::Mat&, unsigned char, unsigned char, int) C:\OpenCV2.4\OpenMinGw\install\bin\libopencv_imgproc240.dll 0 0x62b2c624 
1 cv::_InputArray::getMat(int) const C:\OpenCV2.4\OpenMinGw\install\bin\libopencv_core240.dll 0 0x65c1a838 
2 ??  0 0x00000000 

и вот функция, где я получаю ошибку (которую я получил от OpenCV учебники):

void MainWindow::on_pushButton_clicked(){ 

    Mat src; Mat src_gray; 
    int thresh = 100; 
    RNG rng(12345); 
    Mat canny_output; 

    vector<vector<Point> > contours; 

    /// Load source image and convert it to gray 
    src = imread("hat-10.bmp", 1); 

    cvtColor(src, src_gray, CV_BGR2GRAY); 
    blur(src_gray, src_gray, Size(3,3)); 

    /// Detect edges using canny 
    Canny(src_gray, canny_output, thresh, thresh*2, 3); 
    qDebug("Ok 1"); 

    /// Find contours 
    if(cv::sum(src_gray).val[0] > 0.0){ 

     qDebug("Ok 2"); 
     cv::findContours(src_gray, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); 
     /// Draw contours 
     Mat drawing = Mat::zeros(src_gray.size(), CV_8UC3); 
     for(int i = 0; i< contours.size(); i++) 
     { 
      Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
      drawContours(drawing, contours, i, color, 2);//, 8, hierarchy, 0, Point()); 
     } 
     /// Show in a window 
     imshow("Contours", drawing); 

    } 

Использование:

  • для Windows 7 x64

  • OpenCV 2.4.0 составлен с использованием MinGW 4.1.0

  • Qt Creator 2.0.0 на основе Qt 4.7.0 (32 бит)

Edit:

вот более короткая версия моего кода:

void MainWindow::on_toolButton_clicked(){ 
std::vector<std::vector<cv::Point> > contours; 

/// Load source image and convert it to gray 
Mat src = imread("C:/Users/poste/L3 ISIL/PFE Licence/new bmp/hat-10.bmp", 1); 
// my image is already a binary one 
Mat canny_output(src.size(), src.type()); 

Canny(src,canny_output,100,200,3); 

imshow("Source", canny_output); // here image is displayed before crash 
waitKey(500); 

/// Find contours 
findContours(canny_output, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); 

} 

в режиме консоли, нет проблем. при вызове из конструктора приложений GUI также нет проблем. Это только сбой при нажатии на кнопку.

редактировать: Я взял скриншот [здесь] http://i.stack.imgur.com/1LyeF.png canny_output отображалось, что означает изображение было загружено!.

загруженного проект here

ответ

0

Я использовал функцию QtConcurrent :: Run() и все начали работать. Хотя это не постоянное (и не хорошее) решение; это все, что я мог придумать.

Я все еще открыт для других ответов.

0

Сначала убедитесь, что изображение, которое вы хотите порог действительно серое масштабируются изображение. Покажите это в другом окне после Thresholding.

ли, что перед Cv :: FindContours:

cvThreshold(originalImage,resultingImage,100,100,CV_THRESH_BINARY) 

также изменить, что:

vector<vector<Point> > contours; 

to: 

vector<vector<cv::Point2f> > contours; 
+0

, когда я изменил 'cv :: Point' на' cv :: Point2f' Я получил 'Недопустимый параметр передан функции времени выполнения C.' как для 'threshold', я использовал его, а затем вернулся в Canny (начиная с это дает те же результаты) Вот вывод изображения, когда я вызываю функцию из конструктора ! [фото] (http://img11.imageshack.us/img11/5268/outputxv.png) Очевидно, что код работает. Проблема в том, почему она не работает, когда я нажимаю QButton? – Isma

+0

Пожалуйста, загрузите образец проекта, который я буду тестировать. –

+0

Сообщение отредактировано. Добавлен проект. – Isma

0

Попробуйте это:

/// Load source image and convert it to gray 
Mat src = imread("hat-10.bmp", 1); 

Mat src_gray(src.size(), CV_8U); 
cvtColor(src, src_gray, CV_BGR2GRAY); 

blur(src_gray, src_gray, Size(3,3)); 

//Apply threshold 
cv::Mat thres_output(src_gray.size(), src_gray.type()); 
cv::threshold(src_gray, thres_output, 100, 255, cv::THRESH_BINARY); 
qDebug("Ok 1"); 

OpenCV документы имеют полную демо на Basic Thresholding Operations.

EDIT:

После тщательного анализа кода и комментариев, я думаю, я знаю, что происходит: эти проблемы могут происходить из-за imread() не может получить доступ к указанному файлу. Это заставляет функцию возвращать пустой Mat. Для того, чтобы проверить, если это так, то просто сделать:

Mat src = imread("hat-10.bmp", 1); 
if (src.empty()) 
{ 
    std::cout << "!!! imread failed to open image\n"; 
    return; 
} 

Причина, почему это происходит потому, что Qt Creator строит .exe проекта в отдельной папке, поэтому при запуске приложения, он пытается загрузите изображение из каталога, в котором был запущен .exe, и он не работает, потому что изображения нет.

При вызове imread() не забудьте передать ПОЛНУЮ ПУТЬ в файл. Посмотрите, исправляет ли это проблему.

EDIT:

Помните, чтобы преобразовать изображение в двоичном перед подачей его в findContours():

// Convert from 32F to 8U 
cv::Mat binary_img; 
canny_output.convertTo(binary_img, CV_8U); 

std::vector<std::vector<cv::Point> > contours; 
cv::findContours(binary_img, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); 
+0

Я пробовал это, сработал порог, я все равно получаю те же ошибки. – Isma

+0

Я, однако, что 'cv :: threshold()' вызывал сбой, и именно это заставило вас использовать Canny. – karlphillip

+0

Да, это было причиной сбоя, но не больше (я должен был проверить свой каталог PATH) Проблема в том, что этот код отлично работает в командной строке, но сбой в графическом интерфейсе; любые идеи? – Isma

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