2010-09-14 6 views
-2

Я пытаюсь добавить несколько изображений, используя opencv. Я думаю, что мой исходный код должен быть правильным, и он компилируется без каких-либо проблем. Но когда я запускаю программу, в for-loop возникает ошибка. Проблема в том, что я не понимаю, почему это происходит.Добавление изображений с использованием opencv

#include <iostream> 
    #include <sys/types.h> 
    #include <dirent.h> 
    #include <errno.h> 
    #include <vector> 
    #include <string> 
    #include <fstream> 

    #include <cv.h> 
    #include <highgui.h> 

using namespace std; 


int get_files(string dir, 
       vector<string> &files); 



int main(int argc, char** argv){ 

    //---------- Get the names of all *.png files in the directory 
    string directory = string("."); 
    vector<string> files = vector<string>(); 

    get_files(directory,files); 


    //---------- Erase all filenames that aren't *.png files 
    vector<string> files_format = vector<string>(); 

    for (unsigned int ii = 0; ii < files.size(); ii++) { 

     files_format.push_back(files[ii]); 

     string::iterator it; 
     string format; 
     files_format[ii].erase(0,files_format[ii].length()-3); 

     if (files_format[ii] != "png") files.erase(files.begin() + ii); 

    } 

    files.erase(files.begin()); // in order to remove the ".." in the beginning 

    int number_of_files = files.size(); 



    //---------- Create the necessary images 

    if (files.size() == 0) 
     return -1; 

    IplImage* img_firstimage = cvLoadImage(files[0].c_str()); 

    IplImage* img_totalsum = cvCreateImage(cvGetSize(img_firstimage), 8, 1); 
    cvCvtColor(img_firstimage, img_totalsum, CV_BGR2GRAY); 


    //---------- Apply threshold 
    cvThreshold(img_totalsum, img_totalsum, 150, 1, 1); 


    //---------- Add all the images 
    for (unsigned int ii=1; ii < files.size(); ii++){ 

     IplImage* img_load = cvLoadImage(files[ii].c_str()); 
     IplImage* img_add = cvCreateImage(cvGetSize(img_load), 8, 1); 

     cvCvtColor(img_load, img_add, CV_BGR2GRAY); 

     cvThreshold(img_add, img_add, 150, 1, 1); 

     //----- add the image to the total sum ----- 
     cvAdd(img_totalsum, img_add, img_totalsum); 

     // ----- release images ----- 
     cvReleaseImage(&img_load); 
     cvReleaseImage(&img_add); 
    } 


    //---------- Invert the total sum image 
    // -> dense regions are plotted in black 
    //cvNot(img_totalsum, img_totalsum); 

    cvNot(img_firstimage, img_firstimage); 

    //---------- Show the images 
    cvShowImage("Density Distribution", img_totalsum); 
    cvShowImage("Negative", img_firstimage); 

    cvWaitKey(0); 


    // ----- release images ----- 
    cvReleaseImage(&img_firstimage); 
    cvReleaseImage(&img_totalsum); 

    return 0; 
} 

    int get_files(string dir, 
      vector<string> &files){ 
DIR *dp; 
struct dirent *dirp; 
if((dp = opendir(dir.c_str())) == NULL) { 
     cout << "Error(" << errno << ") opening " << dir << endl; 
     return errno; 
    } 

    while ((dirp = readdir(dp)) != NULL) { 
     files.push_back(string(dirp->d_name)); 
    } 
    closedir(dp); 
    return 0; 
+1

Что именно представляет собой «ошибку»? – genpfault

+0

При запуске программы он внезапно останавливается и вызывает отладчик. – supergranu

+0

А где именно программа останавливается? Отладчик обычно останавливается в позиции ошибки. –

ответ

0

Я решил проблему. У меня были другие файлы в рабочем каталоге, которые не были * .png-файлами, а затем цикл не работал. Абсолютно ясно, что программа не могла загружать другие файлы и работать с ними ... Я просто не понимаю, почему часть программы не работает, которая должна позаботиться об этой проблеме ... Как-то if (files_format[ii] != "png") files.erase(files.begin() + ii); didn Правильно ли работает

1

Кажется, вы отпустите img_add в каждой итерации цикла, но создается только один раз. Переместите команду cvReleaseImage(&img_add); снаружи (непосредственно под) вашего цикла for. Это должно исправить это.

EDIT:

Хорошо, кажется, вы зафиксировали, что уже. Он работает сейчас?

Btw, создавая и освобождая img_add внутри вашего цикла for для каждого загруженного изображения, не является необходимым и, возможно, медленнее из-за множественного распределения памяти и освобождения. Вы должны лучше выделить его для входа в цикл и освободить его после цикла.

+0

Я изменил исходный код следующим образом, но он тоже не работает: я поместил IplImage * img_add = cvCreateImage (cvGetSize (img_firstimage), 8, 1); перед циклом и выдает изображение непосредственно после цикла. – supergranu

+0

@supergranu: Он падает в том же положении? Не могли бы вы добавить измененный код на свой вопрос? –

+0

Да, он падает в том же положении. - Я проверил проблему с другой небольшой программой. Кажется, что проблема с распределением памяти в целом. – supergranu

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