오늘은 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);
}
그렇다면 한 가지가 아닌 여러 개의 이미지를 불러오기 위해선 어떻게 해야 될까요?
물론 모든 이미지의 경로를 직접 작성해주셔도 되지만 이 방법이 좋은 방법이라고는 생각들지 않죠...
그래서 폴더 내 모든 이미지를 찾을 수 있는 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;
}
< 정리글 >
오늘은 폴더 내 파일 목록을 가져오는 glob() 함수를 사용해보았습니다.
영상이 아닌 수 많은 사진들을 처리하는 경우는 드물다고 생각합니다.
저 같은 경우엔 인공지능 모델에서 데이터셋을 구축하기 위해 이미지를 수집하다보면 파일 이름의 형식이 제 각각이라
이를 정리하거나 또는 데이터셋 자체를 전처리를 시키는데 사용했습니다.
누군가에게 도움이 되었으면 합니다.
'OpenCV' 카테고리의 다른 글
[Opencv] 이진화 라벨링 (0) | 2020.04.09 |
---|---|
[Opencv] 이미지 파일에 텍스트 숨기기 - 스테가노그래피 (0) | 2020.04.03 |
[Opencv] 이미지 픽셀 접근 (0) | 2020.03.29 |
[Opencv] 이미지 속 특정 영역 자르기 Range() (1) | 2020.03.29 |
[Opencv] 히스토그램을 이용한 숫자 인식 (0) | 2020.03.22 |