2. Ø Outline
본 강의는 영상처리, 컴퓨터비전을 비전공자가 쉽게 접근 및 사용할 수 있도록 하는 것에 목적을 둔다. 학부 강의에서 다루기 힘든
실습 위주의 수업이며 이론적인 내용을 최대한 배제하여 누구나 자신이 원하는 어플리케이션에 영상처리 알고리즘을 적용할 수
있도록 한다.
Ø Objective
실시간 영상처리, 컴퓨터비전 어플리케이션 제작
Ø Contents
1) OpenCV?
사용 환경 세팅(VS2013, OCV310), 이미지 불러오기
2) 영상 처리
영상 화소(Pixel) 접근, 이미지 변환, 경계 인식 및 추출
3) 컴퓨터 비전
카메라 모델, 동영상(WebCam) 처리, 배경 제거 및 전경 추출
3차원 영상 처리, 영상 특징점과 객체 인식(Human detection)
Ø Instructor
우태강
인하대학교 정보통신공학 컴퓨터비전 전공
관심분야 : 자율주행자동차, ADAS, 3차원 영상 인식 및 복원, IoT
tkwoo@inha.edu| tkwoo@vision.inha.ac.kr
OpenCV Programming
Open Source Computer Vision
3. 1. 사용 환경 세팅하기 (VS2013, ocv310)
2. 이미지 불러오기
3. 이론 설명
1. 영상 화소에 접근하기
2. 간단한 영상처리(색 변환, 크기변환, Smoothing)
3. Edge detection과 Thresholding
4. Contour(경계) 인식
목차
3
1 주차
2 주차
4. 설치
4
홈페이지 : http://opencv.org/
국내 카페 : http://cafe.naver.com/opencv/41372
다운로드에서 원하는 버전 다운로드! 본 강의는 3.1.0 사용
설치파일 경로에 주의!
C:opencv310
긍정적으로 설치
Y/n
19. 1. 사용 환경 세팅하기 (VS2013, ocv310)
2. 이미지 불러오기
3. 이론 설명
1. 영상 화소에 접근하기
2. 간단한 영상처리(색 변환, 크기변환, Smoothing)
3. Region of Interest
4. Edge detection과 Thresholding
5. Contour(경계) 인식
목차
19
1 주차
2 주차
32. Hint for Assignment #1,2
32
Assignment #1
- pyrUp() 함수 메뉴얼
• http://docs.opencv.org/3.1.0/d4/d86/group__imgproc__filter.html#gada75b59bdaaca411ed6fee10085eb784&gsc.tab=0
Assignment #2
- background subtraction
- absDiff() 함수를 사용할 것
35. Video Capture
35
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
VideoCapture vc(0);
if (!vc.isOpened()) return -1; // 불러오기 실패
Mat img;
while (1){
vc >> img;
if (img.empty()) break;
imshow("video", img);
if (waitKey(10) == 27) break; //ESC
}
destroyAllWindows();
return 0;
}
숫자인 경우, usb port로 연결된 webcam 읽어옴
문자인 경우, 동영상 파일 읽어옴
Ex) VideoCapture vc("video.avi");
36. Video Capture & Save
36
int main()
{
double fps = 30;
int fourcc = CV_FOURCC('X', 'V', 'I', 'D'); // codec
bool isColor = true;
VideoCapture vc(0);// "result.avi");
vc.set(CV_CAP_PROP_FRAME_WIDTH, 640);
vc.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
if (!vc.isOpened()) return -1; // 불러오기 실패
VideoWriter *video = new VideoWriter;
if (!video->open("result2.avi", fourcc, fps, Size(640, 480), isColor)){
delete video;
return -1;
}
Mat img;
while (1){
vc >> img;
if (img.empty()) break;
*video << img;
imshow("video", img);
if (waitKey(10) == 27) break; //ESC
}
destroyAllWindows();
delete video;
return 0;
}
video write을 위한
파라미터 세팅
Video capture 시,
이미지 크기 조절
Video save
cf.) pointer 안써도 됨
39. Stereo vision
39
#include <opencv2opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat imgLeft = imread("Left_923730u.pgm", 0);
Mat imgRight = imread("Right_923730u.pgm", 0);
Mat imgLeftDisp, disp8;
int nSADWindowSize = 9;
int nNumberOfDisparities = 48;
Ptr<StereoBM> left_bm = StereoBM::create(0, 0);
left_bm->create(nNumberOfDisparities, nSADWindowSize);
left_bm->setPreFilterCap(31);
left_bm->setBlockSize(nSADWindowSize > 0 ? nSADWindowSize : 9);
left_bm->setMinDisparity(0);
left_bm->setNumDisparities(nNumberOfDisparities);
left_bm->setTextureThreshold(10);
left_bm->setUniquenessRatio(15);
left_bm->setSpeckleWindowSize(100);
left_bm->setSpeckleRange(32);
left_bm->setDisp12MaxDiff(1);
//while (1){
int64 t = getTickCount();
left_bm->compute(imgLeft, imgRight, imgLeftDisp);
imgLeftDisp.convertTo(disp8, CV_8U, 255 / (48 * 16.));
printf("Time elapsed: %fmsn", (getTickCount() - t) * 1000 /
getTickFrequency());
imshow("left", imgLeft);
imshow("raw disp", disp8);
if (waitKey(0) == 27) return 1;
//}
return 0;
}
Left image Right image
Disparity image
40. Background subtraction
40
#include <opencv2opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
VideoCapture vc(0);
if (!vc.isOpened()) return -1; // 불러오기 실패
Mat imgBackground;
Mat imgCurrentFrame;
Mat imgDiff;
while (1){
vc >> imgCurrentFrame;
if (imgCurrentFrame.empty()) break;
flip(imgCurrentFrame, imgCurrentFrame, 1);
imshow("video", imgCurrentFrame);
if (!imgBackground.empty()){
absdiff(imgBackground, imgCurrentFrame, imgDiff);
cvtColor(imgDiff, imgDiff, CV_BGR2GRAY);
threshold(imgDiff, imgDiff, 100, 255, CV_THRESH_BINARY);
imshow("diff", imgDiff);
}
char chKey = waitKey(10);
if (chKey == 27) break; //ESC
else if (chKey == 's') imgBackground = imgCurrentFrame.clone();
}
destroyAllWindows();
return 0;
}
41. Background subtraction
41
#include <stdio.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video.hpp>
#include <opencv2/bgsegm.hpp>
using namespace cv;
using namespace cv::bgsegm;
using namespace std;
int main()
{
//global variables
Mat frame; //current frame
Mat resizeF;
Mat fgMaskMOG; //fg mask generated by MOG method
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
Mat fgMaskGMG; //fg mask fg mask generated by MOG2 method
Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor
pMOG = createBackgroundSubtractorMOG();
pMOG2 = createBackgroundSubtractorMOG2();
VideoCapture stream1(0); //0 is the id of video device.0 if you have only
one camera
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3), Point(1, 1));
//unconditional loop
while (true) {
Mat cameraFrame;
if (!(stream1.read(frame))) //get one frame form video
break;
resize(frame, resizeF, Size(frame.size().width / 2, frame.size().height / 2));
pMOG->apply(resizeF, fgMaskMOG);
pMOG2->apply(resizeF, fgMaskMOG2);
//morphologyEx(fgMaskGMG, fgMaskGMG, CV_MOP_OPEN, element);
imshow("Origin", resizeF);
imshow("MOG", fgMaskMOG);
imshow("MOG2", fgMaskMOG2);
if (waitKey(1) == 27)//waitKey(30) >= 0)
break;
}
}
치명적인 단점이 있다!