오늘은 Opencv를 이용하여 폴더 내 jpg, bmp 형식의 모든 이미지를 읽어 처리하는 방법을 알려드리려 합니다.

 

조금이라도 Opencv 사용해보신 분이라면 한 가지의 이미지를 읽어들이는 방법에 대해 아실겁니다.

 

바로 imread() 함수를 이용해서죠.

 

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


int main()
{
	Mat img = imread("D:\\test\\building.jpg");
	Mat gray;

	// RGB -> Gray
	cvtColor(img, gray, CV_RGB2GRAY);

	imshow("Original", img);
	imshow("Grayscale", gray);

	waitKey(0);
}

 

한 개의 이미지를 읽어 Grayscale 처리를 한 결과

 

 

 

그렇다면 한 가지가 아닌 여러 개의 이미지를 불러오기 위해선 어떻게 해야 될까요?

 

물론 모든 이미지의 경로를 직접 작성해주셔도 되지만 이 방법이 좋은 방법이라고는 생각들지 않죠...

 

그래서 폴더 내 모든 이미지를 찾을 수 있는 glob() 함수에 대한 간단한 소개와 사용 예시를 알려드리려 합니다.

 

glob() 함수는 폴더 내 파일 목록을 가져오는 재귀 함수입니다.

 

아래 코드는 glob() 함수를 이용하여 폴더 내 jpg 확장자 이미지를 모두 읽은 후 Grayscale 적용해 

 

이미지를 저장하는 코드입니다.

 

* 본 코드는 Opencv 3.1.0 Version에서 사용하였습니다.

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


int main()
{
	Mat img;
	Mat gray;
	Mat p_img;
	Mat p_gray;

	String path("D:\\test\\*.jpg"); // *.jpg
	  	 		        // jpg 확장자 파일만 읽음


	vector<String> str; 

	// 이미지 저장을 위한 변수
	int index = 0;
	char buf[256];

	glob(path, str, false); // 파일 목록을 가져오는 glob 함수
                                // glob(찾을 파일 경로, 찾은 파일 경로, recusive(true or false)
                                // true : 폴더 내 하위 폴더 속 까지 파일을 찾음
                                // false : 폴더 내 파일을 찾음

	cout << "로드 개수 : " << str.size() << endl;
	if (str.size() == 0)
		cout << "이미지가 존재하지 않습니다.\n" << endl;

	for (int cnt = 0; cnt < str.size(); cnt++) 
	{
		p_img = imread(str[cnt]);
		cvtColor(p_img, p_gray, CV_RGB2GRAY);

		// Grayscale 처리된 이미지 저장
		sprintf(buf, "D:\\test2\\%d.jpg", index);
		imwrite(buf, p_gray); // imwrite(저장할 경로 및 파일 이름, Mat 형식)
		index++; // 파일 이름의 인덱스 증가

		printf("%d 번째 이미지 전처리를 완료. \n", cnt+1);
	}
	cout << "\n" << endl;
}

콘솔 창 결과

 

폴더 내 jpg 파일

 

처리된 이미지

 

 

 

 

< 정리글 >

 

오늘은 폴더 내 파일 목록을 가져오는 glob() 함수를 사용해보았습니다.

 

영상이 아닌 수 많은 사진들을 처리하는 경우는 드물다고 생각합니다. 

 

저 같은 경우엔 인공지능 모델에서 데이터셋을 구축하기 위해 이미지를 수집하다보면 파일 이름의 형식이 제 각각이라

 

이를 정리하거나 또는 데이터셋 자체를 전처리를 시키는데 사용했습니다.

 

누군가에게 도움이 되었으면 합니다. 

 

+ Recent posts