2011-11-20 4 views
0
#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); 


    } 

안녕하세요. 위의 코드에서 여러 이미지를로드하는 방법은 무엇입니까? 이 코드는 하나의 이미지 만로드하고 처리하기 때문에 온라인에서 몇 가지 지침을 간신히 이해할 수 있습니다. 나는 미안하다. 나는 초보자 다. 또한 처리 후 코드에 대해 묻고 싶습니다. 새 파일과 처리 된 이미지를 해당 파일 이름을 가진 다른 폴더에 어떻게 저장할 수 있습니까? 감사.여러 이미지로드 및 처리

답변

0

당신은 추가 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를 처음 접하는 초보자라면 this book을 권하고 싶습니다 : 새로운 C++ 인터페이스가 아닌 이전 C 인터페이스 만 처리하면 라이브러리에 대한 이해가 향상됩니다.

+0

나는 당신의 지시를 쉽게 얻지 못한다, 미안. 특정 파일에서 문자열을 읽는 방법은 어떻습니까? – cmsl

+0

그들에 대해? – misha

+0

필자는 텍스트 파일에 모든 파일 이름을 저장하고 모든 파일을 읽음으로써 프로그램이 필요한 이미지를 찾을 수 있도록했습니다. 다음을 포함하는 텍스트 문서처럼 : 00000.jpg 00001.jpg 00002.jpg 등. 이 텍스트 문서를 읽고 나면 이미지가로드됩니다. 그러나, 그것을 구현하는 방법을 모르겠습니다. – cmsl