본문 바로가기

IT

OpenCV로 이미지 읽기, 저장, 표시하기

OpenCV를 처음 접하는 사람이라면 이미지 처리 기초에 해당하는

이미지를 불러오고, 저장하고, 화면에 표시하는 방법부터 익히는 게 기본입니다.

 

penCV로 이미지 읽기, 저장, 표시

이미지 읽기: imread()

OpenCV에서 이미지를 불러오는 함수는 cv::imread()예요.

경로만 정확히 입력하면 간단하게 이미지 파일을 Mat 객체로 로드할 수 있어요.

파일이 없거나 잘못된 경로일 경우에는 빈 Mat 객체가 반환되므로, 항상 체크하는 습관이 필요해요.

cv::Mat img = cv::imread("sample.jpg");
if (img.empty()) {
    std::cout << "이미지를 불러올 수 없습니다!" << std::endl;
    return -1;
}

 

 

옵션으로 cv::IMREAD_COLOR, cv::IMREAD_GRAYSCALE, cv::IMREAD_UNCHANGED 등을 지정할 수 있어요.

 

이미지 화면에 표시하기: imshow()

이미지를 모니터에 띄우고 싶다면 cv::imshow()를 사용하면 돼요.

윈도우 이름과 이미지 Mat 객체를 인자로 주면 새로운 창에 이미지가 표시돼요.

cv::waitKey()를 써서 키 입력을 대기하지 않으면 창이 바로 닫히기 때문에, 보통 함께 써요.

 

cv::imshow("My Image", img);
cv::waitKey(0);  // 아무 키 입력 시까지 대기
cv::destroyAllWindows();  // 창 닫기

 

waitKey(n)에서 n을 0보다 크게 주면 n밀리초 동안만 기다리며, 영상 스트리밍에도 활용돼요.

 

이미지 저장하기: imwrite()

처리된 이미지를 파일로 저장하고 싶을 때는 cv::imwrite()를 사용하면 돼요.

파일 확장자에 따라 저장 포맷이 자동으로 결정되며, 디렉토리 경로가 올바르지 않으면 저장이 실패하니 주의해야 해요.

 

cv::imwrite("output.jpg", img);

 

파일 확장자는 .jpg, .png, .bmp 등이 있고, .png는 투명 채널도 함께 저장할 수 있어서 다양한 작업에 쓰여요.

 

여러 이미지로 슬라이드쇼 만들기 

이미지를 슬라이드쇼처럼 순차적으로 보여주려면,

이미지 파일 리스트를 미리 준비하고, 이를 루프를 돌면서 imread()로 불러오고

imshow()로 일정 시간 간격을 두고 표시하는 방식이 가장 간단하고 안정적이에요. 

 

#include <opencv2/opencv.hpp>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> imagePaths = {
        "image1.jpg", "image2.jpg", "image3.jpg"
    };

    for (const auto& path : imagePaths) {
        cv::Mat img = cv::imread(path);
        if (img.empty()) {
            std::cout << "불러오기 실패: " << path << std::endl;
            continue;
        }

        cv::imshow("Slideshow", img);
        int key = cv::waitKey(2000);  // 2초 대기 (2000ms)
        if (key == 27) break;         // ESC 키 누르면 종료
    }

    cv::destroyAllWindows();
    return 0;
}

 

이 예제에서는 3장의 이미지를 2초 간격으로 순차적으로 보여주고, 사용자가 ESC 키를 누르면 즉시 종료돼요.

 

  • 이미지 경로를 하드코딩하는 대신, 디렉토리 내 파일명을 자동으로 불러오는 코드를 추가하면 확장성 있는 슬라이드쇼가 돼요.
  • waitKey() 대신 타이머 기반 GUI 처리도 가능하지만, OpenCV에서는 이 방식이 가장 간단하고 직관적이에요.
  • cv::resize()를 함께 사용하면 해상도가 다른 이미지를 일관된 크기로 조정해서 보기 좋게 만들 수 있어요.

자주 겪는 문제와 팁

이미지를 불러올 때 경로 오류가 많아요.

특히 한글 경로나 공백이 들어간 경로는 문제를 일으킬 수 있으니 주의해야 해요.

 

또, imshow()는 GUI 환경이 필요한 함수라서 서버나 콘솔 기반 환경에서는 작동하지 않을 수도 있어요.

이런 경우 imwrite()로 저장한 다음 결과를 직접 확인하는 방식으로 우회하면 돼요.

 

 

마지막으로 이미지 파일을 반복 처리할 땐

imread()와 imwrite()를 루프 안에서 적절히 사용하는 구조로 만들어야 성능과 안정성 모두 챙길 수 있어요.

 

이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~

OpenCV로 이미지 읽기, 저장, 표시하기.mp3
3.59MB