전자계산조직응용 - > 컴퓨터시스템응용기술사

 

 

IT기술사에 관심 있는 분들은 보세요.

 

해당 분야 최고 전문가를 인증해주는 자격증이랍니다.

 

이 자격증에 취지는 IT전문가를 양성하는 것이므로

 

혹여 취득을 못하여도 과정에서 많은 공부를 할 수 있을 것입니다.

 

물론 취득하면 좋겠죠~! 그럼 아래 IT기술사 자격증 2개를 비교해놓은 글을 퍼왔습니다.

 

저는 경력을 쌓아서 도전해봐야겠군요~!ㄱㄱㄱ

 

 

 

 

 

u      정보관리 기술사와 전자계산조직응용 기술사의 차이 및 선택 방법

 

IT 기술사중에서 정보관리 기술사와 전자계산조직응용 기술사의 차이를 설명하기가 참 어렵다. 또한 기술사 시험을 준비하는 사람들에게 어느 종목을 선택해야 하냐고 물을 때 대답하기도 여간 난감한 것이 아니다. 그 이유는 종목의 차이점이나 선택에서의 차이점이 응시자마다 다르게 적용되기 쉽기 때문이다. 하나씩 살펴보자.

 

 

¤      기술사 합격 후 차이점

 

기술사를 합격한 후에는 정보관리기술사(이하 정보관리)와 전자계산조직응용기술사(이하 조직응용)의 차이점을 발견하기란 쉽지 않다. 회사에서 하는 일도 둘로 분리되어서 처리할 일이 거의 없다. 기술사 양성과정에서 강의도 정보관리를 준비하는 사람이나 조직응용을 준비하는 사람 분리해서 강의 하지 않는다. 기술사 합격 후에도 정보관리만 따로 모이거나 조직응용만 따로 모이는 경우도 없다. 외부 강의를 할 때에도 정보관리 기술사 양성과정에서 조직응용 기술사가 강의하기도 한다.

 

즉 합격 후에는 정보관리와 조직응용의 차이점은 많지 않다고 할 수 있는데, 간혹 기술사를 모집하거나 공모할 때 해당 종목이 분리되어 모집 되기도 한다. 최근 5급 공무원 모집할 때 정보관리 기술사만을 모집한 정부부처가 있었고, 다른 곳에서 조직응용 기술사만을 선호하는 곳도 있기는 할 것이다.

 

 

¤      기술사 시험 범위의 차이점

 

1장에서 살펴본 대로 시험과목은 분리되어 있다. 정보관리의 경우 시험과목이 “정보의 구조, 수집, 정리, 축적, 검색 등 정보시스템의 설계 및 수치계산, 기타 정보의 분석, 관리 및 기본적인 응용에 관한 사항”이고 조직응용의 경우 시험과목이 “하드웨어시스템, 소프트웨어시스템에 관한 분석, 설계 및 구현, 기타 컴퓨터 응용에 관한 사항”이다.

 

실제 시험에 있어서는 과목이 엄격하게 분리되어 출제되지 않는다. 지금까지 출제된 문제를 놓고 분석해보면 정보관리에 출제된 문제가 조직응용에 출제되고, 조직응용에 나왔던 문제가 정보관리에 출제된다. 지금까지 경향은 정보관리에 새롭게 나왔던 문제가 조직응용 다음 회차나 그 다음 회차에 나오기도 했다. 차이점을 살펴보면 정보관리에 출제되는 수치계산 문제는 조직응용에 거의 출제되지 않았다.

 


 

¤      출제 비중의 차이점

 

시험 범위에서 차이점이 없는 반면에 출제 비중에는 약간의 차이가 있다. 지금까지 기출문제를 각 종목별로 분석해보면 <표 1-5> 정보관리 기술사 시험의 최근 출제 비중과 <표 1-6> 전자계산조직응용 기술사 시험의 최근 출제 비중의 결과를 얻을 수 있다. 결과를 놓고 보았을 때 두 종목의 공통점은 최신기반서비스에서 거의 절반 정도가 출제된다.

 

최신기반서비스라고 하면 유비쿼터스, DMB, IT-839 등 기업이나 사회에서 기술사 시험 직전에 가장 이슈가 되는 최신 기반 기술에 관한 것으로 대부분의 기술들이 융합(Convergence)되어 특정 학문이나 기술에 속하지 않는 복합 기술이 많다. 또한 최근에 신문이나 학회지, 연구지, 뉴스 등에 많이 나오는 기술들이 대부분이다. 기술사 시험을 준비하는 사람들이 어려워하는 것이 공부를 많이 해도 시험 직전에 공부하지 않으면 불합격하는 가장 큰 요인이기도 하다.

 

정보관리는 최신기반서비스, 경영정보시스템, 소프트웨어공학, 데이터베이스 분야의 순서로 출제가 많이 되는데, 조직응용에 비해서 소프트웨어공학이나 데이터베이스의 출제 비중이 다소 높다. 참고로 정보관리 시험에서는 프로젝트 관리에 관한 사항과 데이터를 관리하거나 활용하는 문제가 조직응용에 비해 조금 많이 출제되는 경향이 있으며, 문제의 수준도 깊이 있는 문제가 출제된다. 또한 경험을 중시하는 경향이 있어서 문제의 유형도 대책, 진단, 절차, 추진 전략, 견해 제시 등이 많이 출제된다.

 

조직응용에서는 최신기반서비스, 경영정보시스템, 소프트웨어공학, 데이터 베이스 순으로 정보관리와 비중면에서는 큰 차이점이 없는 듯 하지만 컴퓨터 네트워크, 컴퓨터구조, 운영체제, 시스템 인프라 등의 출제 비중이 정보관리에 비해 높으며, 문제의 수준도 깊이 있는 문제가 출제된다. 정보관리와 비교해서는 경험 보다는 기술의 깊이 있는 이해와 지식을 묻는 문제가 많다. 또한 정보관리에 비해 골고루 출제되는 경향이 있다.

 

<표 1-5> 정보관리 기술사 시험의 최근 출제 비중과 <표 1-6> 전자계산조직응용 기술사 시험의 최근 출제 비중의 결과가 주는 장점과 단점이 있는데, 장점으로는 종목별 출제 비중을 한눈에 파악할 수 있다는 것이며, 단점은 비중의 차이는 있지만 해당 비중에서 얼만큼의 깊이 있는 문제가 나오는지는 파악하기 어렵다는 것이다. 세부적인 이해는 부록으로 첨부된 시험 문제를 한번 보면서 제 2부 기출문제 분석 방법을 통해서 스스로 비교 검토를 해보아야 한다.

 


 

<표 1-5> 정보관리 기술사 시험의 최근 출제 비중

정보관리

65회

66회

68회

69회

71회

72회

74회

75회

비중

중요도

경영정보시스템

6

3

8

4

6

5

6

6

44

18.0%

★★

최신기반서비스

13

16

17

13

15

7

15

6

102

41.6%

★★★

소프트웨어공학

4

5

4

3

6

8

4

6

40

16.3%

★★

데이터베이스

3

3

 

8

2

9

2

4

31

12.7%

★★

컴퓨터네트워크

1

2

 

3

1

 

4

6

17

6.9%

시스템 인프라

3

2

2

 

1

 

 

2

8

3.3%

컴퓨터 구조

1

 

 

 

 

2

 

1

3

1.2%

합계

31

31

31

31

31

31

31

31

245

100.0%

 

 

 

<표 1-6> 전자계산조직응용 기술사 시험의 최근 출제 비중

조직응용

65회

66회

68회

69회

71회

72회

74회

75회

비중

중요도

경영정보시스템

1

1

3

3

6

4

6

1

25

10.1%

★★

최신기반서비스

18

16

14

10

10

9

12

14

103

41.5%

★★★

소프트웨어공학

1

4

4

8

4

3

3

3

30

12.1%

★★

데이터베이스

1

1

1

2

2

3

5

1

16

6.5%

컴퓨터네트워크

1

2

4

4

5

4

4

7

31

12.5%

★★

시스템 인프라

9

4

3

2

2

3

1

4

28

11.3%

★★

컴퓨터 구조

 

3

2

2

2

5

 

1

15

6.0%

합계

31

31

31

31

31

31

31

31

248

100.0%

 

 

 

 

¤      종목 선택의 방법

 

정보관리와 조직응용의 차이점에 대해서 많은 것을 알아 보았다. 이제 어느 종목으로 응시할 지 선택해야 한다. 선택할 때 우선 자신이 어느 쪽에 강점이 있는지를 알아야 된다. 즉 소프트웨어 공학이나 데이터 베이스에 강점이 있다면 정보관리가 다소 유리할 것이고, 시스템 인프라와 컴퓨터 구조, 네트워크에 강점이 있다면 조직응용이 다소 유리할 것이다.

 

또한 근무 여건도 중요한데, 현재 기획업무나 프로젝트 참여가 많은 경우 정보관리가 유리할 것이고, 시스템 운영이나 서버관리 업무를 한다고 하면 조직응용이 유리할 것이다. 그 동안 공부했던 것도 중요한 요소로 작용이 되는데 대학에서 전공을 전산이 아닌 경영학, 회계 등 경상계통을 전공한 경우는 정보관리가 조직응용 보다는 유리하고, 전공을 소프트웨어공학, 보안, 통계 등을 전공하였다면 조직응용이 유리하다고 할 수 있다.

 

전공은 전산을 하였지만 세월이 많이 지났거나, 학창시절 책에 심취하기 보다는 당구장과 술에 심취한 대다수 사람들도 있다. 이런 경우는 전공은 했지만 전공에 대한 심도 있는 지식은 잘 모르는 경우인데, 너무 낙담하지는 말고 그 동안의 경력과 경험이 어느 쪽에 유리한지 살펴보면 되겠다.

 

이를 종합하여 아래에 종목선택에 대한 표를 구성해 보았다. 이 표를 가지고 자신의 상황에서 점검해 보면서 종목을 선택하는 것도 하나의 방법이 되겠다. 사용 방법은 <표 1-7>의 제시된 기준을 가지고 점수를 부여하고 부여된 점수를 가중치에 곱하여 계산 점수 항목의 해당 종목에 각각 기록하고 전체 합산을 마지막 하단부에 한 후 높은 점수가 나오는 방향으로 선택하면 된다.

 

예를 들어 첫 번째 질문인 “소프트웨어 공학에 대해 잘 알고 있다“에 대하여 보통으로 알고 있다면 점수를 2점을 준다. 이때 정보관리의 가중치는 2점이고 조직응용은 1점이다. 왜냐하면 정보관리가 소프트웨어공학 문제 출제 비율이 높기 때문이다. 결국 정보관리 쪽의 계산 점수에는 4점(2×2)을 주고 조직응용은 2점(2×1)을 준다. 이렇게 전부 점수를 부여하면 계산 점수에는 해당 질문에 대한 점수와 종목별 가중치를 곱한 값이 채워지게 된다. 이를 전부 합하여서 높은 쪽이 자신이 선택하면 다소 유리한 분야가 된다. <표 1-8>는 이해가 안될 경우에 참고를 위해서 작성한 예를 들었다.

 

<표 1-7>의 가중치가 계산된 이유는 여러 가지 통계자료가 활용되었으며, 세부 설명은 생략한다. 그리고 <표 1-7> 정보관리기술사와 전자계산조직응용기술사 선택 기준에 의하여 점수를 부여하였는데 그 차이가 10 이하로 적을 때는 오차 범위 이내에서 비슷하다고 보면 되며, 점수는 단순한 기준을 제시할 뿐 절대적인 것은 아니다. 표에서 제시된 것 이외에 감안해야 할 요소가 더 있기 때문이다.

 


 

<표 1-7> 정보관리기술사와 전자계산조직응용기술사 선택 기준

구분

선택 기준

점수

가중치

계산 점수

관리

응용

관리

응용

지식

소프트웨어 공학에 대해 잘 알고 있다

 

2

1

 

 

데이터베이스에 대해 잘 알고 있다

 

2

1

 

 

시스템 인프라에 대해 잘 알고 있다.

 

1

2

 

 

컴퓨터 구조에 대해 잘 알고 있다.

 

1

2

 

 

컴퓨터 네트워크에 대해 잘 알고 있다

 

1

2

 

 

시스템 보안에 대해 잘 알고 있다

 

2

1

 

 

전공

전공이 전산, 통계 분야이다

 

2

3

 

 

경영학을 전공했다

 

3

1

 

 

업무

기획업무를 1년 이상 해보았다

 

2

1

 

 

보고서 작성 업무를 주로 한다

 

3

2

 

 

프로젝트 관리자 업무를 1년 이상 해보았다

 

3

2

 

 

자바(Java), Servlet, EJB 등을 잘 알고 있다

 

1

3

 

 

시스템 감리 업무를 1년 이상 해 보았다

 

2

1

 

 

시스템 감사 업무나 시스템 통제 업무경험 있다

 

2

1

 

 

기술사

공부

기술사 공부를 2년 이상 하였다

 

2

3

 

 

기술사 답안을 12페이지 이상 작성한다

 

3

2

 

 

잘 모르는 문제도 최선을 다해 답안을 작성한다

 

2

1

 

 

스터디를 안하고 주로 혼자 공부한다

 

1

2

 

 

실전 시험에서 56점 이상을 3번 맞았다

 

1

2

 

 

답안 전개와 논리력이 우수하다

 

3

2

 

 

    

 

 

 

 

 

※ 점수 기준 : 0=해당사항 없음, 1=낮음, 2=보통, 3=높음

 

<표 1-8> 정보관리기술사와 전자계산조직응용기술사 선택 기준 (작성 예)

구분

선택 기준

점수

가중치

계산 점수

관리

응용

관리

응용

지식

소프트웨어 공학에 대해 잘 알고 있다

2

2

1

4

2

데이터베이스에 대해 잘 알고 있다

2

2

1

4

2

컴퓨터 구조에 대해 잘 알고 있다.

1

1

2

1

2

업무

기획업무를 1년 이상 해보았다

2

2

1

4

2

보고서 작성 업무를 주로 한다

3

3

2

9

6

    

 

 

 

22

14

※ 점수 기준 : 0=해당사항 없음, 1=낮음, 2=보통, 3=높음 

(계산점수의 값은 자신이 부여한 점수에 가중치를 곱한 값이다)

부여된 점수에 가중치를 곱한 합이 정보관리가 22점으로 조직응용보다 높으므로 정보관리 선택

 

 

 

¤      종목 선택의 시기

 

지금까지 정보관리와 조직응용의 차이점에 대해 살펴보았는데, 처음 선택한 것을 끝까지 고집할 필요는 없고, 기술사 시험에 합격을 위해서는 한가지만 고집하는 것도 좋은 방법은 아니다. 즉 처음에는 잘 모르기 때문에 그 당시 결정한 종목을 계속해서 밀어 붙이기 보다는 기술사 시험 접수를 보름 정도 남겨놓은 상태에서 종합적으로 분석해서 결정하는 것이 좋겠다.

 

결정할 때 고려해야 할 요소는 어느 종목이 현재 상태에서 자신에게 강점이 있는지 살펴보는 것과 더불어 직전 시험에서의 합격자 수를 보아서 이번에 유리할 종목에 가중치를 조금 주고, 직전 시험에서 면접에서 떨어진 사람을 보아서 면접에서의 경쟁률도 살펴 본 다음 가중치를 주어서 가장 효과적으로 시험에 합격할 수 있는 종목을 선택하는 것이 바람직하다.

 

시험에 합격한 후 해당 종목이 마음에 안 들면 다시 한번 더 다른 종목에 응시할 수도 있을 것이다. 어느 한 종목이라도 합격을 하게 되면 기술사 시험의 메커니즘에 대해 잘 알고 지식의 깊이도 가장 높아져 있는 시기이기 때문에 다른 종목에 합격할 가능성도 매우 높아지게 된다. 실제로 기술사 자격증을 여러 종목 보유한 경우도 계속 공부하다가 한 종목을 합격한 이후에 계속해서 다른 종목의 시험을 응시한 경우가 대부분이다. 필자가 알고 있는 기술사 2분의 경우도 정보관리기술사, 전자계산조직응용기술사, 정보통신기술사를 연달아 합격한 분과 전자계산조직응용기술사, 정보관리기술사, 정보통신기술사, 전자계산기기술사를 계속해서 시험을 응시해서 합격한 경우이다. 기술사 종목을 여러 개 응시한 이유를 물었더니 그 동안 2년 이상 공부한 것이 아까워서 다른 종목도 응시하니 연달아 합격하셨다고 했다.


출처 : [기타] 책: "정보처리기술사 합격방법서(블루오션전략)"

 

Posted by 아몰라

.

마이다스아이티의 수장이신 이형우 대표님의 CEO강연회를 들으러 성대 수원캠퍼스를 다

녀왔습니다.

 

우선 마이다스아이티란 기업에 대해서 간단히 요약드리자면,

 

건설 구조해석 소프트웨어 분야 세계 1

기계 구조해석 소프트웨어 국내 시장 판매 1

건축엔지니어링 분야 국내 점유율 1

World Class 300 최우수 선정 기업

최근 5년간 평균 매출 성장률 24%

이 밖에도 세계 86개국에 소프트웨어 프로그램을 수출 중 이며,

회사의 복지와 연봉 또한 동종업계 최상위 수준이라고 합니다.

 

더 많지만...관심있으신분은 마이다스사이트를  http://www.midasit.com 방문하셔서 보시기 바랍니다. ㅎㅎ

 

 

이것이 바로 판교에 있는 마이다스아이티 건물입니다. 밤에 보면 진짜 멋있습니다. 반짝반짝 불이 꺼지지 않는 건물...ㅎㅎㅎ

 

 

 

 

 

 

대표님 사진인데 직접 못찍어서 인터넷에서 찾아서 올리는.....ㅎㅎ

 

 

본론으로 넘어 가겠습니다.

 

오늘 이형우 대표님의 강연회 주제는 성공인생을 여는 패스워드 였습니다.

 

대표님의 첫 인상은 굉장히 선하셨습니다. 그리고 부산사투리를 쓰셔서 그런지 더 친근하게 들리더군요.

그리고, 입사하게 되면 어학연수 보내주신다고 하셨습니다. 부산으로 ㅋㅋㅋ

 

가장 먼저 말씀해주신 것은 대표님의 성장기를 말씀 해주셨습니다. 처음에는 대우조선에 입사하셔서 복사왕이 되시고 우연히 찾아온 기회에서 번역을 맡게 되고 기회를 놓치지 않고 열심히 한 결과 선배들에게 강의까지 하시게 되셨다고 합니다. 그러다 입사 1년만에 설계분야 프로젝트 매니저가 되셨는데 그렇게 된 게 지금 마이다스아이티 핵심프로그램의 시작이라고 합니다.

 

아마 여기서 저희에게 말씀하고 싶었던 것은 어떠한 상황에서도 좋은 생각(지혜)을 하라고 하신 것 같습니다. 긍정적인 마인드로 매 순간 최선을 다하면 기회는 찾아 온다는 말씀 이신 것 같습니다.

 

다음은 가장 중요한 인생에서 성공하는 법을 말씀해 주셨습니다.

 

인생성공법 - 목표 -> 계획 -> 실행

분명한 목표를 갖고 구체적인 계획을 새우며 그것을 실행하면 성공 할 수 있다고 하셨습니다.

 

물론, 저것을 이루기 위해선 필요한 것이 있습니다. 성공한 사람들의 공통점은

끊임없는 동기부여라고 합니다. 평범에서 비범으로 가는 길이죠.

 

그래서 스스로 동기부여 하는 법 3가지를 말씀해 주셨습니다.

 

첫째, 비전 가지기 – (실행 가능한 것) 단계적, 구체적이어야 한다.

둘째, 강점 찾기 - 장점을 활성화시켜라.

셋째, 기회 찾기 기회와 위기가 없다 -> 상황만 있다. 기회는 누구에게나 찾아오지만 누구에게나 보이는 것은 아니다. 준비된 자만이 볼 수 있다.

 

위에 세가지를 지켜 끊임없는 동기부여를 해봐야겠습니다.

 

 

다음은, 성공의 예로 일본유명인을 예를 들어 주셨습니다.

 

마쓰시타 고노스케(파나소닉 설립자)의 성공비결

가난 -> 경험

허약 -> 운동으로 건강

무학 -> 모든 사람을 스승으로 여겨 배운다.

 

인간의 가장 훌륭한 스승은 시련 이다.

 

마지막으로 성공적인 인생 라이프

헌신 -> 신뢰 -> 기회 -> 재미 -> 몰입 -> 아이디어 -> 성과 ->더 큰 기회 -> 더 큰 재미 -> 더 큰 몰입 -> 더 큰 아이디어 -> 더 큰 성과

 

 

 

요건 기념품! ㅎㅎㅎ 카드 USB~!

Posted by 아몰라

저번주에 구글러 김태원씨의 강연회를 듣고 왔습니다.

가수 김태원 아닙니다...ㅋ

요분 입니다~! 

 

주제는 새로운관점으로 생각하라 라는 주제였습니다.

 

시간이 지나 다는 기억 못하지만

기억나는 얘기가 3가지가 있어서 정리하겠습니다.

 

1. 관점을 깨라!

우리나라 사람들은 주입식 교육에 영향일까요? 고정관념이라는 것이 심하다고 생각됩니다.

예를 들어? 무인자동차가 있습니다.

무인자동차는 어느 회사에서 만들까요?

????????

???????

자동차 회사를 생각하시지 않았나요?

답은 구글입니다.

여기에서 관점은 자동차가 아니라 무인에 있습니다.

 

하지만 대부분의 사람들은 이렇게 생각하죠.

상위개념 - 자동차

하위개념 - 무인자동차

이렇게 위에서 큰 범위부터 아래로 내려오면서 자신의 생각을 좁혀오면서 생각의 틀을 만들어버리죠.

 

자신의 지식에 갇힌 사람이 되지말고 관점을 여러관점에서 개념화 시키지 고 생각한다면

새로운 무언가를 발견 할 수 있지 않을까요?

 

2. 약한 유대의 강점

예를 들어, 제가 무언가 새로운 문제를 해결해야 됩니다. 하지만, 처음 접해보는 것이고 어떻게 풀어야 할지 모를 때 우리는

가장 먼저 어떻게하나요? 가장 가까운 사람들(강한 유대)에게 물어보겠죠?이 사람들은 알 까요?

강한유대를 가진 사람들은 비슷한환경, 비슷한생각을 하고 자란 사람들입니다. 아마도 비슷한 생각을 하고 있겠죠.

약한 유대는 어떨까요? 약한유대를 가진 사람들은 다른 정보를 가지고 있을 확률이 더 높지 않을까요.

바로 이것이 구현된 대표적인 예가 SNS입니다.

약한 유대의 강점이란 SNS의 강점이라고 생각 할 수도 있을 것 같습니다.

 

3. 인문학의 중요성과 애플

잡스 - 인문학과 기술이 만나는 접점이 애플을 만들었다.

이렇게 말했다고 합니다.

감성마케팅을 의미하는 건가 봅니다...애플의 제품들은 모두 직관적이죠.

처음 아이폰과 아이패드를 접하는 사람도 쉽게 사용할 수 있는

직관적인 제품의 중심에는 인문학적인 기술이 있었다고 생각됩니다.

 

우리는 물건을 살 때 리뷰 X - > 블로거 X - > 지인 추천 O

 

처음에 리뷰를 봅니다. 그리고 전문 블로거의 글을 보기도 하죠.

하지만, 우리가 가장 신뢰하는건 지인이 추천해주는 제품이죠.

IT전문가라면 생각해봐야 될 문제는 바로 이것입니다.

지인추천(아날로그적 신뢰) -> 이것을 어떻게 디지털화 시킬 수 있는지

아날로그적 신뢰를 디지털 신뢰로 체계화 시키고 만들 수 있다면 이보다 완벽한 시장이 있을까요?

 

애플을 예를 들어보겠습니다.

 

1. 아이폰을 출시 했습니다.

2. 고객은 만족을 합니다.

3. 고객 스스로가 지인들에게 홍보를 합니다.

4. 홍보를 원활하게 할 수 있는 아이튠즈랑 앱스토어를 만들어 사용자들끼리 공유 할 수 있게 만들었습니다. -  생태게 완성

 

마지막에 시장을 생성하여 애플 생테계를 완성시켰습니다.

 

가장 기업이 바라는 것 입니다.

고객 스스로 홍보하고 판매를 하게 만드는 생태계

애플이 어떻게 이렇게 할 수 있었나 스스로 생각을 해봐야 할 것 같습니다.

직관적이고 인문학이 묻어나는 제품과 잘 다듬어진 시장생성이 답이 아닐까 생각해봅니다..

머리가 잘 정리가 안되서 뒤죽박죽 정리해보았습니다...정말 여태 들었던 강연들중에서 생각을 많이 하게

만든 강연인 것 같습니다. 감동받았음 ㅎㅎㅎ 김태원씨가 쓴 책도 읽어봐야겠군요...그럼 이만 글 줄이겠습니다.

 

 

 

 

Posted by 아몰라

이번에는 메인클래스안에서 처리하는 방법이다.

MyFrame 클래스에서 스윙을 상속받고 리스너 인터페이스까지 사용한다.




MyFrame

 

import javax.swing.*;

import java.awt.event.*;

 

public class MyFrame extends JFrame implements ActionListener

{

    private JPanel panel;

    private JButton b1;

    private JButton b2;

    private JLabel l1;

    private JTextField t1;

    private JTextField t2;

   

 

    public MyFrame()

    {       

         this.setSize(300, 150);

         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         this.setTitle("연습~");

         panel = new JPanel();

         b1 = new JButton("원의 둘레");

         b2 = new JButton("원의 면적");

         l1 = new JLabel("반지름의 길이를 입력해주세요:");

         t1 = new JTextField(5);

         t2 = new JTextField(10);        

         b1.addActionListener(this); //현재 객체를 리스너로 등록하였다.

         b2.addActionListener(this);        

         panel.add(l1);

         panel.add(t1);

         panel.add(b1);

         panel.add(b2);

         panel.add(t2);

         this.add(panel);

         this.setVisible(true);

    }    

   

    public void actionPerformed(ActionEvent e)

    {

        double d;

       

        if(e.getSource()==b1)

        {

            d = Double.parseDouble(t1.getText());

            t2.setText(Double.toString(d *3.14));

        }

        else if(e.getSource()==b2)

        {

            d = Double.parseDouble(t1.getText());

            t2.setText(Double.toString(d *d * 3.14));

        }

    }

}

Posted by 아몰라
이번에는 내부클래스로 만들어서 해보았다.




클래스 하나가 MyFrame으로 들어왔다...

Action클래스가 MyFrame클래스안에 들어옴으로써 private변수들 때문에 만들었던 get set 함수가 필요없어졌다.

외부클래스의 멤버변수들을 자유롭게 사용한다.


MyFrame

public class MyFrame extends JFrame

{

    private JPanel panel;

    private JButton b1;

    private JButton b2;

    private JLabel l1;

    private JTextField t1;

    private JTextField t2;

   

 

    public MyFrame()

    {       

         this.setSize(300, 150);

         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         this.setTitle("연습~");

         panel = new JPanel();

         b1 = new JButton("원의 둘레");

         b2 = new JButton("원의 면적");

         l1 = new JLabel("반지름의 길이를 입력해주세요:");

         t1 = new JTextField(5);

         t2 = new JTextField(10);        

         b1.addActionListener(new MyActionHandler());

         b2.addActionListener(new MyActionHandler());        

         panel.add(l1);

         panel.add(t1);

         panel.add(b1);

         panel.add(b2);

         panel.add(t2);

         this.add(panel);

         this.setVisible(true);

    }

   

    Private class MyActionHandler  implements ActionListener
{       

 

   

    public void actionPerformed(ActionEvent e)

    {

        double d;

       

        if(e.getSource()==b1)

        {

            d = Double.parseDouble(t1.getText());

            t2.setText(Double.toString(d *3.14));

        }

        else if(e.getSource()==b2)

        {

            d = Double.parseDouble(t1.getText());

            t2.setText(Double.toString(d *d * 3.14));

        }

    }

   

}

   

}


Posted by 아몰라





 프로그램설명 - 반지름의 값을 적고...원 둘레와 원의 면적 버튼을 누를시 아래 텍스트필드에 그 값이 나오게 하여라.


1. 먼저 이벤트는 어떠한 행동을 하였을때 발생하는 액션리스너를 이용하였다.

2. 액션리스너를 상속받는 클래스는 외부클래스로 두었다.(이 밖에 내부클래스로 사용하는법과 그 안에 메인클래스에 함수로 사용하는법 세가지가 있다.)

3. 그리하여 총 3개의 클래스로 만들었다.

MyFrame클래스 - 스윙을 이용하여 GUI 환경의 컴포넌트들을 만들고 이벤트를 등록한다.

MyActionHandle 클래스 - 이벤트 발생시 발생되는 행동들이 실행하는 클래스.

MyFrameTest클래스 - 프로그램을 시작한다.




MyActionHandle

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

 

public class MyActionHandler  implements ActionListener //액션인터페이스를 사용

{

    private MyFrame f;  

   

    public MyActionHandler(MyFrame f) //포인터로 MyFrame클래스를 가져온다.

    {

        this.f = f;

    }   

    public void actionPerformed(ActionEvent e)

    {

        double d;       

        if(e.getSource()==f.getButton())

        {

            d = Double.parseDouble(f.getTextField());

            f.setTextField(d *3.14);

        }

        else if(e.getSource()==f.getButton2())

        {

            d = Double.parseDouble(f.getTextField());

            f.setTextField(d*d*3.14);

        }

    }   

}

MyFrame

import javax.swing.*;

 

public class MyFrame extends JFrame //JFrame을 상속받는다.

{

    private JPanel panel;

    private JButton b1;

    private JButton b2;

    private JLabel l1;

    private JTextField t1;

    private JTextField t2;

 

    public JButton getButton(){ //MyFrameprivate 변수로 인해 get set 함수만들기

            return b1;

        }       

    public JButton getButton2(){

            return b2;

        }       

    public String getTextField(){

            return t1.getText();

        }   

    public void setTextField(Double d){

            t2.setText(Double.toString(d));

    }     

 

    public MyFrame()

    {       

         setSize(300, 150);

         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         setTitle("연습~");

         panel = new JPanel();

         b1 = new JButton("원의 둘레");

         b2 = new JButton("원의 면적");

         l1 = new JLabel("반지름의 길이를 입력해주세요:");

         t1 = new JTextField(5);

         t2 = new JTextField(10);        

         MyActionHandler han = new MyActionHandler(this); //리스너클래스 생성

         b1.addActionListener(han); //리스너등록

         b2.addActionListener(han);        

         panel.add(l1);

         panel.add(t1);

         panel.add(b1);

         panel.add(b2);

         panel.add(t2);

         add(panel);

         setVisible(true);

    }    

}

 

MyFrameTest

public class MyFrameTest

{

    public static void main(String[] args)

    {

        MyFrame my = new MyFrame();

    }

}


Posted by 아몰라

출처 - http://kimhj8574.egloos.com/4734597



*** IplImage 관련,  생성과 해제 등

//생성
IplImage *srcimg_R  = NULL;
srcimg_R  = cvCreateImage(cvSize(m_width,m_height), 8, 3);   //cvSize(640,480) 같은 것도 됨
srcimg_R  = cvCreateImage(cvGetSize(src_color), 8, 3);           //요것도 됨.  다른 IplImage 사이즈 받아와서

//요런것도 됨
CvSize img_size;   
img_size.height = ImageHeight;
img_size.width  = ImageWidth;

IplImage* BGR_image = cvCreateImage(img_size, IPL_DEPTH_8U, 3);

//이미지 복사하기
src = cvCloneImage(src_img);  //src가 비어있어야 함.  아니면 메모리 계속 쌓인다
cvCopy(src_img, src_img2);

//0으로 초기화
cvZero(src_img);

//해제
if(srcimg_R)
  cvReleaseImage(&srcimg_R);




*** IplImage 안의 이미지 화소 조절하기

* 간단하지만 속도가 좀 느린 방법
cvGetReal2D(srcimg, i, j);             //높이가 i, 폭이 j
cvSetReal2D(srcimg, i, j, value);    //value는 설정할 값

 


* 약간 복잡하지만 속도가 빠른 방법 (추가)

for(h=0; h<img->height; ++h)

{

     BYTE* pData = (BYTE*)(img->imageData + h*imgData->widthStep);

     for(w=0; w<img->width; ++w)

     {

          // gray image

          BYTE valGray = pData[w];    

 

          // color image (BGR 순서입니다.)

          BYTE valB = pData[w*3];

          BYTE valG = pData[w*3+1];

          BYTE valR = pData[w*3+2];

     }

}




*** 이미지 불러오기, 저장하기
//불러오기
TmpLImg = cvLoadImage("img_InElevator_1_L.bmp");    //간단하게, TmpLImg는 IplImage

//복잡하게
if ((TmpLImg = cvLoadImage("img_InElevator_1_L.bmp")) == 0)  // load left image
{
   printf("%s", "left image file read has failed!! \n");
   return 0;
}

//저장하기
char file_name[20];
sprintf(file_name,"img_R.bmp");            //파일이름 맹글기
cvSaveImage(file_name,srcimg_R);   //srcimg_R 이라는 IplImage를 저장




*** 창 만들고 닫기 등등
//생성
cvNamedWindow("Right Original", CV_WINDOW_AUTOSIZE);

//창 움직이기 - uv 좌표로 배치함
cvMoveWindow("source_color",610,0);

//보이기
cvShowImage( "Right Original", srcimg_R );

//창 닫기
cvDestroyAllWindows();  //모든 OpenCV 윈도우 닫기

//특정 윈도우만 닫기
cvDestroyWindow("Right Original");




*** canny edge detect 사용하기
...
IplImage *canny_R   = NULL;
canny_R    = cvCreateImage(cvSize(m_width,m_height), 8, 1);
...
cvCvtColor(srcimg_R, grayimg_R, CV_BGR2GRAY);   //원본 컬러이미지를 흑백으로 변환하고
cvCanny( grayimg_R, canny_R, 40, 130, 3 );             //그 흑백이미지를 캐니로 변환




*** HLS 이미지로 변환하기
...
IplImage* src_hlsimg = cvCreateImage(cvSize(m_width,m_height), 8, 3);  //HLS 저장할 곳

//각 속성들 저장할 곳 선언
IplImage* Hue         = cvCreateImage(cvSize(m_width,m_height), 8, 1);
IplImage* Intensity   = cvCreateImage(cvSize(m_width,m_height), 8, 1);
IplImage* Saturation = cvCreateImage(cvSize(m_width,m_height), 8, 1);

cvCvtColor(srcimg, src_hlsimg, CV_BGR2HLS);   //src_hlsimg IplImage 구조체에 HLS 이미지 담긴다

cvCvtPixToPlane( src_hlsimg, Hue, Intensity, Saturation, NULL );  //HLS 이미지 각 속성별로 나눔
cvCvtPlaneToPix( Hue, Intensity, Saturation, NULL, hsvVideo2 );  //도로 합치기




*** 창으로 부터 키 입력 받기
...
pressed_key=cvWaitKey(0) ;
  if(pressed_key=='q')    //q 키가 누르면 빠져나가기
    break;
  else if(pressed_key=='c')  //캡쳐 키 누르면 캡쳐
  {
    timer=time(NULL);  //현재시간저장
    t=localtime(&timer); //지역시간
    sprintf(file_name,"img_%4d%02d%02d%02d%02d%2d.bmp",t->tm_year + 1900, t->tm_mon +1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); //파일이름 맹글기

    cvSaveImage(file_name, src_color);

    //확인메시지출력
    printf("%s file saved is success!!\n",file_name);
  }




*** 이미지 크기 줄이기

//생성
pEviMonitor = cvCreateImage(cvSize(m_pImgWidth, m_pImgHeight), IPL_DEPTH_8U, 1);
pEviMonitor2 = cvCreateImage(cvSize(m_pImgWidth/2, m_pImgHeight/2), IPL_DEPTH_8U, 1);  //  1/2 크기로 생성

//크기 줄이기
cvResize(pEviMonitor, pEviMonitor2, CV_INTER_LINEAR);  // For Resize




*** 화면에 글자 쓰기

char s_output_result[50];
CvFont font;
...
sprintf(s_output_result,"sum vector x:%1.3f  y:%1.3f",sumvector_x,sumvector_y );    //우선 sprintf로 문자열 생성
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, 0.5, 0.5, 0, 1);  //이런 저런 설정.
cvPutText(src_color, s_output_result ,cvPoint(15,20),&font,cvScalar(0,255,0));   //cvPoint로 글자 시작 위치 설정(uv)
//void cvInitFont(CvFont* font, int font_face, double hscale, double vscale, double italic_scale, int thickness)




*** 트랙바 생성

int hue_threshold=139;  //Hue 값의 피부색 threshold

cvNamedWindow( "HLS_image", CV_WINDOW_AUTOSIZE );
cvCreateTrackbar("Hue","HLS_image",&hue_threshold,255, NULL );  //중요한 부분은 요거




*** 마우스 입력

void on_mouse( int event, int x, int y, int flags, void* param );
......

cvSetMouseCallback( "LKTracker", on_mouse, NULL );
......

void on_mouse( int event, int x, int y, int flags, void* param )
{
    if( !image )
        return;

    if( image->origin )
        y = image->height - y;

    if( event == CV_EVENT_LBUTTONDOWN )
    {
        pt = cvPoint(x,y);
        add_remove_pt = 1;
    }
}




*** 인클루드 하는 것들

#include <cv.h>          //영상처리를 위한 헤더
#include <highgui.h>   //카메라로 영상을 입력받거나 이미지를 읽어들이고 화면에 보여주기 위한 헤더




*** good feature to track

IplImage *eig_image = NULL;
IplImage *temp_image = NULL;
eig_image  = cvCreateImage(cvSize(width,height), 32, 1);
temp_image = cvCreateImage(cvSize(width,height), 32, 1);

CvPoint2D32f frame1_features[4000];  //추출된 점들 저장하는 장소

int number_of_features; 
number_of_features = 400;  //추출되는 점의 개수를 제한

//안됨.  버전마다 매개변수 다른듯
//cvGoodFeaturesToTrack(src_gray, eig_image, temp_image, frame1_features, &number_of_features, .01, .01, NULL);

cvGoodFeaturesToTrack(src_gray, eig_image, temp_image, frame1_features, &number_of_features, 0.01, 5, 0, 3, 0, 0.04 );
//&number_of_features 로 추출된 점의 개수 나온다.  추출되는 점의 개수를 입력으로 제한함과 동시에 출력도...




*** 캠 입력받기

IplImage *src;       //source 이미지니까 src로 이름지음

//capture for cam
 CvCapture* capture = cvCaptureFromCAM(0);

 //get init scene
 cvGrabFrame(capture);
 src=cvRetrieveFrame(capture);

......
cvGrabFrame(capture);
src=cvRetrieveFrame(capture);
......

cvReleaseCapture( &capture );

//다른 방법
IplImage *src;
CvCapture* capture = cvCaptureFromCAM(0);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH,640);    //잘 안됨
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT,480);

...
src = cvQueryFrame( capture );.
...

// 또다른 방법 (추가)
VidFormat vidFmt = { 1600, 1200, 7.5 };     // 캠 영상의 실제 크기 및 Frame Rate
   
int nSelected = cvcamGetCamerasCount();
    if( nSelected != 0 )
    {
        CRect rtWndCam;
        int nDispWidth, nDispHeight;
  CWnd* pWndCam = GetDlgItem(IDC_STATIC_CAM);
        pWndCam->GetWindowRect(&rtWndCam);
        nDispWidth = rtWndCam.Width();
        nDispHeight = rtWndCam.Height();

        cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE);
  cvcamSetProperty(0, CVCAM_PROP_SETFORMAT, &vidFmt); // 미리 설정된 값으로 고정
//   
cvcamGetProperty(0, CVCAM_VIDEOFORMAT, NULL);  // 시작할때 선택 가능
       
cvcamSetProperty(0, CVCAM_PROP_RENDER, CVCAMTRUE);
        cvcamSetProperty(0, CVCAM_PROP_WINDOW, &pWndCam->m_hWnd);
        cvcamSetProperty(0, CVCAM_RNDWIDTH, &nDispWidth);
        cvcamSetProperty(0, CVCAM_RNDHEIGHT, &nDispHeight);
        cvcamSetProperty(0, CVCAM_PROP_CALLBACK, CallBackCam);

        cvcamInit();
        cvcamStart();
    }
    else
    {
        MessageBox("카메라가 연결되어 있지 않습니다.");
    }




*** Optical Flow
voidcvCalcOpticalFlowPyrLK(
    const CvArr* prev,   // 첫 번째 이미지
    const CvArr* curr,   // 두 번째 이미지
    CvArr* prev_pyr,   // 첫 번째 이미지의 피라미드
    CvArr* curr_pyr,   // 두 번째 이미지의 피라미드
    const CvPoint2D32f* prev_features,   // 첫 번째 이미지에서 원래 점의 위치
    CvPoint2D32f* curr_features,   // 두 번째 이미지에서 찾은 점의 위치
    int count,   // 찾으려는 점의 갯수
    CvSize win_size,   // 탐색 윈도우의 크기
    int level,   // 피라미드의 레벨 지정
    char* status,  // status=1:이동된 위치를 찾은 경우, status=0:이동된 위치를 찾지 못한 경우
    float* track_error,  // NULL
    CvTermCriteria criteria,   // 종료조건
    int flags);   // CV_LKFLOW_INITIAL_GUESSES 등




*** Line Fitting  (polar 코디네이트가 아니라 단점 있음)

int count = 0;        // total number of points  
float *line;     
 
CvPoint  left, right;    

//CvMat point_mat = cvMat( 1, count, CV_32SC2, mid_points );    
//cvFitLine( &point_mat, CV_DIST_L2 , 0, // line[0]:vector_x, line[1]:vector_y               
// 0.01, 0.01,  line );        // line[2]:x_n, line[3]:y_n    
//
long double a, b, c, d, e, f;
////b가 기울기, a가 절편
//b = line[1]/ line[0];       
//a = line[3]- b*line[2];       
b=((float)right.y-(float)left.y)/((float)right.x-(float)right.y);

//left.x=mid_points[0].x;
//left.y=b*left.x+a;

//right.x=mid_points[count-1].x;
//right.y=b*right.x+a;

//CvPoint center;    
//center.x = line[2];    
//center.y = line[3];     // can draw from left to right directly    
//cvLine( processed_image, center, left, CV_RGB(255,255,255), 1, 8 );    
cvLine( Draw_results, left, right, CV_RGB(255,0,0), 1, 8 );    




*** Mean-Shift Segmentation

//입출력 IplImage, spatial과 color radius 매개변수, level of scale pyramid(2 또는 3 적당)
cvPyrMeanShiftFiltering(src_color, src_result, 2, 40, 3);




*** 체스보드 마크 탐지하기

int i;
int nCornerNum = 3 * 3; // number of corners in the chessboard (3 * 3)
int MAX_COUNT = nCornerNum;   // 5000

CvSize pattern_size = cvSize( COL_CHESS_CORNER_NUM, ROW_CHESS_CORNER_NUM );

 
CvPoint2D32f *left_corners = new CvPoint2D32f[nCornerNum];
CvPoint2D32f *right_corners = new CvPoint2D32f[nCornerNum];

int iLeft_corner_count, iRight_corner_count;
 
// Get the number of left and right corners
int iFoundLeft  = cvFindChessboardCorners(pLeftImg, pattern_size, left_corners, &iLeft_corner_count, CV_CALIB_CB_ADAPTIVE_THRESH);
int iFoundRight = cvFindChessboardCorners(pRightImg, pattern_size, right_corners, &iRight_corner_count, CV_CALIB_CB_ADAPTIVE_THRESH);
//////////////////////////////////////////////////////////////////////////

//printf("\n--------------  Marker Results -----------------------------\n");
//printf("Number of Left Corners: %d\n", iLeft_corner_count);

cvDrawChessboardCorners(pLeftImg, pattern_size, left_corners, iLeft_corner_count, iFoundLeft);
cvDrawChessboardCorners(pRightImg, pattern_size, right_corners, iRight_corner_count, iFoundRight);
 /*
 for (i = 0; i < iLeft_corner_count; i++)
 {   
  DrawCorner(pLeftImg, cvPointFrom32f(left_corners[i]));
  //printf("(%d,%d)\t", cvPointFrom32f(left_corners[i]).x, cvPointFrom32f(left_corners[i]).y);
 }
 */

 //printf("\nNumber of right Corners: %d\n", iRight_corner_count);
 //for(i=0; i<iRight_corner_count; i++)
 //{
 // DrawCorner(pRightImg, cvPointFrom32f(right_corners[i]));
 // //printf("(%d,%d)\t", cvPointFrom32f(right_corners[i]).x, cvPointFrom32f(right_corners[i]).y);
 //}

float *plane = new float[4]; // return value
for (i=0; i<4; i++)    // Initialization, even though the plane equation is wrong
{
    plane[i] = 1;  
}
 
// Calculate the plane equation based on the chessboard
if( iLeft_corner_count == iRight_corner_count && iLeft_corner_count == nCornerNum) // Left Corners and right corners should be same
{
    CvPoint *leftPoints = new CvPoint[nCornerNum];
    CvPoint *rightPoints = new CvPoint[nCornerNum];
    for(i=0; i<nCornerNum; i++)
    {
        leftPoints[i] = cvPointFrom32f(left_corners[i]);
        rightPoints[i] = cvPointFrom32f(right_corners[i]);
    }
  
    plane = planeEquationfrom2DPoints(leftPoints, rightPoints, nCornerNum, baseLine, focal, u0, v0);

    // output the plane equation result
    printf("\n-------------------------  Plane Equation ------------------------\n");
    for(i=0; i<4; i++)
    {
        printf("%.4f\t", plane[i]);
    }
    printf("\n");
    //----------------------------------------------------------

    delete [] leftPoints;
    delete [] rightPoints;
}
else
    printf("No Enough Corners For Marker \n");  // should modify

//if (left_corners)
// cvFree(&left_corners);
//if (right_corners)
// cvFree(&right_corners);
 
if (left_corners)
    delete [] left_corners;
if (right_corners)
    delete [] right_corners;
return plane;




*** 히스토그램 평활화 (histogram equalization)

IplImage* Src          = cvCreateImage(cvSize(width,height), 8, 1);   //원본 이미지
IplImage* Equalized = cvCreateImage(cvSize(width,height), 8, 1);   //평활화 된 이미지

cvEqualizeHist( Src, Equalized );




*** OpenCV 외 유용한 코드들


//파일에서 불러오기
FILE *fp = fopen(".\img.txt", "r");

if(fp == NULL) 
    return false;

while (fgets(buffer,BUFFERSIZE,fp))
{
    label = strtok(buffer,ct);
    if(label == NULL)
        continue;

    pDPT[p_index*NUMOFDIMESION] =  (float)atof(label);
    pDPT[p_index*NUMOFDIMESION + 1] = (float)atof(strtok(NULL,ct));
    pDPT[p_index*NUMOFDIMESION + 2] = (float)atof(strtok(NULL,ct));

    pBGR[c_index*NUMOFDIMESION] = (unsigned char)atoi(strtok(NULL,ct));
    pBGR[c_index*NUMOFDIMESION +1] = (unsigned char)atoi(strtok(NULL,ct));
    pBGR[c_index*NUMOFDIMESION +2] = (unsigned char)atoi(strtok(NULL,ct));

    pGray[c_index] = pBGR[c_index*NUMOFDIMESION];

    strtok(NULL,ct);
    strtok(NULL,ct);
    temp = strtok(NULL,ct);

    if(atoi(&temp[1]) <= 0)
    {
        // zero disparity or invalid 3D point
        pDPT[p_index*NUMOFDIMESION] =  INVALID_DEPTH_INFO;
        pDPT[p_index*NUMOFDIMESION + 1] = INVALID_DEPTH_INFO;
        pDPT[p_index*NUMOFDIMESION + 2] = INVALID_DEPTH_INFO;
    }

 

    p_index++;
    c_index++;
}

fclose(fp);

//3D만 가져올 때
char buffer[1024];
char *label;
char ct [] = " ,\t\n";
int index=0;

FILE *fp = fopen(".\img.txt", "r");

if(fp == NULL) 
    return;

while (fgets(buffer,1024,fp))
 {
  label = strtok(buffer,ct);
  if(label == NULL)
   continue;

  p_3Dpt[index*3    ] = (float)atof(label);
  p_3Dpt[index*3 + 1] = (float)atof(strtok(NULL,ct));
  p_3Dpt[index*3 + 2] = (float)atof(strtok(NULL,ct));

  index++;

  if(index>=307200)
   break;
 }

fclose(fp);



//메모리, 용량 절약형 가져올 때
FILE *fp;
fp = fopen(file_name,"rt");

if(!fp)
{
  printf("\ncan not open 3dmfile\n");
  return false;
}

while (fgets(buffer,2000,fp))
{
  label = strtok(buffer,ct);

  if(label == NULL) continue;

  if(!strcmp("ImageWidth",label))
  {
    //m_imagewidth = atoi(strtok(NULL,ct));///samplingratio;
  }
  else if(!strcmp("ImageHeight",label))
  {
    //m_imageheight = atoi(strtok(NULL,ct));///samplingratio;
  } 
  else if(!strcmp("F",label))
  {
    double x,y;
    double x3,y3,z3;
    x  = atof(strtok(NULL,ct));
    y  = atof(strtok(NULL,ct));

    

    x3  = (double)atof(strtok(NULL,ct));
    y3  =  (double)atof(strtok(NULL,ct));
    z3  = (double)atof(strtok(NULL,ct));

    m_p3Dpt[3*(GetWidth() * (int)y + (int)x)  ] = x3;
    m_p3Dpt[3*(GetWidth() * (int)y + (int)x)+1] = y3;
    m_p3Dpt[3*(GetWidth() * (int)y + (int)x)+2] = z3;
    //y3  = -(double)atof(strtok(NULL,ct));

    // SVS ver 3.2 used mm scale
    //x3DPoints.push_back((float)x3*scale);
    //y3DPoints.push_back((float)y3*scale);
    //z3DPoints.push_back((float)z3*scale);

    // SVS ver 4.4 use m scale (model is saved by using m scale)
    //x3DPoints.push_back((float)x3);
    //y3DPoints.push_back((float)y3);
    //z3DPoints.push_back((float)z3);
    //if(idxDB == WCCup) printf("\nx=%f,\ty=%f,\tz=%f",x3,y3,z3);
  } 
}
fclose(fp);



//파일로 저장하기
FILE *fp = fopen("@@_FilterResult.txt", "at+");
fprintf(fp, "%d %f\n", nFrameNum, pEstimatedObjectPose[11]);
fclose(fp);

//메모리 카피
memcpy(src_color->imageData, m_pColorImage, sizeof(unsigned char)*width*height*3);

//3D를 2D로 그리기 (대충)
for(int i=0;i<width;++i)
{
    for(int j=0;j<height;++j)
    {
        if((m_p3Dpt[3*(i+width*j)+2]>0.5)&(m_p3Dpt[3*(i+width*j)+2]<2.0))
            view_3D->imageData[i+width*j]=((m_p3Dpt[3*(i+width*j)+2]-0.5)/1.5)*255;
        else
            view_3D->imageData[i+width*j]=0;
    }

}

 

Posted by 아몰라

'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

얼굴인식의 역사, 이슈, 알고리즘, Process flow, 기본적인 기술 비교  (1) 2011.11.06
이진화하기  (0) 2011.11.02
마우스 이벤트  (0) 2011.10.31
키보드 이벤트 처리  (0) 2011.10.30
문자 출력  (1) 2011.10.30
Posted by 아몰라

출처 http://www.bluenics.com/ , OpencvKorea


Automatic Face Recognition of Behavioral or Physiological Characteristicin Human Body

Ace Recognition Speed
Face Database Size
Development face recognition system
Experiment of Face Recognition

  The 1970's : general pattern classification method
research the features in face (profiles)
  The 1980's : continuous research pattern
  The 1990's : neural network classifier
capacity of real time caculation and adaptation
  The 2000's : concentration of research pattern
xcellent face recognition systems

  Public Method : Skin color method - general method,used combination method
Eigen face method - generalized eigen face, frontal -face focusing view
Neural Networks method - adaptation well in still image,train with face image but not
Features method - flexibility image scale,viewpoint of faces
Combination method - feature base + skin color


  Face recognition
  techniques :
Principal component analysis [S.Romdhani,1997]
Local feature Analysis [P.S.Pensv,1998]
Bayesian face recognition [A.Pentland,1996]
Gabor wavelets and elastic bunch graph matching algorithm [L.Wiskott,1997]
Linear Discriminant analysis [K.Etemad,1996]

  출입관리 보안응용분야 : 출입문 통제시스템
근태관리 시스템
실시간 감시 시스템
  Tcp/Ip 서버기반 응용분야 : 얼굴인식 화상 회의 및 채팅
인터넷 사용자 인증 image bank운영
  PC 기반 응용 분야 : 개인 사용자 로그온
파일 Encription
Screen Saver
  금융분야 응용분야 : CD /ATM Face Recognition Solution
POS Face Recognition Solution
Smart card 내에 얼굴영상등록후,ATM에서 카드인증
  Enterainment 응용분야 : 대화형 얼굴인식 완구
  가상현실 분야 : 3차원 얼굴인식 캐릭터
2차원 애니메이션 캐릭터
  온라인 교육 분야 : 사용자 인증,원격 교육


얼굴을 인식하는 기술은 매우 복잡하고 변수가 많은 기술로서 이의 소프트웨어적인 개발도 최근에 이르러서야 이루어졌습니다.

먼저 카메라가 얼굴의 이미지를 잡으면 소프트웨어가 이를 템플릿(Templates)과 비교하는 것으로 얼굴인식기술은 지칭될 수 있습니다.


얼굴인식의 근간을 이루는 기술은 두 가지로 구분되어지는데 첫번째는 얼굴의 각 구성요소의 특징값과 상호관계- 예컨대 코 길이와 눈으로부터의 거리 등을 비교하는 것이고 두번째는 얼굴의 가장 중요한 이미지 데이터- 예컨대 코의 크기등- 를 데이터베이스에 저장되어 있는 얼굴의 데이터와 비교, 매칭시키는 방법입니다. 이러한 얼굴인식 기술은 여타 생체인식 기술에 비하여 다음과 같은 특징을 가지고 있습니다.


생체인식의 기본 입력테이터가 되는 생체 특성값을 카메라를 통하여 얻게 되므로 근접식 또는 접촉식 기술보다 비교적 먼 거리에서 동작될 수 있습니다. (Recognized in a distance)
인식의 속도가 비교적 빠릅니다. (Relatively high recognition speed)


다수 중에서 특정의 값을 가지는 데이터를 찾을 수 있습니다. (Enough to conduct 1 - to - many searches)
기술의 종류
얼굴의 기학적인 특징을 이용한 인식기술 (Geometrical feature analysis)
눈, 코, 입과 같은 얼굴의 특징점들의 위치나 크기 또는 이들간의 거리와 같은 기하학적 인자들만으로도 각 개개인의 얼굴을 인식할 수 있다는 사실에 착안한 것으로서 이들 기하학적 특징들은 입력화상의 해상도를 낮추었을 때 최종적으로 남는 요소들에 해당합니다. 이는 얼굴인식에서 가장 보편적으로 이용하는 방법론입니다.
Eigenface를 이용한 방법(Eigenface approach)
Eigenface란 '고유얼굴'이라는 의미를 가지는데 이는 MIT대학의 Sirovich와 Kirby에 의해 제안된 방법입니다. 사람얼굴을 저차원격으로 표현(Low - dimentional representation)할 수 있도록 하여 얼굴이미지의 기본요소를 분석(Principal components analysis)할 수 있도록 한 것인데 이 기본요소란 얼굴이미지의 변화를 나타내는 일련의 특징들을 의미하는 것으로 수학적으로 표현하면 하나의 얼굴 이미지군을 나타내는 공변(共變) 행렬(Covariance matrix)의 Eigenvector를 의미합니다. 먼저 위 기본요소들에 입력된 얼굴이미지를 투영시킨 후 이들을 저장된 얼굴이미지의 투영체와 비교하거나 상관시켜 특징들을 추출합니다. 이 추출된 특징들을 'Eigenface'또는 'Holon'이라고 하는데 이것을 가중치를 적용한 다중 템플릿 매칭방법으로 분류할 수 있는 것입니다.
템플릿 매칭을 이용한 방법(Template matching approach)
이는 얼굴이미지를 얼굴 전체를 나타내는 하나의 템플릿 화상과 비교하여 이에 따른 상관도를 분석함으로써 얼굴을 인식하는 방법론입니다.
인공신경망을 이용한 학습형 인식방법(Neural network mapping approach)
이미 여러분야에서 활용되고 있는 신경망 기술을 얼굴인식분야에 접목시킨 것으로서 통계적 분석을 기반으로 하는 신경망의 학습 및 인식기능을 이용하여 얼굴을 인식하는 방법으로 오늘날 가장 큰 비중을 차지하고 있는 방법입니다.

'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

Haar분류기에 대한 정보  (0) 2011.11.16
이진화하기  (0) 2011.11.02
마우스 이벤트  (0) 2011.10.31
키보드 이벤트 처리  (0) 2011.10.30
문자 출력  (1) 2011.10.30
Posted by 아몰라

이진화란?



요즘 카메라로 사진을 찍으면 칼라로 사진을 보통 사진을 찍게 되는데

사람이 보기에는 그냥 빨간색과 검정색옷을 입고 주변 색들도 눈으로 보이는 것과 같지만...

컴퓨터는 조명이나 그림자, 잡영 등에 영향을 받아서 색이 다 다르게 보인다.

그래서 컴퓨터에게 더 쉽게 이해하기 쉬운 영상으로 만들어주는 것이 이진화이다.

검정색과(0) 흰색(255)로 컬러 값을 바꾸는 것이다.



IplImage 타입의 영상을 이진화 하기 위해 사용하는 함수는 cvThreshold라는 함수이며,
이는 입력으로 들어가는 영상의 각 채널을 이진화 한다.
이런 이유로 컬러영상(3개 채널)을 이진화 하는 경우, R, G, B 각각을 이진화 하기 때문에
아래와 같이 의도하지 않은 영상을 얻게 될 수도 있다.



그런 이유 때문에 이진화 전에는 cvCvtColor()를 이용하여 Gray로 변환 후 이진화 한다.
cvCvtColor()의 세 번 째 인수는 어떤 컬러맵으로 변환할 것인지 선택할 수 있으며,
OpenCV에서 제공하는 방법들은 CV_BGR2GRAY 뿐만 아니라 
CV_BGR2YCrCb, CV_BGR2HSV, CV_BGR2Lab 등 여러가지이며 이는 cv.h 파일에서 확인할 수 있다.


cvThreshold() 함수는 실제로 이진화를 수행하는 함수로,
세 번 째 인수는 문턱치를 설정하고,
네 번 째 인수는 문턱치를 넘어선 픽셀들을 어떤 값으로 설정할 것인지를,
다섯 번 째 인수는 이진화 알고리즘을 선택할 수 있다.

중요함수

1.

cvThreshold(const CvArr*  src, CvArr*  dst, double  threshold, double  max_value, int threshold_type)

원본영상, 이진화가 된 후 저장될 영상, 경계가 되는 수치값(임계값), 임계 값을 넘는 픽셀값을 바꿔줄 최대값 설정,이진화방식)


이진화방식

#define CV_THRESH_BINARY      0  //  임계 값 이하 : 0, 임계 값 초과 : 1
#define CV_THRESH_BINARY_INV  1  // 임계 값 이하 : 1, 임계 값 초과 : 0 
#define CV_THRESH_TRUNC       2  // 임계 값 이하는 변화 없음, 임계 값 초과는 임계 값
#define CV_THRESH_TOZERO      3  //   임계 값 이하는 0, 임계 값 초과는 그대로
#define CV_THRESH_TOZERO_INV  4  // 임계 값 이하는 그대로, 임계 값 초과는 0



2.

cvCvtColor( const CvArr* src, CvArr* dst, int code )

원본영상, 변환후 저장될 영상, Color 변환모드


Color 변환모드

CV_RGB2GRAY  - 흑백으로 변환
CV_RGB2YCrCb  -      주로 Skin Color 모델을 할 때 변환
CV_RGB2HLS  - H(Hue색상), L(Luminance,휘도),S(Saturation,채도)
CV_RGB2HSV - 모든 컬러를 Hue, Saturation, Value로 표현하는 방식
CV_RGB2Lab - L은 밝기인 명도, a 조합은 녹색에서 적색의 보색 b 조합은 황색에서 청색의 보색
CV_RGB2Luv -  CIE Yxy색표계에서 지각적 등보성을 보완한 색 공간



결과










[참고] OpenCV 강좌 04. 영상 이진화 하기 (OpenCV KOREA 대한민국 최고의 컴퓨터비젼 커뮤니티)





 

Posted by 아몰라