SlideShare une entreprise Scribd logo
1  sur  57
Télécharger pour lire hors ligne
OpenSource Computer Vision
OpenCV tutorial
2016.spring
NoA
우태강
Ø 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
1. 사용 환경 세팅하기 (VS2013, ocv310)
2. 이미지 불러오기
3. 이론 설명
1. 영상 화소에 접근하기
2. 간단한 영상처리(색 변환, 크기변환, Smoothing)
3. Edge detection과 Thresholding
4. Contour(경계) 인식
목차
3
1 주차
2 주차
설치
4
홈페이지 : http://opencv.org/
국내 카페 : http://cafe.naver.com/opencv/41372
다운로드에서 원하는 버전 다운로드! 본 강의는 3.1.0 사용
설치파일 경로에 주의!
C:opencv310
긍정적으로 설치
Y/n
설치
5
Opencv 실행파일!
위치가 중요!
C:opencv310opencvbuildx64vc12bin
설치
6
설치
7
VS2013
C:opencv310opencvbuildx64vc12bin
VS2015
C:opencv310opencvbuildx64vc14bin
설치
8
체크해제
설치
9
Release도 x64로 설정해주세요
설치
10
마우스 우클릭 후 새 프로퍼티 시트 추가 클릭
opencv310d_vs201x.props è 디버그
opencv310l_vs201x.props è 릴리즈
설치
11
C:opencv310opencvbuildinclude
설치
12
C:opencv310opencvbuildx64vc14lib
C:opencv310opencvbuildx64vc12lib
설치
13
Debug는 opencv_world310d.lib
Release는 opencv_world310.lib
설치
14
#include <opencv2opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat imgFirst;
imgFirst = imread("test.jpg", 1);
imshow("hello world!", imgFirst);
waitKey();
return 0;
}
설치
15
Honey tips
16
Opencv sample code
C:opencv310opencvsourcessamplescpp
Opencv Docs web page
http://docs.opencv.org/
Pixel
17
OpenSource Computer Vision
OpenCV tutorial
2016.Spring
NoA
우태강
1. 사용 환경 세팅하기 (VS2013, ocv310)
2. 이미지 불러오기
3. 이론 설명
1. 영상 화소에 접근하기
2. 간단한 영상처리(색 변환, 크기변환, Smoothing)
3. Region of Interest
4. Edge detection과 Thresholding
5. Contour(경계) 인식
목차
19
1 주차
2 주차
Pixel
20
Pixel 접근하기
21
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgTemp = imread("test.jpg", 1);
imshow("hello world", imgTemp);
cout << "pixel value : " << imgTemp.at<Vec3b>(162, 342) << endl;
waitKey();
return 0;
}
imgTemp.at<Vec3b>(162, 342)
행 열
BGR 3채널 구조체
Pixel 단위 처리
22
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgTemp = imread("test.jpg", 1);
cout << "img size : " << imgTemp.size() << endl;
imshow("hello world", imgTemp);
cout << "pixel value : " << imgTemp.at<Vec3b>(162, 342) << endl;
for (int i = 0; i < imgTemp.cols; i++)
imgTemp.at<Vec3b>(180, i) = Vec3b(255, 255, 255);
imshow("Result", imgTemp);
waitKey();
return 0;
}
for (int i = 0; i < imgTemp.cols; i++)
imgTemp.at<Vec3b>(180, i) = Vec3b(255, 255, 255);
B G R
이미지 행 수 ex)640 pixel
360
640
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgTemp = imread("test.jpg", 1);
cout << "img size : " << imgTemp.size() << endl;
imshow("hello world", imgTemp);
cout << "pixel value : " << imgTemp.at<Vec3b>(162, 342) << endl;
for (int i = 0; i < imgTemp.cols; i = i + 2)
for (int j = 0; j < imgTemp.rows; j = j + 2)
imgTemp.at<Vec3b>(j, i) = Vec3b(255, 255, 255);
imshow("Result", imgTemp);
waitKey();
return 0;
}
Pixel 단위 처리
23
원점!
영상처리 - smoothing
24
http://docs.opencv.org/3.1.0/d7/da8/tutorial_table_of_content_imgproc.html#gsc.tab=0
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgTemp = imread("test.jpg", 1);
cout << "img size : " << imgTemp.size() << endl;
imshow("hello world", imgTemp);
Mat dst;
GaussianBlur(imgTemp, dst, Size(15, 15), 0, 0);
imshow("Result", dst);
waitKey();
return 0;
}
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgTemp = imread("test.jpg", 1);
cout << "img size : " << imgTemp.size() << endl;
imshow("hello world", imgTemp);
Mat dst;
//GaussianBlur(imgTemp, dst, Size(15, 15), 0, 0);
cvtColor(imgTemp, dst, CV_BGR2GRAY);
imshow("Result", dst);
waitKey();
return 0;
}
영상처리 ­ 색 변환
25
Region of Interest
26
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgTemp = imread("test2.jpg", 1);
cout << "img size : " << imgTemp.size() << endl;
imshow("hello world", imgTemp);
Mat imgLogo = imread("archive_logo1.bmp", 0);
cout << "logo size : " << imgLogo.size() << endl;
imshow("logo", imgLogo);
Mat dst;
//GaussianBlur(imgTemp, dst, Size(15, 15), 0, 0);
cvtColor(imgTemp, dst, CV_BGR2GRAY);
Mat imgROI = dst(Rect(70, 579, imgLogo.cols, imgLogo.rows));
//Mat imgROI = dst(Range(0, imgLogo.rows), Range(0, imgLogo.cols));
for (int i = 0; i < imgLogo.rows; i++)
for (int j = 0; j < imgLogo.cols; j++)
if (imgLogo.at<uchar>(i,j) < 128)
imgROI.at<uchar>(i, j) = imgLogo.at<uchar>(i, j);
imshow("Result", dst);
waitKey();
return 0;
}
Edge detection
27
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
/////////////////////image load////////////////////////////
Mat imgTemp = imread("test2.jpg", 1);
cout << "img size : " << imgTemp.size() << endl;
imshow("hello world", imgTemp);
Mat imgLogo = imread("archive_logo1.bmp", 0);
cout << "logo size : " << imgLogo.size() << endl;
imshow("logo", imgLogo);
waitKey();
/////////////////////water mark////////////////////////////
Mat dst;
//GaussianBlur(imgTemp, dst, Size(15, 15), 0, 0);
cvtColor(imgTemp, dst, CV_BGR2GRAY);
Mat imgROI = dst(Rect(70, 579, imgLogo.cols, imgLogo.rows));
for (int i = 0; i < imgLogo.rows; i++)
for (int j = 0; j < imgLogo.cols; j++)
if (imgLogo.at<uchar>(i,j) < 128)
imgROI.at<uchar>(i, j) = imgLogo.at<uchar>(i, j);
imshow("Result", dst);
waitKey();
////////////////////edge detection////////////////////////
Mat imgEdge;
int nThresh = 100;
Canny(dst, imgEdge, nThresh, nThresh*3, 3);
imshow("edge", imgEdge);
waitKey();
return 0;
}
영상처리 ­ Threshold
28
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat imgTest(Size(500, 500), CV_8U);
for (int i = 0; i < imgTest.rows; i++)
for (int j = 0; j < imgTest.cols; j++)
imgTest.at<uchar>(i, j) = (uchar)((double)i / 500. * 255);
imshow("src", imgTest);
waitKey();
Mat imgThresh;
threshold(imgTest, imgThresh, 50, 255, CV_THRESH_BINARY);
imshow("Threshold", imgThresh);
waitKey();
return 0;
}
영상처리 ­ Contour
29
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
/////////////////////////////image creating/////////////////////////////////
Mat imgTest(Size(500, 500), CV_8U);
for (int i = 0; i < imgTest.rows; i++)
for (int j = 0; j < imgTest.cols; j++)
imgTest.at<uchar>(i, j) = (uchar)((double)i / 500. * 255);
Point pts1[3] = { Point(200, 200), Point(300, 100), Point(400, 300) };
Point *ptPoint = pts1;
fillConvexPoly(imgTest, ptPoint, 3, Scalar(255));
imshow("src", imgTest);
waitKey();
//////////////////////////Threshold for contour/////////////////////////////
Mat imgThresh;
threshold(imgTest, imgThresh, 254, 255, CV_THRESH_BINARY);
imshow("Threshold", imgThresh);
waitKey();
// convert to color image to show the result
Mat imgColor;
cvtColor(imgThresh, imgColor, CV_GRAY2BGR);
////////////////////////////find contour//////////////////////////////////
vector<vector<Point>> contours;
findContours(imgThresh, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
cout << "contour size : " << contours.size() << endl;
////////////////////////////draw contour//////////////////////////////////
vector<Rect> rectBoundingBox;
for (int i = 0; i < contours.size(); i++){
drawContours(imgColor, contours, i, Scalar(255, 0, 0), 3);
rectBoundingBox.push_back(boundingRect(contours[i]));
}
imshow("contour", imgColor);
waitKey();
///////////////////////draw bounding box with contour///////////////////////
for (int i = 0; i < contours.size(); i++){
rectangle(imgColor, rectBoundingBox[i], Scalar(0, 0, 255), 3);
}
imshow("contour", imgColor);
waitKey();
return 0;
}
Assignment #1
30
#include <opencv2opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat imgSrc, imgDst, imgTmp;
imgSrc = imread("test.jpg", 1);
if (!imgSrc.data){
cout << "no image" << endl; return -1;
}
imgTmp = imgSrc;
imgDst = imgTmp;
namedWindow("result", CV_WINDOW_AUTOSIZE);
imshow("result", imgDst);
while (1)
{
char c = waitKey(1);
if (c == 27)
break;
else if (c == 'u'){
pyrUp(imgTmp, imgDst, Size(imgTmp.cols, imgTmp.rows));
cout << "size up!" << endl;
}
else if (c == 'd'){
pyrDown(imgTmp, imgDst, Size(imgTmp.cols, imgTmp.rows));
cout << "size down!" << endl;
}
imshow("result", imgDst);
imgTmp = imgDst;
}
return 0;
}
Press ‘u’
Press ‘d’
Assignment #2
31
Q. Show the difference between two images
Input
output
Background
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() 함수를 사용할 것
OpenSource Computer Vision
OpenCV tutorial
2016.spring
NoA
우태강
1. Environment setup (VS2013, ocv310)
2. Image reading
3. Theory
1. Pixel processing
2. Image processing
3. Edge detection and Thresholding
4. Contour
목차
34
1 주차
2 주차
1. Video reading
2. Stereo vision
3. Background subtraction
1. Machine learning tutorial
2. Face detection
3 주차
4 주차
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");
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 안써도 됨
Video Capture
37
Stereo vision
38
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
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;
}
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;
}
}
치명적인 단점이 있다!
SV based detection
42
SV based detection
43
#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;
//}
Mat imgBackground1, imgBackground2;
threshold(disp8, imgBackground1, 143, 255, CV_THRESH_BINARY);
threshold(disp8, imgBackground2, 152, 255, CV_THRESH_BINARY);
imshow("bg1", imgBackground1);
imshow("bg2", imgBackground2);
Mat imgResult;
absdiff(imgBackground1, imgBackground2, imgResult);
imshow("bgs result", imgResult);
if (waitKey(0) == 27) return 1;
return 0;
}
OpenSource Computer Vision
OpenCV tutorial
2016.spring
NoA
우태강
1. Environment setup (VS2013, ocv310)
2. Image reading
3. Theory
1. Pixel processing
2. Image processing
3. Edge detection and Thresholding
4. Contour
목차
45
1 주차
2 주차
1. Video reading
2. Stereo vision
3. Background subtraction
1. Machine learning tutorial
2. Face detection
3. Tracking - camshift
3 주차
4 주차
Computer vision
46
영상처리
인식
Stereo
Vision
BGS
Machine
Learning
Computer
Graphics
입력
Computer Vision
Machine Learning
47
프로그램이 경험을 통해 성능이 개선된다면 이 프로그램은 학습한 것이다.
사람
차
특징
추출
특징 공간
X
학습
분류기
사람
차
Machine Learning
48
프로그램이 경험을 통해 성능이 개선된다면 이 프로그램은 학습한 것이다.
분류기
사람
차
특징
추출
부류
사람
좋은 특징이란? 좋은 분류기란?
Machine Learning ­ Face detection
49
입력 영상 얼굴 검출
Detection
얼굴 인식
Recognition
김고은
박보검
Face detection
50
Viola-Jones
얼굴
얼굴 아닌 다른 것
특징
추출
부류
얼굴
Haar
feature
Haar feature
Face detection
51
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
/* Function Headers */
void detectAndDisplay(Mat frame);
/* Global variables */
String face_cascade_name = "C:/opencv310/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";
//String face_cascade_name = "C:/opencv310/opencv/sources/data/haarcascades/haarcascade_upperbody.xml";
CascadeClassifier face_cascade;
/* @function main */
int main(void)
{
VideoCapture capture;
Mat frame;
//— 1. Load the cascades
if (!face_cascade.load(face_cascade_name)){ printf("—(!)Error loading face cascaden"); return -1; };
//— 2. Read the video stream
capture.open(0);
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 720);
if (!capture.isOpened()) { printf("—(!)Error opening video capturen"); return -1; }
분류기 선언
저장된 분류기 정보 파일
Face detection
52
while (capture.read(frame))
{
if (frame.empty()){
printf(" —(!) No captured frame — Break!");
break;
}
int64 t = getTickCount();
Mat imgHalf;
resize(frame, imgHalf, Size(frame.cols / 2, frame.rows / 2));
//— 3. Apply the classifier to the frame
vector<Rect> faces;
Mat frame_gray;
cvtColor(imgHalf, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
//— Detect faces
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faces.size(); i++)
{
/*Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);*/
rectangle(imgHalf, faces[i], Scalar(0, 255, 255), 3);
}
//— Show what you got
imshow("FD", imgHalf);
printf("Time elapsed: %fmsn", (getTickCount() - t) * 1000 / getTickFrequency());
char c = waitKey(10);
if (c == 27) { break; } // escape
}
return 0;
}
전처리 : 히스토그램 평활화(영상처리)
FACE DETECTION!!!
그려주는 함수
Tracking
53
매번 얼굴이 검출 되는 것은 아니다. Ex) 얼굴을 기울이면 검출되지 않음
추적을 하자!
Tracking - camshift
54
색 분포를 이용해서 추적
Tracking - camshift
55
색 정보의 단점
해결책은?
1. Kalman filter
2. Particle filter
etc…
과제
56
+
Face Detection Cam shift
감사합니다
57

Contenu connexe

Similaire à c++ opencv tutorial

영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출동윤 이
 
딥러닝(Deep Learing) using DeepDetect
딥러닝(Deep Learing) using DeepDetect딥러닝(Deep Learing) using DeepDetect
딥러닝(Deep Learing) using DeepDetectJunyi Song
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성HyeonSeok Choi
 
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard LibraryDongMin Choi
 
Objective-C에서 Swift로 전향할 때 생각해 볼 거리들
Objective-C에서 Swift로 전향할 때 생각해 볼 거리들Objective-C에서 Swift로 전향할 때 생각해 볼 거리들
Objective-C에서 Swift로 전향할 때 생각해 볼 거리들SeongGyu Jo
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10Ryan Park
 
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Isaac Jeon
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample상현 조
 
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석MinPa Lee
 
[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)NAVER D2
 
이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예zupet
 
20131217 html5
20131217 html520131217 html5
20131217 html5DK Lee
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스noerror
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crowJaeseung Ha
 
어플 개발자의 서버개발 삽질기
어플 개발자의 서버개발 삽질기어플 개발자의 서버개발 삽질기
어플 개발자의 서버개발 삽질기scor7910
 

Similaire à c++ opencv tutorial (20)

영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출
 
딥러닝(Deep Learing) using DeepDetect
딥러닝(Deep Learing) using DeepDetect딥러닝(Deep Learing) using DeepDetect
딥러닝(Deep Learing) using DeepDetect
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
[C++ Korea 2nd Seminar] Ranges for The Cpp Standard Library
 
Objective-C에서 Swift로 전향할 때 생각해 볼 거리들
Objective-C에서 Swift로 전향할 때 생각해 볼 거리들Objective-C에서 Swift로 전향할 때 생각해 볼 거리들
Objective-C에서 Swift로 전향할 때 생각해 볼 거리들
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
 
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
[QGIS] 수치지도를 이용한 DEM 생성과 지형분석
 
[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)
 
이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예
 
20131217 html5
20131217 html520131217 html5
20131217 html5
 
NDC11_슈퍼클래스
NDC11_슈퍼클래스NDC11_슈퍼클래스
NDC11_슈퍼클래스
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
 
어플 개발자의 서버개발 삽질기
어플 개발자의 서버개발 삽질기어플 개발자의 서버개발 삽질기
어플 개발자의 서버개발 삽질기
 
Nexacro
NexacroNexacro
Nexacro
 

c++ opencv tutorial

  • 1. OpenSource Computer Vision OpenCV tutorial 2016.spring NoA 우태강
  • 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
  • 10. 설치 10 마우스 우클릭 후 새 프로퍼티 시트 추가 클릭 opencv310d_vs201x.props è 디버그 opencv310l_vs201x.props è 릴리즈
  • 14. 설치 14 #include <opencv2opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { Mat imgFirst; imgFirst = imread("test.jpg", 1); imshow("hello world!", imgFirst); waitKey(); return 0; }
  • 16. Honey tips 16 Opencv sample code C:opencv310opencvsourcessamplescpp Opencv Docs web page http://docs.opencv.org/
  • 18. OpenSource Computer Vision OpenCV tutorial 2016.Spring NoA 우태강
  • 19. 1. 사용 환경 세팅하기 (VS2013, ocv310) 2. 이미지 불러오기 3. 이론 설명 1. 영상 화소에 접근하기 2. 간단한 영상처리(색 변환, 크기변환, Smoothing) 3. Region of Interest 4. Edge detection과 Thresholding 5. Contour(경계) 인식 목차 19 1 주차 2 주차
  • 21. Pixel 접근하기 21 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat imgTemp = imread("test.jpg", 1); imshow("hello world", imgTemp); cout << "pixel value : " << imgTemp.at<Vec3b>(162, 342) << endl; waitKey(); return 0; } imgTemp.at<Vec3b>(162, 342) 행 열 BGR 3채널 구조체
  • 22. Pixel 단위 처리 22 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat imgTemp = imread("test.jpg", 1); cout << "img size : " << imgTemp.size() << endl; imshow("hello world", imgTemp); cout << "pixel value : " << imgTemp.at<Vec3b>(162, 342) << endl; for (int i = 0; i < imgTemp.cols; i++) imgTemp.at<Vec3b>(180, i) = Vec3b(255, 255, 255); imshow("Result", imgTemp); waitKey(); return 0; } for (int i = 0; i < imgTemp.cols; i++) imgTemp.at<Vec3b>(180, i) = Vec3b(255, 255, 255); B G R 이미지 행 수 ex)640 pixel 360 640
  • 23. #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat imgTemp = imread("test.jpg", 1); cout << "img size : " << imgTemp.size() << endl; imshow("hello world", imgTemp); cout << "pixel value : " << imgTemp.at<Vec3b>(162, 342) << endl; for (int i = 0; i < imgTemp.cols; i = i + 2) for (int j = 0; j < imgTemp.rows; j = j + 2) imgTemp.at<Vec3b>(j, i) = Vec3b(255, 255, 255); imshow("Result", imgTemp); waitKey(); return 0; } Pixel 단위 처리 23 원점!
  • 24. 영상처리 - smoothing 24 http://docs.opencv.org/3.1.0/d7/da8/tutorial_table_of_content_imgproc.html#gsc.tab=0 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat imgTemp = imread("test.jpg", 1); cout << "img size : " << imgTemp.size() << endl; imshow("hello world", imgTemp); Mat dst; GaussianBlur(imgTemp, dst, Size(15, 15), 0, 0); imshow("Result", dst); waitKey(); return 0; }
  • 25. #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat imgTemp = imread("test.jpg", 1); cout << "img size : " << imgTemp.size() << endl; imshow("hello world", imgTemp); Mat dst; //GaussianBlur(imgTemp, dst, Size(15, 15), 0, 0); cvtColor(imgTemp, dst, CV_BGR2GRAY); imshow("Result", dst); waitKey(); return 0; } 영상처리 ­ 색 변환 25
  • 26. Region of Interest 26 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat imgTemp = imread("test2.jpg", 1); cout << "img size : " << imgTemp.size() << endl; imshow("hello world", imgTemp); Mat imgLogo = imread("archive_logo1.bmp", 0); cout << "logo size : " << imgLogo.size() << endl; imshow("logo", imgLogo); Mat dst; //GaussianBlur(imgTemp, dst, Size(15, 15), 0, 0); cvtColor(imgTemp, dst, CV_BGR2GRAY); Mat imgROI = dst(Rect(70, 579, imgLogo.cols, imgLogo.rows)); //Mat imgROI = dst(Range(0, imgLogo.rows), Range(0, imgLogo.cols)); for (int i = 0; i < imgLogo.rows; i++) for (int j = 0; j < imgLogo.cols; j++) if (imgLogo.at<uchar>(i,j) < 128) imgROI.at<uchar>(i, j) = imgLogo.at<uchar>(i, j); imshow("Result", dst); waitKey(); return 0; }
  • 27. Edge detection 27 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { /////////////////////image load//////////////////////////// Mat imgTemp = imread("test2.jpg", 1); cout << "img size : " << imgTemp.size() << endl; imshow("hello world", imgTemp); Mat imgLogo = imread("archive_logo1.bmp", 0); cout << "logo size : " << imgLogo.size() << endl; imshow("logo", imgLogo); waitKey(); /////////////////////water mark//////////////////////////// Mat dst; //GaussianBlur(imgTemp, dst, Size(15, 15), 0, 0); cvtColor(imgTemp, dst, CV_BGR2GRAY); Mat imgROI = dst(Rect(70, 579, imgLogo.cols, imgLogo.rows)); for (int i = 0; i < imgLogo.rows; i++) for (int j = 0; j < imgLogo.cols; j++) if (imgLogo.at<uchar>(i,j) < 128) imgROI.at<uchar>(i, j) = imgLogo.at<uchar>(i, j); imshow("Result", dst); waitKey(); ////////////////////edge detection//////////////////////// Mat imgEdge; int nThresh = 100; Canny(dst, imgEdge, nThresh, nThresh*3, 3); imshow("edge", imgEdge); waitKey(); return 0; }
  • 28. 영상처리 ­ Threshold 28 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat imgTest(Size(500, 500), CV_8U); for (int i = 0; i < imgTest.rows; i++) for (int j = 0; j < imgTest.cols; j++) imgTest.at<uchar>(i, j) = (uchar)((double)i / 500. * 255); imshow("src", imgTest); waitKey(); Mat imgThresh; threshold(imgTest, imgThresh, 50, 255, CV_THRESH_BINARY); imshow("Threshold", imgThresh); waitKey(); return 0; }
  • 29. 영상처리 ­ Contour 29 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { /////////////////////////////image creating///////////////////////////////// Mat imgTest(Size(500, 500), CV_8U); for (int i = 0; i < imgTest.rows; i++) for (int j = 0; j < imgTest.cols; j++) imgTest.at<uchar>(i, j) = (uchar)((double)i / 500. * 255); Point pts1[3] = { Point(200, 200), Point(300, 100), Point(400, 300) }; Point *ptPoint = pts1; fillConvexPoly(imgTest, ptPoint, 3, Scalar(255)); imshow("src", imgTest); waitKey(); //////////////////////////Threshold for contour///////////////////////////// Mat imgThresh; threshold(imgTest, imgThresh, 254, 255, CV_THRESH_BINARY); imshow("Threshold", imgThresh); waitKey(); // convert to color image to show the result Mat imgColor; cvtColor(imgThresh, imgColor, CV_GRAY2BGR); ////////////////////////////find contour////////////////////////////////// vector<vector<Point>> contours; findContours(imgThresh, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); cout << "contour size : " << contours.size() << endl; ////////////////////////////draw contour////////////////////////////////// vector<Rect> rectBoundingBox; for (int i = 0; i < contours.size(); i++){ drawContours(imgColor, contours, i, Scalar(255, 0, 0), 3); rectBoundingBox.push_back(boundingRect(contours[i])); } imshow("contour", imgColor); waitKey(); ///////////////////////draw bounding box with contour/////////////////////// for (int i = 0; i < contours.size(); i++){ rectangle(imgColor, rectBoundingBox[i], Scalar(0, 0, 255), 3); } imshow("contour", imgColor); waitKey(); return 0; }
  • 30. Assignment #1 30 #include <opencv2opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main() { Mat imgSrc, imgDst, imgTmp; imgSrc = imread("test.jpg", 1); if (!imgSrc.data){ cout << "no image" << endl; return -1; } imgTmp = imgSrc; imgDst = imgTmp; namedWindow("result", CV_WINDOW_AUTOSIZE); imshow("result", imgDst); while (1) { char c = waitKey(1); if (c == 27) break; else if (c == 'u'){ pyrUp(imgTmp, imgDst, Size(imgTmp.cols, imgTmp.rows)); cout << "size up!" << endl; } else if (c == 'd'){ pyrDown(imgTmp, imgDst, Size(imgTmp.cols, imgTmp.rows)); cout << "size down!" << endl; } imshow("result", imgDst); imgTmp = imgDst; } return 0; } Press ‘u’ Press ‘d’
  • 31. Assignment #2 31 Q. Show the difference between two images Input output Background
  • 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() 함수를 사용할 것
  • 33. OpenSource Computer Vision OpenCV tutorial 2016.spring NoA 우태강
  • 34. 1. Environment setup (VS2013, ocv310) 2. Image reading 3. Theory 1. Pixel processing 2. Image processing 3. Edge detection and Thresholding 4. Contour 목차 34 1 주차 2 주차 1. Video reading 2. Stereo vision 3. Background subtraction 1. Machine learning tutorial 2. Face detection 3 주차 4 주차
  • 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; } } 치명적인 단점이 있다!
  • 43. SV based detection 43 #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; //} Mat imgBackground1, imgBackground2; threshold(disp8, imgBackground1, 143, 255, CV_THRESH_BINARY); threshold(disp8, imgBackground2, 152, 255, CV_THRESH_BINARY); imshow("bg1", imgBackground1); imshow("bg2", imgBackground2); Mat imgResult; absdiff(imgBackground1, imgBackground2, imgResult); imshow("bgs result", imgResult); if (waitKey(0) == 27) return 1; return 0; }
  • 44. OpenSource Computer Vision OpenCV tutorial 2016.spring NoA 우태강
  • 45. 1. Environment setup (VS2013, ocv310) 2. Image reading 3. Theory 1. Pixel processing 2. Image processing 3. Edge detection and Thresholding 4. Contour 목차 45 1 주차 2 주차 1. Video reading 2. Stereo vision 3. Background subtraction 1. Machine learning tutorial 2. Face detection 3. Tracking - camshift 3 주차 4 주차
  • 47. Machine Learning 47 프로그램이 경험을 통해 성능이 개선된다면 이 프로그램은 학습한 것이다. 사람 차 특징 추출 특징 공간 X 학습 분류기 사람 차
  • 48. Machine Learning 48 프로그램이 경험을 통해 성능이 개선된다면 이 프로그램은 학습한 것이다. 분류기 사람 차 특징 추출 부류 사람 좋은 특징이란? 좋은 분류기란?
  • 49. Machine Learning ­ Face detection 49 입력 영상 얼굴 검출 Detection 얼굴 인식 Recognition 김고은 박보검
  • 50. Face detection 50 Viola-Jones 얼굴 얼굴 아닌 다른 것 특징 추출 부류 얼굴 Haar feature Haar feature
  • 51. Face detection 51 #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; /* Function Headers */ void detectAndDisplay(Mat frame); /* Global variables */ String face_cascade_name = "C:/opencv310/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"; //String face_cascade_name = "C:/opencv310/opencv/sources/data/haarcascades/haarcascade_upperbody.xml"; CascadeClassifier face_cascade; /* @function main */ int main(void) { VideoCapture capture; Mat frame; //— 1. Load the cascades if (!face_cascade.load(face_cascade_name)){ printf("—(!)Error loading face cascaden"); return -1; }; //— 2. Read the video stream capture.open(0); capture.set(CV_CAP_PROP_FRAME_WIDTH, 1280); capture.set(CV_CAP_PROP_FRAME_HEIGHT, 720); if (!capture.isOpened()) { printf("—(!)Error opening video capturen"); return -1; } 분류기 선언 저장된 분류기 정보 파일
  • 52. Face detection 52 while (capture.read(frame)) { if (frame.empty()){ printf(" —(!) No captured frame — Break!"); break; } int64 t = getTickCount(); Mat imgHalf; resize(frame, imgHalf, Size(frame.cols / 2, frame.rows / 2)); //— 3. Apply the classifier to the frame vector<Rect> faces; Mat frame_gray; cvtColor(imgHalf, frame_gray, COLOR_BGR2GRAY); equalizeHist(frame_gray, frame_gray); //— Detect faces face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); for (size_t i = 0; i < faces.size(); i++) { /*Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);*/ rectangle(imgHalf, faces[i], Scalar(0, 255, 255), 3); } //— Show what you got imshow("FD", imgHalf); printf("Time elapsed: %fmsn", (getTickCount() - t) * 1000 / getTickFrequency()); char c = waitKey(10); if (c == 27) { break; } // escape } return 0; } 전처리 : 히스토그램 평활화(영상처리) FACE DETECTION!!! 그려주는 함수
  • 53. Tracking 53 매번 얼굴이 검출 되는 것은 아니다. Ex) 얼굴을 기울이면 검출되지 않음 추적을 하자!
  • 54. Tracking - camshift 54 색 분포를 이용해서 추적
  • 55. Tracking - camshift 55 색 정보의 단점 해결책은? 1. Kalman filter 2. Particle filter etc…