메뉴 건너뛰기

응용프로그램 - RaspberryPi.NCLab

* 앞으로의 응용프로그램 실행 순서는 다음과 같음

test.cpp 작성 -> CMakeLists.txt 작성 -> cmake -> make -> 백그라운드에서 Test 실행 -> mjpg_streamer 실행

test.cpp


1. facerecog이라는 디렉토리를 만들고 그 안에 CMakeLists.txt, test.cpp 파일 생성

# cd ~
# mkdir facerecog
# cd facerecog
# vim CMakeLists.txt
# vim test.cpp

cmake_minimum_required ( VERSION 2.8 )
PROJECT ( Test )
find_package ( OpenCV REQUIRED )
add_executable ( Test test.cpp )
target_link_libraries ( Test ${OpenCV_LIBS} )

* CMakeLists.txt는 이전 과 같으므로 복사해 와도 무방함


#include <iostream>
#include <opencv/cv.h>
#include <opencv2/highgui/highgui.hpp>

int main(void)
{
	/* 얼굴 인식을 위해 훈련된 분류기의 경로 */
	const char *classifer = 
		"/usr/share/opencv/haarcascades/haarcascade_frontalface_alt_tree.xml";
	CvHaarClassifierCascade* cascade = 0;

	/* Haar 분류기를 로드 */
	cascade = (CvHaarClassifierCascade*)cvLoad(classifer, 0, 0, 0 );
	if(!cascade){
		std::cerr<<"error: cascade error!!"<<std::endl;
		return -1;
	}

	CvMemStorage* storage = 0;

	/* 실질적인 메모리 저장 공간 */
	storage = cvCreateMemStorage(0);
	if(!storage){
		std::cerr<<"error: storage error!!"<<std::endl;
		return -2;
	}

	IplImage *frame = 0; 
	CvCapture *capture = 0;

	/* 연결된 카메라에서 제어를 받아 옴 */
	capture = cvCaptureFromCAM(0);
	if(!capture){
		std::cerr<<"error: Cannot open init webcam!"<<std::endl;
		return -3;
	}
	
	while(true){
		/* 카메라에서 얻은 한 프레임을 IplImage 구조체로 변환 */
		frame = cvQueryFrame(capture);

		CvSeq *faces = 0;

		/* 분류기를 통해 얼굴이 검출된 부분만 시퀀스에 저장 */
		faces = cvHaarDetectObjects(frame, cascade, storage, 2.0, 1, 0);
		for(int i=0; i<faces->total; i++){
			CvRect *r = 0;
			r = (CvRect*)cvGetSeqElem(faces, i);

			/* 검출된 얼굴 영역에 사각형을 그림 */
			cvRectangle(
				frame, 
				cvPoint(r->x, r->y), 
				cvPoint(r->x+r->width, r->y+r->height), 
				cvScalar(0, 255, 0), 
				3, CV_AA, 0);
		}
		cvSaveImage("/srv/http/origin2.jpg", frame);
	}
	cvReleaseCapture(&capture);
	cvReleaseMemStorage(&storage);
	cvReleaseHaarClassifierCascade(&cascade);
	return 0;
}



2. cmake 유틸리티를 통해 Makefile 생성

# cmake .
-- The C compiler identification is GNU 5.2.0
-- The CXX compiler identification is GNU 5.2.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/facerecog


3. make 유틸리티를 통해 컴파일

# make
Scanning dependencies of target Test
[ 50%] Building CXX object CMakeFiles/Test.dir/test.cpp.o
[100%] Linking CXX executable Test
[100%] Built target Test


4. 컴파일 결과물인 Test를 백그라운들에서 실행하고 mjpg_streamer 유틸리티를 통해 웹으로 출력

# ./Test&
[1] 23949
# mjpg_streamer -i "input_file.so -f /srv/http/" -o "output_http.so -p 8080 -w /usr/share/mjpg_streamer/www"
MJPG Streamer Version: svn rev:
 i: folder to watch...: /srv/http/
 i: forced delay......: 1
 i: delete file.......: no, do not delete
 i: filename must be..: -no filter for certain filename set-
 o: www-folder-path...: /usr/share/mjpg_streamer/www/
 o: HTTP TCP port.....: 8080
 o: username:password.: disabled
 o: commands..........: enabled



5. 웹 브라우저에서 접근

그림2.png
* 앞과 같은 방식으로 접근하면 됨

* stream에서 확인하면 많이 느릴 수도 있음



6. Ctrl+c 키를 눌러 mjpg_streamer를 종료시키고 Test도 종료

^Csetting signal to stop
force cancellation of threads and cleanup resources
 o: cleaning up ressources allocated by server thread #00
done
# ps -ef | grep Test
root     23949 23785 32 05:07 pts/1    00:00:46 ./Test
root     23960 23785  0 05:10 pts/1    00:00:00 grep Test
# kill 23949
* Test의 pid는 환경에 따라 달라질 수 있으므로 유의


--

OpenCV를 이용한 영상처리 실습 - 01 개발환경 소개

OpenCV를 이용한 영상처리 실습 - 02 개발환경 구축하기

OpenCV를 이용한 영상처리 실습 - 03 화면에 + 모양의 선 그리기

OpenCV를 이용한 영상처리 실습 - 04 화면을 그레이스케일로 만들기

위로