ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OpenCV 기초 및 편하게 사용하기
    OpenCV/OpenCV_C++ 2023. 11. 26. 17:33

    이번에 OpenCV C++에서 가장 기본적으로 사용되는 함수들을 정리해보려고 한다.

    일반적으로 사진을 출력하는 프로그램은 다음과 같다.

    #include <iostream>
    #include "opencv2/opencv.hpp"
    
    int main() {
    	cv::Mat img = cv::imread("images/lenna.bmp"); // lenna.bmp 이미지를 변수 img에 저장.
    	if (img.empty()) {
    		std::cerr << "Image load failed!" << std::endl; // 이미지 불러오기 실패시 에러 메시지 출력
    		return -1;
    	}
    	cv::namedWindow("Image", cv::WINDOW_NORMAL); //영상 크기를 창크기에 맞게 지정
    	cv::imshow("Image", img); // 이미지 출력
    	cv::waitKey();
    	cv::destroyAllWindows(); // 키보드 입력이 있을때까지 프로그램 대기.
    
    	return 0;
    }

     

    - 주요 함수 

    영상 파일 불러오기, imread()

    cv::Mat imread(const String& filename, int flags = IMREAD_COLOR);
    • filename: 불러올 영상 및 이미지 파일 경로 및 이름을 입력. (e.g.) "lenna.bmp", "images/lenna.bmp".
    • flags: 영상 파일 불러오기 옵션 플래그.
    IMREAD_UNCHANGED 영상 속성 그대로 읽기. (e.g.) 투명한 PNG 파일 → 4채널(B, G, R, α)영상 (α는 투명도)
    IMREAD_GRAYSCALE 1채널 Gray scale 영상으로 읽기
    IMREAD_COLOR 3채널 BGR 컬러 영상으로 읽기
    • return: 불러온 영상 데이터(Mat 객체).

     

    비어 있는 Mat 객체 확인, Mat::empty()

    bool Mat::empty() const
    • return: rows, cols, data 멤버 변수가 0이면 true를 반환.

     

    영상 파일 저장하기, imwrite()

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

     

    새 창 띄우기 namedWindow()

    void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
    • winname: 창 이름.
    • flags: 창 속성 지정 플래그.
    WINDOW_NORMAL 영상 크기가 창 크기에 맞게 지정
    WINDOW_AUTOSIZE 창 크기가 영상 크기에 맞게 자동으로 변경
    WINDOW_OPENGL OpenGL 지원

     

    창 닫기 destroyWindow() & destroyAllWindows()

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

     

    창 위치 지정 moveWindow()

    moveWindow(const String& winname, int x, int y);

    모니터에 출력되는 창의 위치를 지정.

    모니터의 좌 상단이 0, 0 기준으로 모니터에 출력.

    • winname: 창 이름.
    • x, y: 이동할 위치 좌표.

     

    창 크기 지정  resizeWindow()

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

     

    영상 출력하기 imshow()

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

     

    키보드 입력 대기 waitKey()

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

    ex) ESC가 눌리기 전까지 계속 창을 호출하는 코드.

    #include <iostream>
    #include "opencv2/opencv.hpp"
    
    int main() {
    	cv::Mat img = cv::imread("images/lenna.bmp");
    	if (img.empty()) {
    		std::cerr << "Image load failed!" << std::endl;
    		return -1;
    	}
    	cv::namedWindow("Image", cv::WINDOW_NORMAL);
    	cv::imshow("Image", img);
    	cv::moveWindow("Image", 300, 300);
    	cv::resizeWindow("Image", 250, 250);
    
    	while (true) {
    		if (cv::waitKey() == 27) {
    			break;
    		}
    	}
    
    	cv::destroyAllWindows();
    	return 0;
    }

     

    OpenCV API 도움말

    https://docs.opencv.org/

     

    OpenCV documentation index

     

    docs.opencv.org

     

     

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

    이번에는 이미지 형식 변환 프로그램을 한번 작성해보자.

    입력은 argv로 받을 수 있게 하였다.

    #include <iostream>
    #include <sstream>
    #include "opencv2/opencv.hpp"
    
    int main(int argc, char* argv[]) {
    	if (argc < 3) {
    		std::cout << "Usage: HelloCV.exe <src_img> <dst_img>" << std::endl;
    		return 0;
    	}
    	std::string input_str = argv[1];
    	std::string output_str = argv[2];
    
    	cv::Mat img = cv::imread(input_str);
    	cv::Mat dst;
    	
    	cv::imwrite(output_str, img, dst);
    
    	return 0;
    }

    cmd창에서 실행 예시: HelloCV.exe ..\..\images\lenna.bmp ..\..\images\lenna.png

    실행파일의 경로로 이동하여 실행하면 된다.

     


    OpenCV 편하게 사용하기

    - Image Watch 확장 프로그램

    • Image Watch는 OpenCV Mat 데이터를 이미지 형태로 보여주는 Visual Studio 확장 프로그램이다.
    • OpenCV 프로그램 디버깅 시 유용하다.

    - Image Watch 설치

    • Visual Studio 2022 메뉴에서 [확장] → [확장 관리]를 선택한다.

    • 우측 상단 검색창에 "opencv"를 입력한다.
    • Image Watch for Visual Studio 2022 항목에서 [다운로드] 클릭한다.

    • Visual Studio 재시작.
    • 재시작시 나오는 창에서 Modify클릭

     

    - Image Watch 사용법

    • 실행 파일에서 중단점(F9) 설정 후 디버깅 시작(F5)
    • [보기] [다른 창] [Image Watch] 메뉴 선택
    • Image Watch 창에서 Mat 형식의 변수를 이미지 형태로 확인 가능하다.
    • 확대/축소 및 픽셀 값 확인이 가능하다.

    OpenCV 프로젝트 템플릿 만들기

    - Project template?

    • 프로젝트 속성, 기본 소스 코드등 미리 설정된 프로젝트를 자동으로 생성하는 기능
    • Visual Studio의 템플릿 내보내기 마법사를 통하여 ZIP 파일로 패키징된 자신만의 템플릿 파일을 생성할 수 있다.

    이번에는 OpenCV 개발을 위한 추가 포함 디렉토리 및 추가 라이브러리, 추가 종속성 등이 미리 설정된 콘솔 응용 프로그램 프로젝트를 생성하고자 한다.

    기존에 HelloCV 프로젝트를 기반으로 프로젝트 템플릿을 생성해보자.

    - Project template 생성

    • [프로젝트] → [템플릿내보내기]

    • 프로젝트 템플릿 선택 및 설정

     

    템플릿을 생성하게 되면 우리가 새로운 프로젝트 생성시 다음과 같이 프로젝트를 볼 수 있다.

     

    'OpenCV > OpenCV_C++' 카테고리의 다른 글

    OpenCV 유용한 함수  (2) 2023.12.21
    OpenCV Draw & Event  (0) 2023.12.14
    OpenCV VideoCapture class  (0) 2023.12.13
    OpenCV Mat class 기초 사용법  (0) 2023.12.12
    OpenCV 주요 클래스  (1) 2023.11.27
Designed by Tistory.