9/10/2011

TCP/IP Chatting Program using CAsyncSocket / C++, MFC / TCP/IP를 이용한 간단한 채팅 프로그램


Created Date : 2011.05.27
Language : C++ /MFC
Tool : Visual Studio C++ 2010
Library & Utilized : CAsyncSocket class
Reference : -
Etc. : -



This source is simple chatting program using CAsyncSocket class in MFC.
The source is useful for someone who want to make chatting program simple and quickly.


--------------------------------------------------------------------
CAsyncSocket 클래스를 이용한 간단한 채팅 프로그램입니다.
처음 채팅 프로그램을 시작하거나 간단하게 데이터 전송을 하고 싶은 분은, 이 소스를 이용해서 쉽게 접근 할 수 있을 것 같네요.


How to calculate R,T between C1 and C2? / matlab source / 두 대의 카메라 Rotation, Translation은 어떻게 계산할까?


 Created Date : 2011.8
Language : matlab
Tool : matlab
Library & Utilized : rodrigues function (Jean-Yves Bouguet)
Reference : -
Etc. : -



There are two camera. These camera is arranged as reference of O.
Rotation and Translation of C1 is 

R1 =  -0.009064 0.985541 -0.169195
       0.969714 -0.032636 -0.242051
      -0.244074 -0.166265 -0.955397

T1 = 4.684369
    -7.384014
    29.614508

And Rotation and Translation of C2 is

R2 =  0.078149 0.984739 -0.155505
      0.971378 -0.040117 0.234128
      0.224317 -0.169351 -0.959688

T2 = -10.151448
     -7.261157
      29.69228


So, What is R, T between C1, C2?

wR = R2*inv(R1);
wT = T2-T1;

This matlab code show this process.
We get wR, wT. And C1 is rotated and Translated by wR, wT. Then, the axis of C1 is laid on C2 exactly. 


<source code>

--------------------------------------------------------------------------
두 개의 카메라가 원점을 기준으로 있다.
C1 카메라의 R,T가 있고 C2카메라의 R,T가 원점을 기준으로 있을때, C1과 C2 사이의 R, T는 어떻게 될까? 다음과 같이 간단하게 계산이 가능하다.


wR = R2*inv(R1);
wT = T2-T1;


이 매트랩 소스 코드는 C1, C2 사이의 R,T를 구하고 그 R,T를 이용해서 C1을 C2로 정확히 옮겨짐을 확인하는 소스입니다.

<source code>

9/07/2011

Multi View Face Detection / C++, OpenCV / 다중뷰 얼굴 검출


Created Date : 2008.1
Language : C++
Tool : Visual C++ 6.0
Library & Utilized : OpenCV 1.0
Reference : AdaBoost Algorithm, Learning OpenCV Book
Etc. : webcam





This source code is Multi-View Face detection.
The program detects variable view of face those are front, 45, 90 and rotated.
There are learned xml files that is made by AdaBoost Algorithm.
Each xml files are the result of learning of front, 45, 90.
Simultaneously, All detectors are running.

I lost this code in the old days. So uploaded source code may be not run well. because it is not last version source code. But It will be useful because the code include same concept.

<source code>


If you have good idea or advanced opinion, please reply me. Thank you
(Please understand my bad english ability. If you point out my mistake, I would correct pleasurably. Thank you!!)
-----------------------------------------------------------




OpenCV의 AdaBoost학습과 검출을 이용하여 정면, 45도, 90도 얼굴 그리고 회전된 얼굴을 검출합니다.각각의 뷰에 대하여 AdaBoost 알고리즘으로 학습하여 검출하였습니다.
회전된 얼굴은 정면 분류기를 이용하되 영상을 회전시켜 적용하도록 하였습니다.
도움 되시길 바라며, 좋은 의견 바랍니다.


예전에 이 소스를 잃어 버려 동영상과 같은 동작이 안될 수도 있습니다.
이 소스가 최종 소스가 아니기 때문입니다.


With Lim Sung-Jo.



SUDOKU source code / C,C++ /스도쿠 소스 코드


Created Date : 2011.4
Language : C/C++
Tool : MS Visual Studio 
Library & Utilized : -
Reference : SUDOKU rule
etc : -

This source code makes SUDOKU number randomly.
When I taught c/c++ to junior students, I gave homework SUDOKU for understanding programming logic. But nobody solve this logic.
I tried to solve the problem. According to my experience, this logic is not easy. ^^

스토쿠 숫자를 랜덤으로 생성 시키는 소스 코드입니다.
좋은 의견 남겨주세요.
감사합니다.




9/06/2011

Conduct an investigation about length of snake. And write sequence number on it's body.

A huge snake has appeared in our village.
If we cannot kill the snake, it is clear that village is damaged by snake.
Many people are under investigation to kill the snake.
We also receive the mission that we write sequence number on it's body.
The number is written as sequence from 1.
Let's solve the problem hurry and save the our village


-Input is txt file.
The name is "input.txt"
Input file consist of like below.
.size of width, size of height
.map information

-output
You should save as "output.txt".
The file include sequence number about snake.

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

어떤 마을에 거대한 뱀이 나타났다.
빨리 뱀을 죽이지 않으면 마을에 큰 피해가 온다.
사람들은 이 뱀을 잡기 위한 여러가지 방법을 조사 중이다.
우리는 마을로 부터 뱀 몸의 마디마다 숫자를 쓰라는 임무를 받았다.
숫자는 1을 시작으로 순차적으로 기록해야 한다.
자~ 빨리 뱀의 마디에 숫자를 쓰고 마을을 구하자~!

입력
마을 가로크기, 마을 세로크기
마을과 뱀을 나타내는 격자

출력
뱀의 마디에 순차적은 숫자로 대체

ex1)
- input.txt -
5 5
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
0 1 1 1 0
0 0 0 0 0

-output.txt-
0 0 0 0 0
0 1 2 3 0
0 0 0 4 0
0 7 6 5 0
0 0 0 0 0


ex2)
-input.txt-
10 10
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0

-output.txt-
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 1 2 0 0 0 0 0 0 0
0 0 3 4 0 0 0 0 0 0
0 0 0 5 0 0 0 0 0 0
0 0 0 6 7 0 0 0 0 0
0 0 0 0 8 9 10 11 0 0
0 0 0 0 0 0 0 0 12 0
0 0 0 0 0 0 0 0 13 0
0 0 0 0 0 0 0 0 0 0



%뱀의 머리는 항상 꼬리나 몸의 위치보다 왼쪽 그리고 위쪽에 존재한다.
%input.txt 파일을 읽어서 output.txt 파일로 출력하는 것을 목표로 한다.
%뱀은 한상 90도로 꺽여있다. 즉, 대각선으로 연결되어 있지 않다!

*Sample code for read file and Dynamic allocation.


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

 //Read Width, Height
 int w,h;
 fscanf(fp,"%d",&w);
 fscanf(fp,"%d",&h);

 //Dynamic allocation about w,h sizes
 int **map;
 map = new int*[h];
 for(int i=0; i<h; ++i)
  map[i] = new int[w];

 //Read map information
 for(int i=0; i<h; ++i)
  for(int j=0; j<w; ++j)
   fscanf(fp,"%d",&(map[i][j]) );

 //Confirmation
 for(int i=0; i<h; ++i)
 {
  for(int j=0; j<w; ++j)
   printf("%d ", map[i][j] );
  printf("\n");
 } 

 //memory release
 for(int i=0; i<h; ++i)
  delete map[i];
 delete[] map;
 //File close
 fclose(fp);

///

9/05/2011

What is a Recursive Call? and Make Fibonacci sequence function using Function of the Recursive Call type.

Recursive call is that this method call oneself.
Specially, Function uses this method.
Below C Source is example for recursive call function.
As you see, Function RF called the RF that is name of oneself.

Now I give you one question.
Please make Fibonacci sequence function using recursive call method.

You can see Fibonacci condition <here>

The LINUX that is name of OS is also recursive call type.
Some people said " LINUX is abbreviation of LINUX is not UNIX. "
Here, LINUX is call LINUX is not UNIX. In this sentence, LINUX is call LINUX is not UNIX again..
so..like that

(((((LINUX is not UNIX) is not UNIX) is not UNIX) is not UNIX) is not UNIX) is not UNIX

This case sink into the infinity roof because there is not escape condition. so we have to be careful when we use recursive call.

<English is very difficult.. Plz someone correct my poor sentence.>

재귀호출이란 자기가 자기자신을 호출하는 방식을 말한다.
특히 함수에서 이런 일을 한다.
이런 재귀호출 함수가 필요한 경우는
어떤 일을 하는 함수가 여러가지 조건에 대하여 똑같은 일을 할 필요가 있을 때이다.
그런데 다시 여러가지 조건이 주어지고 또다시 같은 일을 해야할 때 재귀 호출 함수를 쓴다.
이건 말로 표현하기 무척 어렵다.. ㅎㅎ

한가지 예제를 보자

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

int RF(int A);

void main()
{
printf("%d\n", RF(5) );
}


int RF(int A)
{
int B=0;
if(A>1)
{
B = RF(A-1);
}

return A+B;
}

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

RF함수는 1에서 입력된 숫자까지 더하는 함수이다.
RF함수를 보면 본문안에 다시 자기 자신을 호출하는 것을 볼 수 있다.
이런 방법을 재귀호출이라고 한다.

여기서 문제가 나갑니다.
이런 재귀호출 방식을 이용하여 피보나치 수열의 값을 구하는 함수를 구현해 보시오.
이번에는 좀 어려울 걸.. ㅋㅋ


이런 것도 재귀 호출일까?
LINUX 라는 운영체제가 있다.
그런데 이것은 LINUX is not UNIX의 약자라고 한다. 그런데 여기서 LINUX는 다시 LINUX is no UNIX를 만든다.

따라서 ..
(((((LINUX is not UNIX) is not UNIX) is not UNIX) is not UNIX) is not UNIX) is not UNIX

LINUX is not UNIX에서 LINUX가 계속 LINUX is not UNIX를 생성해 낸다..
이렇듯 재귀호출은 조건 문으로 break를 잘 해주지 않으면 무한 루프에 빠지기 쉽다..