Code/C++

[OpenCV C++] 이미지 저장하고 불러오기 , 창닫기 (CV 함수 설명 - 1)

capaca 2023. 4. 20. 00:48

2023.04.20 - [Code/C++] - [OpenCV C++] 이미지 불러오고 저장하기 (CMakeLists, Command args 연결, Clion)

영상 불러와서 출력

#include <iostream>
#include "opencv2/opencv.hpp"

int main()
{
    cv::Mat src = cv::imread("../examples/lenna.bmp",  cv::IMREAD_GRAYSCALE); 

    if (src.empty()) {
        std::cerr << "Image laod failed!" << std::endl;
        return -1;
    }

    cv::Mat dst = 255 - src;
        cv::imwrite("lenna.png", dst);

        //cv::nameWindow("src", WINDOW_NORMAL);
    cv::imshow("src", src);
    cv::imshow("dst", dst);
    cv::waitKey()
}
  • 영상 파일 불러오기

      cv::Mat = cv::imread(const String& filename, int flags = IMREAD_COLOR);
    
      /*
      filename : 불러올 영상 파일 이름(경로+이름)
      flags : 영상파일 불러오기 옵션 플래그
          - IMREAD_UNCHANGED : 영상 속성 그대로 읽기 e,g: 투명 png -> 4채널(B,G,R,alph)
          - IMREAD_GRAYSCALE : 1채널 그레이
          - IMREAD_COLOR : 3채널 BGR 컬러
      return : cv::Mat
      */
  • 비어있는 Mat 객체 확인

      bool = cv::Mat::empty() const
      /*
      return : rows, cols, data 멤버 변수가 0이면 true 반환
      */
  • 영상파일 저장 저장옵션 flags

      bool cv::imwrite    (    const String &     filename,
                                              InputArray     img,
                                              const std::vector< int > &     params = std::vector< int >() 
                                              )
      /*
      filename : 저장영상 파일 이름, 형식별로 저장됨 알아서
      img : 저장 대상 (Mat) 
      params : 저장옵션 
          - ex ) Params 값 지정 안 해도 괜찮지만 jpg 압축율을 90%  : {IMWRITE_JPEG_QUALITY,90}
      return : 정상저장 true, 실패 false
      */
  • 새 창 띄우기

      void namedwindow(const String& winname, int flags = WINDOW_AUTOSIZE);
      /*
      winname : 창 고유 이름, 이 이름으로 창 구분
      flags : 창 속성 지정 플래그
          - WINDOW_NOMAL : 창 크기를 조절 할 수 있음
          - WINDOW_AUTOSIZE : 창의 크기를 조절할 수 없음
          -
      -> 없어도 그냥 imshow를 하게 된다면 autosize로 출력함  
      */
  • 창닫기

      void destroyWindow(const String& winname);
      void destroyAllWindows();
      /*
      winname : 닫고자하는 창 이름
      ** 일반적 프로그램 종료 시 모든 창이 자동으로 닫힘
    
      */
  • 창 위치 지정

      void moveWindow(const String& winname, int x, int y);
  • 창 크기 지정

      void resizeWindow(const String& winname, int width, int height);
      // 단 window가 WINDOW_NOMAL 속성으로 생성되어야 동작함 
  • 영상출력하기

      void imshow(const String& winname, InputArray mat);
      /*
      winname : 영상 출력 창 이름
      mat : 출력 영상 데이터 Mat 객체
    
      ** 영상출력방식
      **** 8-bit unsigned : pixel값 그대로 출력
      **** 16-bit unsigned or 32-bit integer : pixel / 255 출력
      **** 32-bit or64-bit floating-point : pixel *255 출력
      uchar , unsigned char 형태로 내보내는 것이 좋음!!! -> 8bit(1byte)의 형태로
    
      $ 참고사항
      만약 winname에 해당하는 창이 없으면 WINDOW_AUTOSIZE 속성의 창을 새로 만들고 영상을 출력
      실제로는 waitKey()함수를 호출해야 화면에 영상이 나타남
      */
    
  • 키보드 입력대기

      int waitKey(int delay = 0);
      /* 
      delay : 밀리초 단위 대기 시간, delay <= 0 이면 무한 입력 wait
      ex ) waitKey(5000); -> 5초 후 넘어감
    
      return : 눌린키값, 키가 눌리지 않으면 -1
      ** 참고사항
          - waitKey() 함수는 OpenCV 창이 하나라도 있어야 정상작동함
          - imshow() 함수 호출 후에 waitKey() 함수를 호출해야 영상이 화면에 나타남
          - 주요 특수키 코드 : ESC -> 27 , Enter -> 13 , TAB -> 9
      */
    
      // 특정키가 입력되어있을 때 멈추도록 하는 예시
      while (true) {
          if (waitKey() == ' ') //ESC
                  break;
      }