Добавление изображений с помощью opencv - PullRequest
0 голосов
/ 14 сентября 2010

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

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

Ответы [ 2 ]

1 голос
/ 14 сентября 2010

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

РЕДАКТИРОВАТЬ:

Хорошо, кажется, вы уже исправили это.Работает ли это сейчас?

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

0 голосов
/ 15 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...