사진 파일을 불러와서 화면에 출력해 보자!
예시 코드
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lenna.bmp");
if (img.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
imwrite("lenna.png", img);
namedWindow("image", WINDOW_NORMAL);
imshow("image", img);
waitKey();
destroyAllWindows();
}
결과
사진이 잘 출력 된다.
하나씩 알아 보자.
참고로, OpenCV docs에서 자세하고 정확한 정보를 알 수 있다.
#include "opencv2/opencv.hpp" : OpenCV의 모든 기능을 사용할 수 있게 하는 헤더.using namespace cv; : OpenCV 클래스를 사용할 때 cv::를 생략하게 해 준다.Mat 클래스Mat클래스에 대한 자세한 내용은 여기에imread : 파일 읽기Mat cv::imread(const String& filename, int flags = IMREAD_COLOR )
filename: 불러올 영상 이름flags: 영상 파일 불러오기 옵션
Mat img = imread("lenna.bmp"); // default
Mat img = imread("lenna.bmp", IMREAD_UNCHANGED); // default
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE); // 1채널 grayscale 영상으로 읽기
Mat img = imread("lenna.bmp", IMREAD_COLOR); // 3채널 RGB 컬러 영상으로 읽기
같은 흑백 영상이라도 컴퓨터에게 1채널이냐, 3채널이냐는 명확하게 지정해 줘야 한다.
imread("lenna.bmp")와imread("lenna.bmp", IMREAD_GRAYSCALE)의 차이
원본이 컬러 사진이어도, 옵션에IMREAD_GRAYSCALE를 넣으면 흑백으로 출력된다.
empty : 비어있는 Mat객체 확인bool cv::Mat::empty() const
흔히 사용되는 empty함수이다.
if (img.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
이미지를 처리하기 전에, 잘 저장 됐는지 확인하는 코드를 설정해주면 좋다.(권장)
imwrite : 영상 파일을 저장함수 원형
bool cv::imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());filename : 저장할 영상 파일 이름. 이름에 포함된 확장자(
jpg,png등)를 인식해 그에 맞는 파일 형식으로 저장
img : 저장할 영상 데이터(Mat객체)
params : 파일 저장 옵션 ex){IMWRITE_JPEG_QUALITY, 90}:JPG압축율 90%
사용 예시
// ...
Mat img = imread("lenna.bmp");
// ...
imwrite("lenna.png", img);
// ...
실행 사진
lenna.bmp를lenna.png로 저장하였다.
imshow : 영상 출력함수 원형
void cv::imshow(const String& winname, InputArray mat);
winname: 영상을 출력할 창 이름
mat: 영상 데이터
사용 예시
Mat img = imread("lenna.bmp");
// ...
//namedWindow("window"); // imshow만 사용해도 자동으로 WINDOW_AUTOSIZE속성의 창을 생성한다.
imshow("window", img);
waitKey(); // waitkey() 함수가 있어야 실제로 화면에 영상이 나타난다.
waitKey : 키보드 입력 대기함수 원형
int cv::waitKey(int delay = 0)
delay: 대기 초(ms단위).delay=0일 때는 무한히 기다림.
waitKey는 눌린 키 값이 반환되는데, 이를 통해 특정 키를 눌렸을 때 창이 꺼지도록 설정할 수 있다.
주요 키 코드는
ESC= 27
Enter= 13
Tab= 9
사용 예시
waitKey(); // 키 입력이 있을 때 까지 기다린다.
waitKey(10); // 10ms만큼 기다린다.
// esc를 눌렀을 때 종료
while(true){
if(waitKey() == 27) break;
}
namedWindow : 새 창 띄우기함수 원형
void cv::namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
winname: 창 이름
flags: 창 속성 지정
사용 예시
namedWindow("window"); // Default
namedWindow("window", WINDOW_AUTOSIZE); // 영상 크기에 맞게 자동으로 창 설정 (=Default)
namedWindow("window", WINDOW_NORMAL); // 영상 크기가 창 크기에 맞게 지정 (크기 조절 가능)
실행 사진
namedWindow("window", WINDOW_NORMAL)를 실행해 보자.
destroyWindow : 창 닫기함수 원형
void cv::destroyWindow(const String& winname); void cv::destroyAllWindows()
winname: 닫을 창 이름
사용 예시
destroyWindow("window"); // window 창 닫기
destroyAllWindows(); // 모든 창 닫기
보통 프로그램을 종료할 때 destroyAllWindows()로 창을 종료한다.
moveWindow : 함수설명함수 원형
void cv::moveWindow(const String& winname, int x, int y)
winname: 움직일 창 이름
x: 이동할 위치 x 좌표
y: 이동할 위치 y 좌표
사용 예시
namedWindow("window");
moveWindow("window", 0, 0); //내 컴퓨터 기준 (0, 0)좌표에 창이 생성된다.
resizewindow : 창 크기 지정함수 원형
void cv::resizeWindow(const String& winname, int width, int height);
winname: 크기를 지정할 창 이름
width: 가로 크기
height: 세로 크기
참고! WINDOW_NORMAL속성 창만 동작한다.
사용 예시
namedWindow("window", WINDOW_NORMAL); // resizeWindow 사용시에는 꼭 WINDOW_NORMAL
resizeWindow("window", 1920, 1080); // 1920x1080 크기로 변경된다.
영상을 출력하면,
출력은 잘 됐지만, 뭔가 많이 나온다.
오류는 아니지만, 미관상 안 좋으니 솔루션 구성을 Debug -> Release로 바꿔주면 저런 로그 메시지가 없어진다고 한다.
본인의 IDE에 따라 잘 설정해 봅시다.
결과
깔끔해 졌다.
VideoCapture cap;
cap.open(0); // 0번 카메라 연결
cap.open("video.mp4");
// ...
cap.release(); // 카메라 닫아 주기
destroyAllWindows(); // 모든 창 닫기
VideoCapture cap;
cap.open("video.mp4"); // video.mp4 파일 연결
// ...
destroyAllWindows(); // 모든 창 닫기
Canny(frame, edge, 50, 150);
영상에 Edge만 표시할 수 있다.
cap.set(CAP_PROP_FRAME_WIDTH, 1280);
cap.set(CAP_PROP_FRAME_HEIGHT, 720);
영상의 크기를 1280x720으로 변환.
int fourcc = VideoWriter::fourcc('X', 'V', 'I', 'D'); //코덱 설정
double fps = 30;
Size sz((int)cap.get(CAP_PROP_FRAME_WIDTH), (int)cap.get(CAP_PROP_FRAME_HEIGHT));
VideoWriter output("output.avi", fourcc, fps, sz);