영상파일 불러와서 출력하기

강형우·2022년 11월 29일
0

OpenCV

목록 보기
8/17

영상 파일 불러와서 출력하기

  • 영상 파일 불러와서 출력하기
    • 현재 폴더에 있는 lenna.bmp 파일을 불러와서 화면에 출력하는 OpenCV 예제 프로그램
    • 편의상 이전 강의에서 작성한 HelloCV 프로젝트에 필요한 소스 코드를 추가
    • 가장 기본적인 OpenV함수로 구성된 프로그램으로 소스 코드를 외울 수 있도록 반복 연습 필요
  • 영상 파일 불러와서 출력하기
    • 현재 폴더에 있는 lenna.bmp 파일을 불러와서 화면에 출력하는 OpenCV예제 프로그램
    • 편의상 이전 강의에서 작성한 HelloCV 프로젝트에 필요한 소스 코드를 추가
    • 가장 기본적인 OpenCV함수로 구성된 프로그램으로 소스코드를 외울 수 있도록 반복 연습 필요
#include <iostream>
// OpenCV 관련 헤더 파일을 포함
#include "opencv2/opencv.hpp"

// cv와 std 네임스페이스를 사용하도록 설정
using namespace cv;
using namespace std;
int main()
{
	//lenna.bmp파일을 불러와서 Img에 저장
	Mat img = imread("lenna.bmp")
    
    // 영상파일 불러오기가 실패하면 에러 메세지를 출력하고 프로그램을 종료
    if (img.empty());
    {
    	cerr << "Image load failed" << endl;
        return -1;
    }
    // "image"라는 이름의 새 창을 만들고,
    namedWindow("image");
    // 여기에 img 영상을 출력
    imshow("image", img);
    // 키보드 입력이 있을 때까지 프로그램을 대기
    waitKey();
    // 키 입력이 있으면 모든 창을 닫고 종료
    destroyAllWindows();
}
  • 코드 작성
  • 실행 결과

OpenCV 주요 함수 설명

  • 영상파일 불러오기

    Mat imread(const String& filename, int flags = IMREAD_COLOR);
    • filename: 불러올 영상 파일 이름(e.g)"lenna.bmp", "C:\lenna.bmp"
    • flags: 영상파일 불러오기 옵션 플래그
    • 반환값: 불러온 영상 데이터(Mat객체)
  • 비어 있는 Mat객체 확인

    bool Mat::empty() const
    • 반환값: rows, cols, data 멤버 변수가 0이면 true반환
  • 영상파일 저장하기

    bool imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
    • filename: 저장할 영상파일 이름. 파일 이름에 포함된 확장자를 분석하여 해당 파일 형식으로 저장됨.
    • img: 저장할 영상 데이터(Mat 객체)
    • params: 파일 저장 옵션 지정(속성 & 값의 정수 쌍). 예를들어, JPG 압축률을 90%로 지정하고 싶으면 {IMWRITE_JPEG_QUALITY, 90}을 지정.
    • 반환값: 정상적으로 하면 true, 실패하면 false
  • 새 창 띄우기

    void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
    • winname: 창 고유 이름. 이 이름으로 창을 구분함.
    • flags: 창 속성 지정 플래그
  • 창 닫기

    void destroyWindow(const String& winname);
     void destroyAllWindows();
    • winname: 닫고자 하는 창 이름
    • 참고사항
      • 일반적인 경우 프로그램 종료 시 운영체제에 의해 열려 있는 모든 창이 자동으로 닫힘
  • 창 위치 지정

    void moveWindow(const String& winname, int x, int y);
    • winname: 창 이름
    • x,y: 이동할 위치 좌표
  • 창 크기 지정

    void resizeWindow(const String& winname, int width, int height);
    • winname: 창 이름
    • width, height: 변경할 창 크기
    • 참고사항
      • 윈도우가 WINDOW_NORMAL 속성으로 생성되어야 동작함
  • 영상 출력하기

    void imshow(const String& winname, InputArray, mat);
    • winname: 영상을 출력할 대상 창 이름
    • mat: 출력할 영상 데이터(Mat객체)
    • 영상출력 방식:
      • 8-bit unsigned: 픽셀 값을 그대로 출력
      • 16-bit unsigned: or 32-bit integer: 픽셀 값을 255로 나눠서 출력
      • 32-bit or 64-bit floating-point: 픽셀 값에 255를 곱해서 출력
    • 참고 사항
      • 만약 winname에 해당하는 창이 없으면 WINDOW_AUTOSIZE속성의 창을 새로 만들고 영상을 출력함
      • 실제로는 waitKey() 함수를 호출해야 화면에 영상이 나타남
  • 키보드 입력 대기

      int waitKey(int delay = 0);
    • delay: 밀리초 단위 대기 시간. delay <= 0 이면 무한히 기다림.
    • 반환 값: 눌린 키 값. 키가 눌리지 않으면 -1
    • 참고 사항
      • waitKey() 함수는 OpenCV 창이 하나라도 있어야 정상 동작함
      • imshow() 함수 호출 후에 waitKey() 함수를 호출해야 영상이 화면에 나타남.
      • 주요 특수키 코드: ESC -> 27, ENTER -> 13, TAB -> 9

OpenCV API 도움말 찾기

  • OpenCV API 도움말 찾기
    • OpenCV 도움말 사이트: http://docs.opencv.org/
    • OpenCV 도움말 웹페이지에서 우측상단 검색창 활용

이미지 파일 형식 변환 프로그램

  • 이미지 파일 형식 변환 프로그램 만들기
    • 명령행인자(command line arguments)로 입력 받은 영상 파일을 다른 형식을 ㅗ변환하여 저장하는 프로그램을 작성하세요.
  • 실행 예)
  • 소스코드 구성
int main(int argc, char* argv[])
{
    // TODO: 명령행 인자 개수가 3개보다 작으면 사용법을 출력하고 종료하세요.
	if(/* 코드 입력*/)
    {
    	cout << "Usage: ocvrt.exe <src_image> <dst_image> " <<endl;
    	return 0;
    }
    // TODO: 첫 번째 이미지 파일을 imread() 함수로 읽어서 img 변수에 저장하세요.
    /* 코드 입력 */
    // TODO: 두 번째 이미지 파일이름으로 img 영상을 저장하세요.
    // 저장이 제대로 되면 ret 변수에 true를, 실패하면 false를 저장하세요.
    /* 코드 입력 */
    if (ret)
    {
    	cout << argv[1] << " is successfully saved as " << argv[2] << endl;
    }
    else
    {
    	cout<< "File save failed!" << endl;
    }
}

0개의 댓글