본문 바로가기

IT/OPENCV

[OPENCV] 3. OpenCV 실시간 영상 촬영

반응형

☞ 메인보드 : Jetson Nano Developer Kit

☞ 운영 체제 : Ubuntu 18.04 - JetPack 4.3

☞ OpenCV 버전 : 4.2.0

☞ 언어 : C++

 

 

 

 

 


목차

1. 코드 작성

2. CMAKE

3. 실행 결과

 

 

 


 

 

 

 

 

 

2. OpenCV 로 이미지 파일 출력하기

메인보드 : Jetson Nano Developer Kit 이미지 파일 버전 : JetPack 4.3 언어 : C++ 1. Jetson Nano 보드 ubuntu 18.04에서 OpenCV 설치 및 CUDA 빌드 메인보드 : Jetson Nano Developer Kit 이미지 파일 버전 : J..

95mkr.tistory.com

이전 포스트에는 카메라를 사용하지 않고 cv::imread 함수를 이용하여 이미지를 불러와 출력하는 코드를 작성해보았다. 이번에는 카메라가 연결되었다는 가정하에 실시간 영상 프레임을 받아와 출력하는 과정에 대해 다루겠다.

 

 

 

 

 

 

① 코드 작성

 

 

※  작업공간 만들기

 

 

mkdir -p ~/workspace/camera_test2/src
cd ~/workspace/camera_test2/src

 

먼저 Ctrl + Alt + T를 눌러 터미널을 열어준다.

그리고 공부할 내용들을 패키지별로 저장할 수 있게 작업공간을 만들고 코드를 작성하기 위해 src 디렉토리에 이동한다.

 

 

 

 

[편집기] camera_test2.cpp

 

gedit이나 vi와 같은 편집기 프로그램을 이용하여 코드를 작성할 수 있도록 명령어를 입력한다. gedit을 사용한다면 [편집기] 자리에 gedit이라고 적어넣어주면 새로운 창이 하나 실행된다.

 

 

 

 

 

※ camera_test2.cpp

 

#include <opencv2/opencv.hpp>
#include <iostream>

int main(){
	
	cv::VideoCapture cap(-1);
	cv::Mat frame;
	cv::namedWindow("yaho", cv::WINDOW_AUTOSIZE);

	if (cap.isOpened()){
		while(1){
			cap >> frame;
			cv::imshow("yaho", frame);
			if(cv::waitKey(1) == 27) break;
		}
	}

	else{
		std::cout << "No Frame" << std::endl;	
	}
	
	cv::destroyAllWindows();
	return 0;
}

 

 

 

 

 

※ 코드 분석

 

 

int main(){
	
	cv::VideoCapture cap(-1);
	cv::Mat frame;
	cv::namedWindow("yaho", cv::WINDOW_AUTOSIZE);

 

VideoCapture 클래스는 cap 괄호에 들어갈 수는 -1, 0을 사용한다. 둘다 실행이 되었던 적이 있었는데 영상을 촬영할 때 동일한 카메라인데 각도가 달랐다. 그러나 보통 2개 이상의 카메라를 사용할 때 0, 1 두 개의 인덱스로 카메라가 구별이 된다. namedWindow는 이미지를 출력하는 창을 만드는 기능을 갖고 있으며, 창의 제목과 크기에 대해서 정할 수 있다. [cv::namedWindow 코드를 사용하지 않아도 cv::imshow로 출력이 가능하다.]

 

 

 

	if (cap.isOpened()){
		while(1){
			cap >> frame;
			cv::imshow("yaho", frame);
			if(cv::waitKey(1) == 27) break;
		}
	}

 

cv::VideoCapture::isOpened() 는 VideoCapture의 호출이 성공한 경우에 참 값을 반환한다. 즉, 카메라가 사용가능하다면 while 조건문을 실행하여 영상 정보를 frame에 전달하고 cv::imshow 로 영상 출력을 반복하고 반복중 ESC 버튼을 눌러 키를 인식하면 while 조건문을 탈출하는 코드이다.

 

 

 

 

	else{
		std::cout << "No Frame" << std::endl;	
	}
    
    	cv::destroyAllWindows();
	return 0;
}

 

cap.isOpened() 가 거짓을 반환한 경우, 카메라 인식을 못한 경우에 No Frame 문구를 출력하여 카메라 인식에 문제가 있음을 알리는 에러를 하나 넣어주면 이상이 생겼을 때 문제를 발견하기 쉽다. 위 과정들이 종료되었을 때는 모든 창을 종료한다는 내용이다.

 

 

 

 

 

 

 

 


② CMAKE

 

 

cd ..
[편집기] CMakeLists.txt

 

코드 작성을 완료하고 편집기 창을 종료하면 터미널의 위치가 workspace/camera_test2/src 디렉터리에 있을 것이다. cd .. 을 입력하면 상위 디렉터리인 workspace/camera_test2 로 이동한다. camera_test2 디렉터리에서 CMakeLists.txt를 작성해야한다.

 

 

 

 

 

cmake .
make

 

 

위와 같이 CMakeLists.txt를 작성하고 나서 camera_test2 위치에서 cmake . 와 make를 진행하고 아무 문제가 없다면 완료가 됐다는 문구가 출력될 것 이다.[cmake . 명령어는 현재 경로(.) 에서 cmake를 하겠다라는 의미로 사용한다.]

 

 

 

 

 

 

cmake를 완료하고 camera_test2 디렉터리를 보면 위와 같이 src 디렉토리와 CMakeLists.txt 외에도 많은 파일들이 생긴다. 이는 사용하려고하는 컴파일러나 라이브러리를 링크하거나 오브젝트 파일을 생성할 수 있는 파일들이 담겨 있다.

 

 

 

 

 

 


③ 실행 결과

 

 

./camera_test2

 

 

cmake와 make 과정을 완료하고 나면 실행 파일이 생겨 앞서 코딩하여 작성한 프로그램을 실행할 수 있다. 간단하게 카메라로 촬영하는 프레임을 실시간으로 출력하는 것이니 아래와 같이 카메라가 잘 작동한다면 문제 없이 잘 따라했다고 생각하면 된다.

 

터미널을 열어 ./camera_test2 를 입력하면 된다.

 

 

 

 

시공 촬영

 

 

 

 

쓰레기장에 피어나는 태원꽃

 

 

 

 

 

 

반응형