Table of Contents
이미지 다루기
이미지 파일을 읽어서 화면에 보여주기
//OpenCV 헤더 파일을 인클루드합니다.
# include < opencv2/opencv.hpp> // 콘솔 기반으로 메시지를 화면에 출력 시 사용됩니다.
# include < iostream>
// 코드 작성 편이를 위해 네임스페이스를 적어줍니다.
using namespace cv;
using namespace std;
int main()
{ // 이미지를 저장할 Mat 객체를 선언합니다.
Mat img_color;
// 첫 번째 아규먼트로 지정한 파일을 컬러 포맷으로 불러옵니다.
// IMREAD_COLOR는 컬러 포맷으로 영상을 읽겠다는 의미입니다.
// Mat 객체 img_color에 이미지가 저장됩니다.
img_color = imread("cat on laptop.jpg", IMREAD_COLOR);
// 이미지를 불러올 수 없으면 img_color 객체는 빈 객체가 됩니다.
// 이미지 불러올 수 없는 경우를 체크하기 위해 사용합니다.
if (img_color.empty())
{
cout << "이미지 파일을 읽을 수 없습니다." << endl;
return -1;
}
// 이미지를 보여줄 윈도우를 생성합니다.
// 첫 번째 아규먼트로 윈도우 식별자로 사용할 문자열을 지정해줍니다.
// 지정한 문자열이 윈도우 타이틀바에 보이게 됩니다.
namedWindow("Color");
// 윈도우 식별자가 " Color"인 윈도우에 Mat 객체 img_color에 // 저장된 이미지를 보여줍니다.
//대부분의 경우 namedWindows를 생략하고 imshow만 사용해도 // 윈도우에 이미지를 보여줍니다.
imshow("Color", img_color);
// ms 단위로 지정한 시간만큼 대기합니다.
// 0이면 OpenCV로 생성한 윈도우가 선택된 상태에서 // 키보드 입력이 있을 때까지 대기합니다.
waitKey(0);
// 사용이 끝난 윈도우를 종료해줍니다. 운영체제에서 자동으로 // 처리해주기 때문에 생략 가능합니다.
destroyAllWindows();
}
읽어온 이미지를 그레이 스케일 이미지로 변환후 저장
# include < opencv2/opencv.hpp>
# include < iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img_color;
// 컬러 이미지로 파일을 읽어옵니다.
img_color = imread("cat on laptop.jpg", IMREAD_COLOR);
if (img_color.empty())
{cout << "이미지 파일을 읽을 수 없습니다." << endl;
return - 1;
}
// 컬러 이미지를 먼저 화면에 보여주고
namedWindow("Color");
imshow("Color", img_color);
// 대기하다가 키보드 입력이 있으면 다음 줄이 실행됩니다.
waitKey(0);
Mat img_gray;
// img_color에 저장된 컬러 이미지를 그레이 스케일 이미지로 변환 후 // img_gray에 저장합니다.
// COLOR_BGR2GRAY는 BGR 채널을 가진 컬러 이미지를 그레이 스케일로 // 변환하겠다고 지정해주는 겁니다.
cvtColor( img_color, img_gray, COLOR_BGR2GRAY);
// namedWindow함수는 생략할 수 있습니다.
// img_gray에 저장된 그레이 스케일 이미지를 식별자가 " Grayscale"인 // 창에 보여줍니다.
// 첫 번째 아규먼트를 앞에서 컬러 이미지 보여줄 때 사용한 " Color"를 // 사용하도록 수정하면 그레이 스케일 이미지가 " Color" 창에 보여지게 // 됩니다.
imshow("Grayscale", img_gray);
// img_gray에 저장된 이미지를 첫 번째 아규먼트로 지정한 파일로 // 저장합니다. 이미지 포맷은 지정한 파일의 확장자에 따라 결정됩니다.
imwrite("grayscale.jpg", img_gray);
// 아무 키나 누르면 프로그램이 종료됩니다.
waitKey(0);
destroyAllWindows();
}
동영상 다루기
카메라에서 캡쳐한 이미지를 화면세 보여주기
openCV 에서 동영상을 연속적인 이미지로 다루어지므로 이미지를 반복적으로 가져오는 코드를 짜면 된다.
# include < opencv2/opencv.hpp>
# include < iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img_frame;
// 2번째로 연결한 카메라의 인덱스는 1..
// 이런 식으로 PC에 카메라를 연결한 순서에 맞추어
// 카메라에 접근할 때 사용하는 인덱스가 부여됩니다.
VideoCapture cap(0);
// 카메라와 성공적으로 연결되었는지 체크합니다.
if (!cap.isOpened())
{
cout << "카메라를 열 수 없습니다." << endl;
return - 1;
}
// 카메라에서 이미지 캡처와 윈도우에 이미지 보여주는 것을 // 반복하면 동영상처럼 보이게 됩니다.
while(1)
{
// 카메라에서 이미지를 읽어옵니다.
bool ret = cap.read(img_frame);
// read함수의 리턴 값이 false이면 캡처가 실패한 것입니다.
if (!ret)
{
cout << "캡처 실패" << endl;
break;
}
// 캡처된 이미지를 윈도우에 보여줍니다.
imshow("Color", img_frame);
// 사용자의 키보드 입력을 1밀리세컨드 동안 기다렸다가 //다음 줄을 실행합니다.
int key = waitKey(1);
// ESC 키가 입력되었다면 반복을 중지합니다.
if (key == 27)
// 카메라에서 이미지를 캡처하려면 VideoCapture 객체를 // 생성하여 카메라와 연결해야 합니다.
// 카메라 인덱스를 아규먼트로 사용합니다.
// PC에 처음 연결한 카메라의 인덱스는 0,
}
// 사용이 끝난 카메라와 연결을 종료합니다.
cap.release();
return 0;
}
카메라에서 캡쳐한 이미지를 동영상 파일로 저장
카메라에서 캡처한 이미지를 연속적으로 저장하여 동영상 파일을 만듭니다
# include < opencv2/opencv.hpp> # include < iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img_frame;
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "카메라를 열 수 없습니다." << endl;
return - 1;
}
// 캡처된 이미지의 크기를 확인하기 위해 이미지 1장을 캡처합니다.
bool ret = cap.read(img_frame);
if (!ret)
{
cout << "캡처 실패" << endl;
return - 1;
}
// 동영상 파일을 위한 코덱을 설정합니다.
int codec = VideoWriter::fourcc('M', ' J', ' P', ' G');
// 프레임 레이트 (Frame rate)를 설정합니다.
double fps = 30.0;
// 동영상 파일을 저장하려면 VideoWriter 객체를 생성해야 합니다.
// VideoWriter 객체를 초기화하기 위해 저장할 동영상 파일 이름, // 코덱, 프레임 레이트, 이미지 크기를 지정합니다.
VideoWriter writer("output.avi", codec, fps, img_frame.size());
// VideoWriter 객체를 성공적으로 초기화했는지 체크합니다.
if (!writer.isOpened()) {
cout << "동영상 파일을 준비할 수 없습니다." << endl;
return - 1;
}
// 카메라에서 이미지 캡처와 동영상 파일에 추가를 반복하면 // 동영상 파일로 저장됩니다.
while(1)
{
// 카메라에서 이미지를 캡처합니다.
bool ret = cap.read(img_frame);
if (!ret)
{
cout << "캡처 실패" << endl;
break;
}
// 캡처한 이미지를 동영상 파일에 저장합니다.
writer.write(img_frame);
imshow("Color", img_frame);
int key = waitKey(1);
if (key == 27) break;
}
cap.release();
// 동영상 저장을 완료하기 위해 VideoWriter 객체를 릴리즈합니다.
writer.release();
return 0;
}
동영상 파일 재생하기
OpenCV를 사용하여 지정한 동영상 파일을 읽어와서, 화면에 보여주는 예제입니다.
# include < opencv2/opencv.hpp> # include < iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img_frame;
// VideoCapture의 아규먼트로 불러올 동영상 파일 이름을 사용합니다.
VideoCapture cap("output.avi");
if (!cap.isOpened())
{
cout << "카메라를 열 수 없습니다." << endl;
return - 1;
}
while(1)
{
// 동영상 끝까지 재생하면 read함수는 false를 리턴합니다.
bool ret = cap.read(img_frame);
if (!ret)
{
cout << "동영상 파일 읽기 완료" << endl;
break;
}
imshow("Color", img_frame);
// 동영상 재생 속도를 조정하기 위해 waitKey함수의 // 아규먼트로 25밀리세컨드를 설정합니다.
int key = waitKey(25);
if (key == 27) break;
}
cap.release();
return 0;
}