Загрузка и обработка нескольких изображений - PullRequest
0 голосов
/ 20 ноября 2011
    #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 голосов
/ 20 ноября 2011

Вы обрабатываете несколько изображений, объявляя дополнительные объекты IplImage и загружая их из файла:

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

или создавая их самостоятельно:

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

Если вам нужно сделать то же самоедля нескольких изображений, то разумнее всего написать функцию, которая принимает IplImage * в качестве ввода и возвращает вновь созданный IplImage * в качестве вывода.Обратите внимание, что это вновь созданное изображение должно быть освобождено с помощью cvRelease вызывающей функцией.

В качестве альтернативы, если вы обрабатываете изображения независимо друг от друга, то кодируйте свой исполняемый файл для обработки одного изображения и зацикливайте изображения в командной оболочке (bash или эквивалентной).

Вы сохраняете изображения, используя функцию cvSaveImage.Обработка манипуляций с именами путей выходит за рамки библиотеки - вы обязаны указать путь к выходному изображению.В C вы можете сделать это, используя манипуляции с массивами символов.В C ++ у вас есть библиотеки, такие как boost , чтобы помочь вам в этом.Если вы воспользуетесь альтернативой, которую я упомянул выше, то вы можете использовать функциональность манипуляции путём вашей оболочки (например, bash ).

Если вы новичок в OpenCV, то я бы рекомендуем эту книгу : хотя он обрабатывает только старый интерфейс C (но не новый C ++), он улучшит ваше понимание библиотеки.

...