[2023-04-18] 1. OpenCV 영상 불러와서 출력하기
OpenCV 영상 불러와서 출력하기
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std; // 원래는 std::cerr 이런식으로 앞에 작성해야하는데 생략 가능하게 함
using namespace cv; // 원래는 cv::Mat, cv::imread, cv::namedWindow 이런식으로 앞에 작성해야하는데 생략 가능하게 함
int main()
{
Mat img = imread("lenna.bmp"); // Mat : 행렬(Matrix)를 표현하는 class
if (img.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
namedWindow("image");
imshow("image", img);
waitKey();
destroyAllWindows();
}
OpenCV 주요 함수 설명
영상 파일을 불러오기
Mat imread(const String& filename, int flags = IMREAD_COLOR);
-
filename : 불러올 영상 파일 이름
e.g. “lenna.bmp” , “C:\\lena.bmp”
- flags : 영상 파일 불러오기 옵션 플래그
- IMREAD_UNCHANGED : 영상 속성 그대로 읽기
- IMREAD_GRAYSCALE : 1채널 그레이스케일 영상으로 읽기
- IMREAD_COLOR : 3채널 BGR 컬러 영상으로 읽기
- 반환값 : 불러온 영상 데이터 (MAT 객체)
Mat img = imread("lenna.bmp");
코드는 img 변수가 imread 함수의 반환 값을 받는 것
영상 파일 저장하기
bool imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
-
filename : 저장할 영상 파일 이름, 파일 이름에 포함된 확장자를 분석하여 해당 파일 형식으로 저장됨
-
img : 저장할 영상 데이터 (Mat 객체)
-
params : 파일 저장 옵션 지정
e.g. JPG 압축율을 90%로 지정하고 싶으면, {IMWRITE_JPEG_QUALITY,90}을 지정
-
반환값 : 정상적으로 저장하면 true를 반환하고 실패하면 false를 반환함
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE); //lenna.bmp 파일을 그레이스케일을 적용하여 img 객체에 넣고
if (img.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
imwrite("lenna.png", img); // img 객체를 lenna.png로 영상 파일 저장
namedWindow("image");
imshow("image", img);
waitKey();
destroyAllWindows();
}
영상 출력하기
void imshow(const String& winname, InputArray mat);
- winname : 영상을 출력할 대상 창 이름
-
mat : 출력할 영상 데이터 (Mat 객체)
- 영상 출력 방식
- 8-bit unsigned : 픽셀 값을 그대로 출력
- 16-bit unsigned / 32-bit integer : 픽셀 값을 255로 나눠서 출력
- 32-bit(float 타입) / 64-bit(double 타입) floating-point : 픽셀 값을 255를 곱 해서 출력
- 만약 winname에 해당하는 창이 없으면 WINDOW_AUTOSIZE 속성의 창을 새로 만들고 영상을 출력함
- 실제로 waitKey() 함수를 호출해야 imshow 함수가 실행한 영상이 화면에 나타남
키보드 입력 대기
int waitKey(int delay =0);
- delay : 밀리초 단위 대기 시간, delay가 0 이상이면 무한히 기다림
- 반환 값 : 눌린 키 값을 반환하고 키가 눌리지 않으면 -1을 반환함
- waitKey 함수는 OpenCV 창이 하나라도 있어야 정상 동작
- 주요 특수키 코드 : ESC - 77, ENTER - 13, TAB - 9
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (img.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
imwrite("lenna.png", img);
namedWindow("image", WINDOW_NORMAL);
imshow("image", img);
while (true) {
if (waitKey() == 27) // 다른 키를 누르면 반응이 없고 ESC 키를 누르게되면 break가 됨
break;
}
destroyAllWindows();
}
비어 있는 Mat 객체 확인
bool Mat::empty() const
- 반환값 : 안에 비어 있으면 True를 반환하고 비어있지 않은 경우 False를 반환
새 창 띄우기
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE)
- winname : 창 고유 이름으로 이 이름으로 창을 구분함
- flags : 창 속성 지정 플래그
- WINDOW_NORMAL : 영상 크기가 창 크기에 맞게 지정됨
- WINDOW_AUTOSIZE : 창 크기가 영상 크기에 맞춰 자동으로 변경
- WINDOW_OPENGL : OpenGL 지원
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (img.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
imwrite("lenna.png", img);
namedWindow("image", WINDOW_NORMAL); // NORMAL 에서는 창크기를 변경할 수 있지만, AutoSize는 불가능함
imshow("image", img);
waitKey();
destroyAllWindows();
}
창 닫기
void destoryWindow(const String& winname);
void destoryAllWindows() // 현재 생성되어있는 모든 OpenCV 창을 닫음
- winname : 닫으려는 창의 이름
- 일반적으로 프로그램 종료시 운영체제에 의해 열려있는 모든 창이 자동으로 닫힘
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std; // 원래는 std::cerr 이런식으로 앞에 작성해야하는데 생략 가능하게 함
using namespace cv; // 원래는 cv::Mat, cv::imread, cv::namedWindow 이런식으로 앞에 작성해야하는데 생략 가능하게 함
int main()
{
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE); // Mat : 행렬(Matrix)를 표현하는 class
if (img.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
imwrite("lenna.png", img);
namedWindow("image", WINDOW_NORMAL);
imshow("image", img);
waitKey();
// destroyAllWindows(); // 생략해도 동일한 결과가 나타남
}
창 위치 지정
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 속성으로 생성되어야 동작함
이미지 파일 형식 변환 프로그램
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;
}
}
OpenCV API 도움말 찾기
- http://docs.opencv.org/