使用opencv添加图像

时间:2010-09-14 13:24:13

标签: c++ opencv

我正在尝试使用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 个答案:

答案 0 :(得分:1)

看来,你在每次循环迭代中释放img_add,但它只创建一次。将cvReleaseImage(&img_add);指令移到for循环的外部(直接位于其下方)。那应该解决它。

修改

好吧,好像,你已经修好了。它现在有效吗?

顺便说一句,为每个新加载的图像创建和释放img_add循环内的for不是必需的,并且可能更慢,因为多个内存分配和释放。你应该更好地分配它进入循环并在循环后释放它。

答案 1 :(得分:0)

我解决了这个问题。我在工作目录中有一些其他文件,它们不是* .png文件,然后循环不起作用。绝对清楚的是程序无法加载其他文件并与它们一起工作......我只是不明白,为什么程序的一部分不起作用应该处理这个问题......不知何故{{{ 1}}无法正常工作