posted by bluelimn 2010.12.19 15:33

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AlphaImage implements AdjustmentListener
{
 private JFrame frame;
 private Canvas canvas;
 private JScrollBar jsp;
 private Image image;
 private AlphaComposite alphaComposite;
 private Label label;
 
 public AlphaImage()
 {
  image = Toolkit.getDefaultToolkit().getImage("1.jpg"); //원하는 이미지
  frame = new JFrame();
 
  jsp = new JScrollBar();
  jsp.addAdjustmentListener(this);
  jsp.setMaximum(265);
  jsp.setMinimum(0);
  image = Toolkit.getDefaultToolkit().getImage("1.jpg");
  label = new Label("alpha = " + jsp.getValue());
 
  canvas = new Canvas(){
   public void paint(Graphics g)
   {   
    alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)jsp.getValue()/255); //alpha값
    Graphics2D g2 = (Graphics2D)g;
    g2.setComposite(alphaComposite);
    g2.drawImage(image, 0, 0, this);   
   }
  };
  frame.add(canvas, BorderLayout.CENTER);
  frame.add(jsp, BorderLayout.EAST);
  frame.add(label, BorderLayout.SOUTH);
  frame.setSize(300,300);
  frame.setVisible(true);
 }

 public void adjustmentValueChanged(AdjustmentEvent e)
 {
 
  if(label != null)
   label.setText("alpha = " + jsp.getValue());
  if(canvas != null)
   canvas.repaint();
 }

 public static void main(String[] args)
 {
  new AlphaImage();
 }
}


'Projects > 얼굴특징점추출' 카테고리의 다른 글

java 투명도(alpha)조절  (0) 2010.12.19
tip : YCbCr to RGB, RGB to YCbCr  (0) 2010.07.04
posted by bluelimn 2010.07.04 23:47

RGB to YCbCr

Y = 0.299R + 0.587G + 0.114B

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)


YCbCr to RGB

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

R = Y + 1.402Cr

'Projects > 얼굴특징점추출' 카테고리의 다른 글

java 투명도(alpha)조절  (0) 2010.12.19
tip : YCbCr to RGB, RGB to YCbCr  (0) 2010.07.04
posted by bluelimn 2009.06.08 16:07

특징점을 추출하는데 있어 핵심은 얼굴 전체를 보는 것이 아니라 작게 잘라서 생각한다는 것이었다. 일단 얼굴영역 추출은 OpenCV에 있는 method를 그대로 사용한 것이라 특별히 할 이야기가 없다. 프로그램 전체가 그 함수가 제대로 적용된다는 가정하에 만들어진 것이라 문제가 있다. 시간이 더 많다면 얼굴영역을 추출하는 알고리즘도 생각해볼만 하다.

이렇게 얼굴영역이 잡히면 눈코입이 들어있을 것으로 예상되는 영역을 잡는다. 얼굴에서 눈코입의 위치는 어느정도 예측 가능하므로 눈이 세개이거나 코가 눈위로 가 있다거나 하는 경우는 생각하지 않고 일반적인 얼굴에 대해서만 연산을 하였다.

이 과정에서 또다시 문제가 되는 것이 촬영 각도다. 그림을 그리거나 인물사진을 많이 찍은 사람은 알겠지만 얼굴의 비율은 각도에 따라 심하게 차이가 난다. 즉, 고개를 들거나 숙이면 전체에서 눈코입의 위치를 예상하기 어렵다는 것이다. 이것도 얼굴의 범위가 일정하게 잡힌다면 어느정도 예상 가능하지만 OpenCV에 있는 함수가 원래 정면을 기준으로 한 것이기 때문에 그런 것까지 만들기는 어려웠다.
얼굴영역을 작게 나눠서 부분 이진화 시켜봤다. 각 부분에서 경계값은 구역의 gray영상에 대한 평균값으로 했다. 눈코입을 알아볼 수 잇을 정도로 나왔지만 대상마다 다르게 나와 값으로 사용하기엔 문제가 있었다.

눈과 입부분에 대해서 부분 이진화작업을 거쳐 추출한 영상이다. 얼핏 잘나온 것 같지만 실상은 그게 아니어서 계속 정확한 값을 잡기 위해 노력했었다. 코는 부분 이진화를 했을 때 가로방향으로 히스토그램이 많이 나오는 것을 선택(Y값)하고 그부분의 중간값(X값)을 중심으로 잡았다.
턱부분을 잡았다. 턱은 같은 피부색 영역 내에서 음영의 차로 잡아야 했다. 육안으로 봤을 때 가로방향으로 V자에 가까운 형태를 가지며 입 아래에 있고 피부색영역에 들면서 얼굴영역과 음영으로 선이 생기는 곳이 턱이다. 그런 턱을 어떻게 잡아야 할까?

위의 사진에서 오른쪽 아래부분은 턱을 추출한 영상이다. 입의 아래부분에서 피부색만 남기고 나머지는 제거한 다음 세로방향으로 길게 잘랐다.(저 작은 영상을 30개로 잘랐다) 그런다음 Histogram평활화를 거치고, 평균값*depth로 이진화 작업을 거쳤다.
양쪽 광대뼈가 있는 부분을 샘플로 피부색을 추출하였다. 일반적인 증명사진을 시험해봤을 때 결과가 좋게 나왔고 낮에 실내에서 촬영한 사진 역시 피부색이 제대로 추출되었다. 하지만 어두운 실내에서 조명을 많이 받는 사진은 이마와 광대뼈 부분이 피부색이 아닌 흰색에 가깝게 촬영되어 오히려 피부색을 죽이고 흰색을 살리는 결과가 나타났다.
이에대한 해결책으로 밝게 촬영되는 광대뼈 부분이 아니라 입술을 추출하기 위해 잡았던 영역에서 입술로 나온 부분을 제외한 나머지 부분을 피부 샘플로 사용하였다. 피부색 추출은 YCbCr을 이용하여 추출하였다. 피부색에서 Cb,Cr의 값은 변화폭이 좁다는 점을 이용한 추출이다. 샘플에서 가장 빈도가 높은 Cb와 Cr값을 추출하고 이 값을 기준으로 일정 범위 내에 있는 값은 피부색으로 추출하고 나머지 값은 버렸다. 위의 사진은 그 결과로 나온 값이며 흰색으로 추출되던 이마와 광대뼈 부분이 피부색으로 인식되지 않았음을 알 수 있다.

특을 추출하는 것도 잡음의 영향을 덜 받도록 조금 수정했는데 침식과 팽창을 이용하여 잡음을 줄였다. 검은색으로 추출된 턱부분에서 실제로 잡는 점은 중간점이 아니라 검은 선의 윗부분을 잡는다.(간혹 튀는 값으로 인해 심한 오차가 생기지 않도록 막기 위해서다)


입술을 추출하는데 gray로 이진화하면 입술의 중간부분과 입고리는 잘 잡는데 비해 입술의 폭은 정확하게 잡아내지 못하는 단점이 있었다. 그래서 개선 한 사항은 휘도를 줄여서 튀는 값인 입술부분을 잡아내자는 것이었다. RGB값에 대해서 각각 아래 연산을 거쳐 휘도를 줄인다는 것이다.
r = R/(R+B+G)
g = G/(R+B+G)
b = B/(R+B+G)
어디까지나 위의 식은 R+B+G의 값이 1이라는 상황에서 사용하는 식이므로 각각255까지의 수를 사용하는 OpenCV환경에서는 *755를 해줘야 했다.
이렇게 해서 잡은 입술영역은 아래와 위는 잘 잡았으나 입고리부분이 정확하지 못했다. 결국 두가지 버젼으로 입술을 구한다음 OR연산을 거쳐 합쳤다. 입고리부분은 표정에 따라 Y값의 폭이 너무 크므로 입고리부분의 Y값은 사용하지 않고 입술의 중심값으로 Y값을 대신 사용하였다.(사진을 보면 특징점과 입고리부분의 Y값이 일치하지 않음을 알 수 있다.)

핵심은 눈을 추출하는 것인데 눈을 추출하는데 가장 많은 알고리즘을 시험해봤고 많은 작업을 거쳤으며 최종버젼에서도 눈을 추출하는데 드는 작업이 가장 많다.
실제로 눈을 추출하는 것은 가장 간단한 방법으로 했다. 수많은 알고리즘과 논문을 시험해봤으나 결과적으로 가장 효과적인 것은 Gray영상을 이진화하는 것이었다. 눈과 눈썹이 하나로 합쳐지도록 Histogram평활화를 사용하였고 경계값을 설정하는 것도 평균값*depth로 하였는데 depth가 가변적이도록 설정하였다.
눈을 추출하고 중심이 맞지 않으면 맞지 않는 각도만큼 역회전하여 눈을 다시 추출한다. 그렇게해서 중심의 Y값이 일치할 때까지 회전하며 최종적으로 나온 눈의 값에서 가로와 세로의 비율을 따진다. 일반적인 사람의 눈이 잡히지 않으면 다시 추출하고 회전하는 과정을 반복한다. (원래 회전은 360도까지 모든 각도로 회전해보고 가장 결과과 좋은 것(histgram이 가로방향으로 가장 많다던가..)을 선택해서 쓰는 것이 좋다. 하지만 내가 취업을 해버리는 바람에 소스코드를 최적화시킬 시간적 여유가 없었다.

턱의 양쪽은 특별한 추출 알고리즘이 없다. Y축은 입술의 중심값을 사용하고 X축은 피부색영역의 외각부분을 값으로 사용한다.
posted by bluelimn 2009.06.02 19:50

나를 심하게 고생시키던 얼굴인식 프로젝트가 드디어 종결됐다.
운좋게도 최종 데모때 매칭률 100%를 자랑했다.ㅎㅎ
시간내서 한번 정리해놔야 겠다.

눈 추출과 입 추출에 있어서는 다른 논문들보다 훨씬 결과가 좋다고 생각한다. 그리고 대부분 제대로 찾지 못해서 포기하는 턱을 잡았다는 것이 기분이 좋다..
그렇긴 해도 영상처리의 특성상 제대로 잡기가 어렵다.
영상처리는 참 어려운 주제인듯 하다.
posted by bluelimn 2009.05.12 21:01

부분적으로 형활화 및 스트레칭을 시켜서 값의 차이를 증폭시켜라.

각 특징점들의 위치를 잡아라. AAM이고 자시고 하나씩 위치를 잡아버려라!

눈코입부분에서 피부색을 추출한 다음 그 값으로 피부색 영역 구분에 평균값으로 이용하라(이 경우 peer처럼 값이 정해진 것보다는 YCbCr의 값으로 하는 것이 유리할 듯.

경계값을 고정값으로 사용하지 마라.

알고리즘을 사용할 때 근거를 반드시 만들어둬라. 무슨 근거에 의해서인지. 책에 나와있거나 논문으로 나와 있거나.
posted by bluelimn 2009.05.10 14:34

눈,코,입의 중심점들을 이어서 각도로 사람을 대분류하는 작업 진행중

개선점:
눈 -  중심점이 정확이 잡히도록 할 것:특히 가로방향
코 - 조명이 한쪽으로 치우치면 코볼이 콧구멍처럼 잡히는 경우가 있다. 이런 경우 x축의 중심점이 이동하게 되므로 세로로 긴 부분은 제거하고 계산해야 한다.
입 - 특별히 개선점은 없음, x점을 코의 중심에서 받아 오는 것은 유의할 점

얼굴형과 함께 대분류로 작업할 수 있을 만큼의 값들은 나온다.

소분류에서는 눈코입 각각의 모양과 다른 다양한 특징점들을 모두 비교해봐야 한다.
posted by bluelimn 2009.05.08 11:44
눈(눈동자와 눈모양을 모두 검출)의 중심을 기준으로 양쪽 기준점이 수평이 되도록 하였다.
코와 입도 부분 히스토그램 평활화를 거친 다음 경계감으로 2진화를 거쳐 입의 세로중심값을 구하였다.

오늘은 일찍 집에 가고 주말동안 코를 이용하여 코의 중심점을 찾고 입도 어느정도 가운데값을 찾도록 해봐야 겠다.

문제점 : 코의 경우 콧구멍이 두개 잡힐 수도 있지만, 고개를 숙일 경우 코의 중심 아래가 어두워져 하나로 합쳐진다. 고개를 옆으로 돌릴 경우 콧구멍이 하나만 잡히고 가끔 코의 중심에 대한 그림자가 대신 잡히기도 한다.
posted by bluelimn 2009.05.07 10:36
얼굴영역 추출과 피부색 추출에 관한 논문이 상당히 많이 있다. 하지만 논문에 나오는 내용이 그다지 믿음직스럽지가 않다.
어제는 HSV에서 Hue값을, YCbCr에서 Cr값을, YUV에서 U값을 가지고 피부색을 추출하면 피부색만 거의 정확하게 추출할 수 있다는 논문을 봤다. 수식도 없고 다만 분포도만 나와있었다.
실제 검사를 해보니 해당 값들의 분포가 상당히 좁아서 사용해도 될 것이라는 생각이 들었다. 하지만 막상 실험을 해보니 peer보다 훨씬 못한 값들이 나왔다. 일부 사진에 맞춰놓은 값을 사용하면 그와 비슷한 환경에서 찍은 사진은 잘 적용이 된다. 하지만 내가 하고 있는 것은 다양한 곳에서 찍은 증명사진으로 얼굴을 구분해내는 작업이기 때문에 논문에 맞추기 위한 사진을 찍을 수는 없다.

그런 면에서 보면 프로젝트를 진행하는 것보다 조작 논문을 쓰는 것이 훨씬 쉽다는 생각이 든다. 물론 자신들도 제대로 실험하고 그 결과를 논문으로 쓰고 싶었겠지만 워낙 잘 안되는 분야다보니 조작된(이라기 보다는 잘 나오는 사진들을 가지고 적용한 결과만 있는) 논문이 많다.

=================================================
눈 부분 추출은 여러가지 방법을 사용해봤는데 결국엔 gray로 바꾼 후에 눈 영역만 가지고 대비를 증가시키는 histogram형활화를 시킨 다음 어두운 부분을 추출하는 것이 가장 결과가 좋았다.
=================================================
오늘은 눈의 중심을 잡고 그 중심을 이용하여 이미지를 회전시키는 작업을 해야겠다. 
지금도 그 부분은 구현되어 있지만 1회 진행하는 것으로 그친다. 그것을 양쪽 눈 중심의 Y값이 같을 때까지 반복수행 해야겠다.
posted by bluelimn 2009.05.01 12:20

그냥 test용으로 작성한 코드라 대강대강 만들었다.
대략 알고리즘은 주변 값들과 비교해서 피부영역이 많으면 피부영역으로 잡고 제거된 부분이 많으면 같이 제거하는 방식이다.

노이즈제거 source


노이즈제거 전
<노이즈 제거 전>

노이즈제거 후
<노이즈 제거 후>
posted by bluelimn 2009.05.01 12:04

ycbcr(EmguCV에서는 YCC)형태의 이미지를 이용하여 피부색 영역을 추출하였다. 이미지 자체에 작업하기보다는 이미지와 같은 size의 int형 2차배열을 생성하여 배열에 label을 붙였다.

피부색을 추출하기 위해 사용하는 알고리즘으로 Peer와 Kismet을 많이 사용하는데 막상 적용해보니 결과가 그리 좋진 않았다. HSV로 이미지를 변환한 다음 Hue 분포를 이용하여 피부영역을 추출하는 것도 꽤 결과가 좋았다. 다만 많은 논문에서 주장하는 것처럼 채도값을 같이 사용하기에는 무리가 있었다.

HSV


Peer


Kismet


YCbCr


허락없이 불펌당한 아기님 사진 죄송;;
hsv가 꽤 괜찮았고.. peer와 YCbCr중 어떤 것을 선택할 지 고민중

posted by bluelimn 2009.04.06 15:09

카메라를 사용했는데 회사에 전화를 해봤더니 WindowXP, OpenCV 0.9, MFC 환경에서만 돌아간다고 한다. dll화 시켜서 우리가 편집을 할 수 없고 소스도 공개할 수 없다고 한다.
결국 C#으로 돌리진 못한다는 말이다.
소프트웨어 지원은 제대로 안 해주지만 노트북에 달려있는 webcam보다 형태인식이 명확해서 꼭 사용해보고 싶다. 그래서 MFC로 영상을 받아와 저장하는 것만 프로그램을 만들고 C#과 연동하여 사용할까 생각중이다.
특징점 추출은 AAM방식을 이용하고 알고리즘을 조금 추가해서 사용할 예정이다.
AAM은 API도 있다고는 하는데 역시 C#용으로 나온 것은 없어보인다. 찾아보고 API용 소스가 있으면 변환해서 사용해봐야 겠다.
posted by bluelimn 2009.04.02 15:18
제안서입니다.;;


기본적으로 opencv를 이용해서 C#으로 만들 예정입니다.
OpenCV는 C언어를 이용하여 MFC로 만들거나 리눅스용 프로그램으로 만드는 것을 유도하는데 C#용 라이브러리로 EmguCV가 있어 그것을 사용하기로 했다.
opencv 1.1을 사용하며 그것을 C#에서 사용하기 편리하도록 도와준다.
하지만 제대로 돌아가도록 보장하진 못한다.
posted by bluelimn 2009.03.15 22:36
제목은 길지만 결국 얼굴영상을 가지고 개인을 식별하는 프로그램을 만들 생각이다. 개인의 사진을 database에 여러장 넣어두고 노화인식 기법을 이용해 특정인을 인증하는 방법은 현재 실용화되어 사용하는 만큼 자료도 많고 성공한다는 보장이 있다. 처음 등장하는 인물으 가지고 기존의 사진들로 유사도를 비교하는 것은 단순 이미지 비교외에는 아직 없는 듯 보인다.

쉽게 갈 수 있는 것들은 openCV 같은 라이브러리에 있는 것들을 쓰겠지만 특징점을 개인을 구별 할 수 있도록 만든다거나 눈코입의 위치를 정확히 잡는 것은 알고리즘을 많이 생각해봐야 한다. 금,토 이틀간 간단히 공부해서 프로그래밍 해보니 emguCV라는 C#용 openCV 라이브러리가 배포되어 있었다. 예제들을 이용해 간단한 얼굴인식 프로그램을 만들었는데 생각보다 지원되는 함수가 많다.(하지만 강력하진 않다.)

어느정도 얼굴인식은 된다. 그건 일단 라이브러리에 있는 것을 이용했다. XML을 동양인을 기준으로 만든 것으로 바꾼다거나 case가 다양한 것으로 바꾸지 않는 이상 개선될 방도가 없다. 눈을 인식하는 함수는 눈만을 잡아야 하는데 코랑 입까지 다 잡아버려서 사용하지 않기로 했다.

일단 얼굴을 대강 나눠서(가로 5등분, 세로 3등분) 눈코입이 있을만한 곳을 강제로 설정해뒀다. 물론 나중에 영상에서 찾는 것으로 바꿔야 한다.
(이유 : 고개를 상하좌우 어느쪽이든 살짝만 틀어도 눈코입의 위치가 달라지기 때문, 그나마 눈이 영향을 덜 받는다.)

특징점을 구하는 함수도 사용해봤다. gray영상에서 추출하는 것이 기본인데 밝은 부위를 집중적으로 잡아서 일단 영상을 2진화 시켜 외각선만 따온 상태에서 잡았다. 일단 특징점은 잡히는데 역시 이것을 그대로 사용하진 못한다. 같은 사람은 같은 자리에 특징점을 잡아야 하는데 이건 같은 사람이 같은 모습으로 있어도 특징점이 달라지니 큰일이다. 기존의 함수를 이용해서 특징점을 정규화 시킬 것인지 아니면 특징점을 직접 잡아낼 것인지 고민해봐야 겠다.
posted by bluelimn 2009.01.11 12:23



이건 올리기도 창피하다...ㅡㅡ;;;
그런 이유로 source는 제거... 이정도는 나중에 필요하면 금방 할 수 있을 것 같다. 3일만에 만들어버린 임베디드 장비들간의 Network 오목게임
나름 게임패킷을 정의하고 주고받는 순서를 정하는 것이 재미있었다.

'Projects' 카테고리의 다른 글

임베디드장비를 이용한 Qt오목  (0) 2009.01.11
2009.01.11 12:16

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

posted by bluelimn 2009.01.11 12:15


아쉬움이 많이 남는 프로젝트다. 나한테 시간이 좀 더 많았으면 훨씬 더 나은 작품이 나왔을 텐데..교수님이 구현결과 발표를 보지 않고 갑자기 일정을 변경해서 보고서 제출로 끝내버려서 점수가 생각보다 적게 나왔다. 아무런 확인도 없이 제출로 끝내버리는 안일한 태도의 교육방식...마음에 들지 않는다.

'Projects > EJB_도서쇼핑몰' 카테고리의 다른 글

도서쇼핑몰(EJB3.0) 최종  (0) 2009.01.11
도서쇼핑몰(EJB3.0) 설계  (0) 2009.01.11
도서쇼핑몰(EJB3.0) 요구분석  (0) 2009.01.11
posted by bluelimn 2009.01.11 12:01

UI를 설계할 때 CSS를 사용했더니 개발 시간이 꽤 단축되었다. CSS에 대해 잘 몰라 책을 찾아보면서 적용했는데 button에 적용하는 것 말고는 다 괜찮았던 것 같다. 그래서 웹에서는 버튼 대신 이미지를 링크해서 버튼 형식으로 많이 사용하나 보다.

'Projects > EJB_도서쇼핑몰' 카테고리의 다른 글

도서쇼핑몰(EJB3.0) 최종  (0) 2009.01.11
도서쇼핑몰(EJB3.0) 설계  (0) 2009.01.11
도서쇼핑몰(EJB3.0) 요구분석  (0) 2009.01.11
posted by bluelimn 2009.01.11 11:56
상태유지 세션빈을 이용하여 장바구니 기능을 구현하는 것이 시스템의 핵심기술이었다.
한 학기간 뭘 어떻게 배웠는지 기억나지 않는 과목이므로 프로젝트를 할 때 필요한 기숙을 독학하다시피 해야 했다. 진행하면서 보니 EJB는 JSF와 꽤 잘 맞는 것 같다.
그동안 주로 사용하던 것이 JSP라 그냥 JSP로 구현했지만 JSF기술도 알아두면 꽤 유용할 것 같다.

'Projects > EJB_도서쇼핑몰' 카테고리의 다른 글

도서쇼핑몰(EJB3.0) 최종  (0) 2009.01.11
도서쇼핑몰(EJB3.0) 설계  (0) 2009.01.11
도서쇼핑몰(EJB3.0) 요구분석  (0) 2009.01.11
2009.01.11 11:42

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


티스토리 툴바