-
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 도움말
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