8/20/2011

Determining whether the facial is camouflage or not / C++ source (OpenCV) / 얼굴 위장 여부 판별




Created Date : 2008.1
Language : C/C++
Tool : Microsoft Visual C++ 6.0
Library & Utilized : OpenCV 1.0
Reference : Learning OpenCV Book
etc. : web cam need





This program determines whether the face is camouflage or not.
The program can use ATM or entrance for security.
First, The program find if there is a face or not.
If there is a face, then this program determines the face is disguised or not.
To determine a disguised face use template matching with previously prepared eye, mouth image.

The meaning of the "검출 안됨" is there is not a face.
The meaning of the "얼굴 정상" is there is a face and face is normality.
The meaning of the "얼굴 비정상" is that a face is camouflage.

You can download entire source here - > <Source Code>

The principal functions of this program are 'cvHarrDetectObjects', 'cvMatchTemplate', 'cvMinMaxLoc'.

Plz reply your opinion.
Thank you.

(Please understand my bad english ability. If you point out my mistake, I would correct pleasurably. Thank you!!) -------------------------------

OpenCV의 얼굴 검출과 눈,입의 템플릿 매칭을 이용 얼굴 검출 여부, 얼굴 검출후 안면 위장 여부를 판별한다.
주요 함수 : cvHaarDetectObjects, cvMatchTemplate, cvMinMaxLoc
여기에서 전체 소스를 다운 받을 수 있습니다. ->  <Source Code>
당신의 의견을 기다립니다.
감사합니다.^^


8/18/2011

Fast face detection using AdaBoost+Camshift combined Algorithm / C++ Soruce (OpenCV) / AdaBoost + CamShift 알고리즘을 결합한 고속 얼굴 검출




Created Date : 2007.1
Language : C/C++
Tool : Microsoft Visual C++ 6.0
Library & Utilized : OpenCV 1.0
Reference : Learning OpenCV Book
etc. : web cam need








This program is fast face detection that is made by combining AdaBoost+CamShift Algrithm.
AdaBoost Algorithm is good method to detect some trained object.
But AdaBoost is weak to track the object.
So I combined the CamShift algorithm for tracking.
This algorithm is running like below flow chart.
When the porocess is intergration mode, It run 2 times more speed.
You can download this source -> <source code>
Plz reply your valuable comment.
Thank you.


(Please understand my bad english ability. If you point out my mistake, I would correct pleasurably. Thank you!!) 







AdaBoost + CAMShift 알고리즘을 결합한 실시간 고속 얼굴 검출 소스코드
웹캠 연결 필요 / openCV 1.0 설치 필요
(소스코드 + 실행파일 + openCV 1.0(openCV를 이용함))

AdaBoost 알고리즘은 얼굴/비얼굴을 판별하는 분류기로써
실시간에서 얼굴을 검출하기 위해서는 전 영역을 스캔해야하는 비효율이 있다.
Camsfhit 알고리즘은 meanShift 색분할 알고리즘을 실시간에서 object tracking을 위하여 개발한 알고리즘이다.

저자는 AdaBoost 알고리즘의 얼굴 검출과 CAMshift 의 tracking을 결합하여 고속 얼굴 검출 프로그램을 구현하였다.
<검출 + 트래킹 + 업데이트>의 방법으로 프로그램이 동작함
실험결과 약 2배 빠른 검출 속도를 보인다.

=== 인터페이스 ====
검출모드 선택 : AdaBoost 검출 / intergration(결합방법) 검출
최소 얼굴 크기 설정
검출 업데이트 threshold 결정 박스

소스는 여기서 다운 받을 수 있습니다. <source code>


Camera calibration using pattern image / C++ source (OpenCV) / 패턴 그림을 이용한 카메라 캘리브레이션 소스




Created Date : 2008.11
Language : C/C++
Tool : Microsoft Visual C++
Library & Utilized : OpenCV 1.0
Reference : Learning OpenCV Book


I made Camera calibration source for my convenience using the book that is "Learning OpenCV".
First of all, prepare several pattern images. And make same file name with ordered index.
Ex) pattern1.jpg, pattern2.jpg, pattern3.jpg ...
And answer the some questions.

Pattern width box count(black box number), height box count, the number of image
and file path and file name. Then point extraction is processed.

After all processing, below file is saved in the folder that is same location as images.

Distortion.xml
Distortion.txt
intrinsic.xml
intrinsic_matrix.txt
rotation_matricex.txt
rotation_matricex.xml
translation_matrices.txt
translation_matrices.xml

The points of each pattern image is saved as below file names.
pattern1.txt, pattern2.txt, pattern3.txt......

This source uses 'cvFindChessboardCorners' and 'cvFindCornerSubPix' functions for detecting pattern point. And for drawing, 'cvDrawChessboardCorners' function is used. 'cvCalibrateCamera2' is used for calibration.

This code is programed by Microsoft Visual studio 6.0 and OpenCV 1.0 Lib.
All OpenCv 1.0 dlls are included in the zip file.

You can download heare - > < entire source >

If you have any progressive agenda, Plz give me using reply.
Thank you.


(Please understand my bad english ability. If you point out my mistake, I would correct pleasurably. Thank you!!)

------------------------------------------------------------------------------




OpenCV를 이용한 카메라 캘리브레이션(캡쳐된 이미지를 이용함)

체스 보드 패턴의 교정판을 사용함
프로그램 실행후
패턴의 가로, 세로 점 개수 입력
패턴의 경로 입력 (예: ./p1/image)
패턴의 개수 입력 (10으로 입력하면 ./p1/image1.jpg ./p1/image2.jpg ... ./p1/image10.jpg)

이미지 한 장씩 교정점을 찾는다.
교정점을 제대로 찾지 못한 이미지는 실패로 간주하고 사용하지 않는다.
입력된 이미지를 모두 다 처리한 후
Zhang's 캘리브레이션을 수행
콘솔 창에 내부 파라미터 Instrinsic Matrirx와 왜곡 계수 Distortion Vector 값을 출력 해주고
또한 각각을 xml 파일로 저장한다.
그리고 각 패턴에 대한 Rotion 과 Translation Matrix 또한 콘솔 창에 출력하고 xml파일로 저장한다.

저장된 Instrinsic parameter, distortion coffecient를 이용하여 어플리케이션 구현이 가능하다.

체스보드에서 교정점을 찾는 방법은
cvFindChessboardCorners, cvFindCornerSubPix 함수를 이용하였으며
찾은 교정점을 그려주는 함수는 cvDrawChessboardCorners를 이용
캘리브레이션은 cvCalibrateCamera2 함수를 이용함


본 소스는 microsoft visual studio 6.0, opencv 1.0을 이용하여 만든 소스입니다.

여기서 다운 받을수 있습니다. - > < entire source >

8/17/2011

World 3D point reconstruction using Direct Linear Transformation(DLT) / Matlab source / 선형 삼각법을 이용한 월드좌표 복원



Created Date : 2011.07
Language : Matlab
Tool : Matlab
Library & Utilized: rodrigues function(obtain from internet)
Reference : Multiple View Geometry Book


Calculate 3D world coordination using Direct Linear Transformation(DLT)
Firstly, I prepared 2D coordinate of Left, Right image and rotation, translation and camera calibration matrix.
Make Projection matrix. P1 is left camera projection matrix, P2 is right.
But, P1 is reference camera, so P1 is just P1=C[I|0].
Make World coordination using DLT, The DLT method is introduced in Multiple view geometry page 312.
Again, calculate image coordinate using W, P1, P2 for confirmation.
We can confirm that calculated coordinate and input image coordinate is same.

You can download entire matlab source code < here >



--------------------------------------------------------------


선형 삼각법을 이용한 3D 월드 좌표 계산.
아래 소스는 임의로 정한 왼쪽, 오른쪽 이미지의 매칭된 좌표 쌍과
임의로 정한 회전, 이동 행렬 그리고  카메라 파라미터를 이용하여 월드 3D점을 계산하는 과정이다.
복원된 3D 좌표는 확인을 위하여 다시 2D의 이미지 좌표로 변환한다.
변환한 2D 이미지 좌표가 처음 입력한 좌표와 값이 같음을 확인할 수 있다.

여기에서 전체 매트랩 코드를 다운 받으세요 < here >
----------------------------------------------------------------------------------------------
%%
clc;
clear all;
close all;
%% image coordinate 
m1 = [ -88.6          1019.21739130435          1046.63913043478         -9643.52173913043          1488.59518796992;
      -216         -14137.7391304348          -629.04347826087          18775.3043478261         -464.421052631579];
m2 = [ 644.916058797683          8264.25802702142          2735.93716970091         -3264.00791696585          4601.62993487106;
    237.341114262516          -16276.926674065         -591.505245744724          4076.20064528107         -313.261770012357];
% rotation matrix
RealR = rodrigues( [-10 30 20]*pi/180 );
% translation matrix
RealT = [20 30 200]';
RealA=rodrigues(RealR)*180/pi; % rotation matrix angle Test
K = [1000 1 512;0 1000 384;0 0 1;]; %calibration matrix
%% P1, P2 만들기
P1 = K*[eye(3) zeros(3,1)]; % left camera Projection matrix 
P2 = K*[RealR RealT]; % right camera projection matrix
%% 3차원 점 만들기
%P1, P2를 이용한 3차원 점 복원
% World 3D coordination reconstruction by Direct Linear Transformation 
% Multiple view geometry P.312
W=[];
for i=1:5
    A=[ m1(1,i)*P1(3,:) - P1(1,:); 
        m1(2,i)*P1(3,:) - P1(2,:);
        m2(1,i)*P2(3,:) - P2(1,:);
        m2(2,i)*P2(3,:) - P2(2,:)];
    A(1,:) = A(1,:)/norm(A(1,:));
    A(2,:) = A(2,:)/norm(A(2,:));
    A(3,:) = A(3,:)/norm(A(3,:));
    A(4,:) = A(4,:)/norm(A(4,:));
    
    [u d v] = svd(A);
    W=[W v(:,4)/v(4,4)];    
end
%% 다시 3차원 점에서 픽셀 점 만들기
% again calculate 2D image point from World coordinate, projection matrix
reip1 = P1*W;
reip1 = [reip1(1,:)./reip1(3,:); reip1(2,:)./reip1(3,:)]
m1(:,1:5)
reip2 = P2*W;
reip2 = [reip2(1,:)./reip2(3,:); reip2(2,:)./reip2(3,:)]
m2(:,1:5)
% m1 and reip1 is same. Also, m2 and reip2 is same.






(Please understand my bad english ability. If you point out my mistake, I would correct pleasurably. Thank you!!)

Test Direct Linear Transformation in real image.(matlab source)


I tested the Direct Linear Transformation.
But the method doesn't run well in real image.


I tested below process.
1.Left image coordinate, Right image coordinate in real image. It is also matched point.
2.Get R,T between Left, Right Camera. and Calibration matrix from file.
3.make projection P matrix, (P1,P2)
4.Get World 3D coordinate using DLT.
5.Again, Get image coordinate from World 3D coordinate.


The problem..
recovered image point and input image point is not matched.

Below is the matlab code.
And You can down load. here->< Entire Source Code >

--------------------------------------------------------------------------
%%
clc;
clear all;
close all;

%% 데이터 로딩
%% Data Loading
load rotation_matrices.txt
load translation_vectors.txt
load intrinsic_matrix.txt
load distortion_coeffs.txt

R = rotation_matrices;

%R1은 Left카메라의 패턴판으로 부터의 Rotation Matrix
%R1 is Rotation Matrix of Left Camera from Pattern board. Pattern Board has origin
%coordinate (0,0,0)
R1 = reshape(R(19,:),3,3);

%R2 is Left Camera Rotation Matrix.
R2 = reshape(R(20,:),3,3);
%T1 is Left Camera Translation Matrix
T1 = translation_vectors(19,:)';
%T1 is right Camera Translation Matrix
T2 = translation_vectors(20,:)';
K = intrinsic_matrix;
%Load Matched Coordinate
load pattern19.txt;
load pattern20.txt;
m1 = pattern19';
m2 = pattern20';




%% Real R,T 만들기
%% Make Real R,T that is relation between Left, Right Camera
% R,T is made by R1,R2 and T1, T1
RealT = T2-T1; %T는 그냥 빼면 된다.
RealR = R2*inv(R1);
RealA=rodrigues(RealR)*180/pi; %This is Angle




%% P1, P2 만들기
% Make Projection matrix
P1 = K*[eye(3) zeros(3,1)]; %P1 is reference Camera so P1=K[I:O]
P2 = K*[RealR RealT];




%% 3차원 점 만들기
%P1, P2를 이용한 3차원 점 복원
W=[];




%Make 3D coordinate using Direct Linear Transformation
%W is wrold coordinate.
for i=1:5
A=[ m1(1,i)*P1(3,:) - P1(1,:);
m1(2,i)*P1(3,:) - P1(2,:);
m2(1,i)*P2(3,:) - P2(1,:);
m2(2,i)*P2(3,:) - P2(2,:)];
A(1,:) = A(1,:)/norm(A(1,:));
A(2,:) = A(2,:)/norm(A(2,:));
A(3,:) = A(3,:)/norm(A(3,:));
A(4,:) = A(4,:)/norm(A(4,:));



[u d v] = svd(A);
W=[W v(:,4)/v(4,4)];
end




%% 다시 3차원 점에서 픽셀 점 만들기
% Now, make image coordiante using P1, P2 from W matrix.
reip1 = P1*W;
% reip1 is recovered image coordiante
reip1 = [reip1(1,:)./reip1(3,:); reip1(2,:)./reip1(3,:)] %3차원에서 복원된 이미지 좌표
% m1 is origin image coordinate
m1(:,1:5) %원래 이미지 좌표
reip2 = P2*W;
%reip2 is recovered image coordiante
reip2 = [reip2(1,:)./reip2(3,:); reip2(2,:)./reip2(3,:)] %3차원에서 복원된 이미지 좌표
%m2 is origin image coordinate
m2(:,1:5) %원래 이미지 좌표
-------------------------------------------------------------------------



But, Why reip1 != m1 and reip2 != m2 ??
I cann't know the reason..
Please discuss with me the reason~ ^^


(Please understand my bad english ability. If you point out my mistake, I would correct pleasurably. Thank you!!)