2015-03-29 2 views
0

У меня есть приложение gui, содержащее две основные кнопки, первое помогает пользователю выбрать 10 изображений и сохранить их в массиве Mat. Вторая кнопка предназначена для вычитания фона и рисования ограничивающего прямоугольника. программа работает нормально, когда я запускаю ее в первый раз. но когда я снова нажимаю на первую кнопку и выбираю другие изображения и пытаюсь обрабатывать их со второй кнопкой, иногда она работает нормально, но иногда моя программа прерывается необычным способом без сообщения об ошибке на консоли (только это: вышло с код 255.). Вот мой код:Моя программа Qt C++ заканчивается необычным способом

void Principale::chooseImages_clicked() 
{ 
    QFileDialog* _f_dlg = new QFileDialog(this); 
    _f_dlg->setFileMode(QFileDialog::ExistingFiles); 
    _f_dlg->setOption(QFileDialog::DontUseNativeDialog, true); 

    QListView *l = _f_dlg->findChild<QListView*>("listView"); 
    if (l) { 
    l->setSelectionMode(QAbstractItemView::MultiSelection); 
    } 
    QTreeView *t = _f_dlg->findChild<QTreeView*>(); 
    if (t) { 
    t->setSelectionMode(QAbstractItemView::MultiSelection); 
    } 

    _f_dlg->exec(); 
    _fnames = _f_dlg->selectedFiles(); 
    if(_fnames.size()!=10) 
     QMessageBox::information(this, "Error!","choose 10 images!"); 

    else 
    { 
     image_choosed=true; 
     for(int i=0;i<10;i++) 
      Tab_IMG[i]=imread(_fnames.at(i).toStdString(),CV_16UC1); 

     Entree entree; 
     entree.setModal(true); 
     entree.exec(); 
    } 

void Principale::on_processing_clicked() 
{ 
    if(!image_choosed) 
     QMessageBox::information(this, "error!","choose 10 images!"); 
    else 
    { 
     chut=0; 
     Mat BG; double moyenne=0; 
     char chaine[20]="";int j=1; 
     //Mat Subs; 
     Vec3b couleur_dst,couleur_FG,couleur_sortie; 
     for(int i=1;i<10;i++) 
     { 
      BG=imread(_fnames.first().toStdString(),CV_16UC1); 


// background substraction 

       Mat Subs(480, 640, CV_16UC1); 
       absdiff(Tab_IMG[i],BG,Subs); 
       BG.convertTo(BG,CV_8UC1,1.0/255.0); 
       Tab_IMG[i].convertTo(Tab_IMG[i],CV_8UC1,1.0/255.0); 
       Subs.convertTo(Subs,CV_8UC1); 
       threshold(Subs,Subs,25, 255,THRESH_BINARY); 
       Mat ones(3,3,CV_8UC1); 
       morphologyEx(Subs,Subs,MORPH_OPEN,ones,Point(1,-1),1); // try 2 instead of 1 
       erode(Subs,Subs,ones,Point(1,-1),1); 

//--------------------- bounding rectangle 


      Rect bounding_rect; 
      int largest_area=0; 
      int largest_contour_index=0; 
      Mat dst(Subs.rows,Subs.cols,CV_8UC1,Scalar::all(0)); 
      Mat thr=Subs; 
      vector<vector<Point> > contours; 
      vector<Vec4i> hierarchy; 
      findContours(thr, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); 
      for(int k = 0; k< contours.size(); k++) 
      { 
       double a=contourArea(contours[k],false); 
       if(a>largest_area) 
       { 
        largest_area=a; 
        largest_contour_index=k; 
        bounding_rect=boundingRect(contours[k]); 
       } 
      } 

      Scalar color(255,255,255); 
      drawContours(dst, contours,largest_contour_index, color, CV_FILLED, 8, hierarchy); 
      rectangle(dst, bounding_rect,Scalar(255,0,0),2, 8,0); 
      int compteur=0; double moyenne=0; int seuille=255; double depth; 
      Mat sortie(Tab_IMG[i].rows,Tab_IMG[i].cols,CV_8UC1); 
      sortie.setTo(0); 
      Vec3b couleur_dst,couleur_FG,couleur_sortie; 
      for(int x=0;x<dst.cols;x++) 
      { 
       for(int y=0;y<dst.rows;y++) 
       { 
        couleur_dst= dst.at<Vec3b>(Point(x,y)); 
        couleur_FG=Tab_IMG[i].at<Vec3b>(Point(x,y)); 
        if((couleur_dst.val[0]==255)&&(couleur_dst.val[1]==255)&&(couleur_dst.val[2]==255)) 
        { 
         sortie.at<Vec3b>(Point(x,y)) = couleur_FG; 
         seuille=couleur_FG.val[0]; 
         depth=(3640*couleur_FG.val[0])/255; 
         moyenne+=depth; 
         compteur++; 
        } 
       } 
      } 
      moyenne=moyenne/compteur; 
      Tab_dist[i]=moyenne; 
      Tab_silh[i]=sortie; 
      Tab_rect[i]=bounding_rect; 
      Tab_surf[i]=bounding_rect.width*bounding_rect.height; 
      if(i==1) 
        surf_one=Tab_surf[i]; 
      else 
        moy_dif_surf+=Tab_surf[i]-surf_one; 
      Tab_rect[i]=bounding_rect; 

     Tab_silh[0]=imread("C:\\Users\\Eden\\Desktop\\Images\\noire.png",CV_16UC1); 
     /*Sortie sortie; 
     sortie.setModal(true); 
     sortie.exec();*/ 
    } 
} 

} 
+0

Проблема не в вычитании фона, потому что я попытался удалить код под ним, и программа отлично работает независимо от того, сколько раз я нажимаю на две кнопки, я думаю, что проблема заключается в ограничивающем прямоугольном коде. помогите мне обнаружить это :) –

+0

Вы уверены, что compteur в moyenne = moyenne/compteur is> 0? – Greenflow

+4

вы действительно должны использовать отладчик. Qt-Creator имеет один встроенный. Вы можете открыть свой профайл в создателе и использовать кнопку запуска отладки, чтобы получить представление о том, почему ваша программа завершает – aep

ответ

0

(Answer moved from comments to a community wiki.)

ОП писало:

Проблема заключается в этой инструкции sortie.at<Vec3b>(Point(x,y)) = couleur_FG;, точно, когда я пытаюсь получить доступ к пикселям, как Vec3b тем, что является неверно, потому что изображение определяется как одноканальное изображение. Решение состоит в использовании uchar вместо Vec3b.

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