加载和处理多个图像

时间:2011-11-20 13:57:39

标签: image image-processing opencv

    #include "iostream"
    #include "cv.h"
    #include "highgui.h"
    #include "cvaux.h"
    #include "cxmisc.h"
    #include "math.h"

    using namespace cv;
    using namespace std;

    int main(){

    int height, width, x, y, i, minX, minY, maxX, maxY;
    char imgFileName[100];


    IplImage *origImage = cvLoadImage("data set baybayin/0000.jpg", -1);
    height = origImage->height;
    width = origImage->width;

    IplImage *grayImage = cvCreateImage(cvSize(width, height), 8, 1);
    IplImage *binImage = cvCreateImage(cvSize(width, height), 8, 1);


    //Pre-processing phase
    //image cleaning
    cvCvtColor(origImage, grayImage, CV_BGR2GRAY);
    cvDilate(grayImage, grayImage, NULL, 1);
    cvSmooth(grayImage, grayImage, CV_GAUSSIAN, 21, 21, 0, 0);
    //image binarization
    cvThreshold(grayImage, binImage, 120, 255, CV_THRESH_BINARY);
    //cvNormalize(binImage,binImage,0,1,CV_MINMAX);

    //getting image info
    minX = width;
    minY = height;
    maxX = 0;
    maxY = 0;

    //image cropping
    CvScalar s;

    //finding the boundaries
    for (x=0; x<width-1; x++){
        for(y=0; y<height-1; y++){
            //getting pixel values
            s = cvGet2D(binImage, y, x);
            //printf("%f\n", s.val[0]);
            //identifying boundaries
            if (s.val[0] == 0){
                //printf("HELLO");
                minX = min(minX, x);
                minY = min(minY, y);
                maxX = max(maxX, x);
                maxY = max(maxY, y);
                //printf("%d\n", minY);
            }   
        }
    }

    //creating rectangle
    CvRect rect = cvRect(minX, minY, maxX-minX, maxY-minY);
    //sets the part of the image to be cropped
    cvSetImageROI(binImage, rect);
    IplImage *cropImage = cvCreateImage(cvGetSize(binImage), 8, 1);
    IplImage *newImage = cvCreateImage(cvSize(400, 400), 8, 1);

    //copies cropped image to new declared image
    cvCopy(binImage, cropImage, NULL);
    //cvSaveImage("bin/binImage16.jpg", binImage);

    cvSaveImage("data set baybayin/cropImage0.jpg", cropImage);


    cvResetImageROI(binImage);
    cvReleaseImage(&origImage);
    cvReleaseImage(&binImage);
    cvReleaseImage(&grayImage);
    cvReleaseImage(&cropImage);
    cvReleaseImage(&newImage);


    }

您好,我可以问一下如何在上面的代码中加载多个图像?因为此代码仅加载和处理一个图像,我几乎无法在线了解某些指令。对不起,我是新手。我还想在处理后询问代码;如何将新的和已处理的图像保存到具有相应文件名的另一个文件夹中?感谢。

1 个答案:

答案 0 :(得分:0)

通过声明其他IplImage对象并从文件中加载它们来处理多个图像:

IplImage *anotherImage = cvLoadImage("data set baybayin/0000.jpg", -1);

或自己创建:

IplImage *grayImage = cvCreateImage(cvSize(width, height), 8, 1);

如果你需要对多个图像做同样的事情,那么明智的做法是编写一个接受IplImage *作为输入的函数,并返回一个新创建的IplImage *作为输出。请注意,调用函数必须使用cvRelease释放这个新创建的图像。

或者,如果您正在彼此独立地处理图像,则编写可执行文件以处理单个图像,并在命令行shell(bash或等效文件)中循环图像。

使用cvSaveImage功能保存图像。处理路径名操作超出了库的范围 - 您有责任提供输出图像的路径。在C中,您可以使用字符数组操作来完成此操作。在C ++中,您有像boost这样的库来帮助您。如果您使用上面提到的替代方法,那么您可以使用shell的路径操作功能(例如bash)。

如果你是OpenCV的新手,那么我建议this book:虽然它只处理旧的C接口(而不是新的C ++接口),但它会提高你对库的理解。 / p>