opencv c++ 실시간 웹캠 영상 불러오기

  • 최초 작성일: 2022년 1월 10일(월)

목차

[TOC]


목표

사진(정지), 동영상, 실시간 영상 등에 opencv를 사용할 수 잇다. 이번에는 카메라의 실시간 동영상을 opencv에서의 사용하는 법을 알아보자.


실습

VideoCapture ‘변수명’(카메라 번호) VideoCapture cap(0); 으로 설정하면 0번 카메라를 의미하는 것이고,

‘변수명’은 capture를 줄여 cap으로 설정했다.

노트북의 경우 0번 카메라는 내장 웹캠이 되고, usb를 통해 또다른 웹캠을 추가하면 해당 카메라의 번호는 ‘1’이된다. 데스크탑의 경우 내장 카메라가 보통 없기 때문에, usb 통해 웹캠 추가 시 카메라 번호가 ‘0’이 된다.

isOpened() 함수를 통해 카메라 정보를 읽어올 수 있다. (1: 있다, 0: 없다) !isOpend() 했으니 있으면 0, 없으면 1 => 없으면 “Can’t open the camera”를 출력하고 에러를 띄우고 종료하게 된다.

카메라가 있다면, 아래 코드들이 실행되는데, 카메라를 계속 사용하기 위해 무한 루프 속에서 반복되며, 카메라 정보를 img라는 행렬에 저장한다.

처음에, 웹캠 화면을 종료해도 계속해서 다시 켜져서 당황했는데, 추가로 waitKey(1) == 27 조건을 달아 esc 키 입력시 종료를 추가해주었다.

추가로, set 함수로 해상도를 설정할 수 있다. 640 x 480 해상도가 기본값이며, 1980 x 1080 으로 설정하면 더 큰 화면의 웹캠 화면을 확인할 수 있다.

과거에는, CV_CAP_PROP_FRAME_WIDTH / CV_CAP_PROP_FRAME_HEIGHT 를 통해 해상도 설정을 했는데, 더 이상 CV_ 를 앞에 붙이지 않는다고 하니 주의하자.

image



소스 코드

// opencvEX.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <opencv2/imgcodecs.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>

#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;


int main(int ac, char** av) {

	VideoCapture cap(0);

	cap.set(CAP_PROP_FRAME_WIDTH, 1920);
	cap.set(CAP_PROP_FRAME_HEIGHT, 1080);
	
	if (!cap.isOpened()) {	// isOpened() : 카메라 정보가 있는지 없는지 (1: 있다, 0: 없다)
		printf("Can't open the camera");
		return -1;
	}

	Mat img;

	while (true) {
		cap >> img;

		imshow("camera img", img);

		if (waitKey(1) == 27) break;
	}

	return 0;
}


결과

아래 이미지는 내가 주로 작업하는 데스크탑에는 카메라가 내장되어 있지 않아서 카메라를 찾지 못했다는 결과가 나타나는 모습이다.

image



그래서 카메라가 내장되어있는 노트북으로 따로 코드르 실행해서 움직이면서 웹캠 영상을 캡쳐 했다. 정상적으로 카메라 영상이 나오는 결과를 확인할 수 있다.

image