9/29/2011

The Method to make DLL and using / C++ / Class DLL 만들기

Created Date : 2011.08.
Language : C++ /MFC
Tool : Visual Studio C++ 2008
Library & Utilized : -
Reference : -
Etc. : -



*Make DLL
1. create project



2. create basic class
 3. Add functions


Now, we will  process theses functions in the new class.
Because we donn't want to exposure source code of function.
So we made interface class for dll distribution.

4. Create Class #1
This is class for basic calculation. (+,-,/,*)

5. Create Class #2
This is class for squre, sqrt calculation.


6. Use Class #1, Class #2 in the Dll interface class.

7. Compile and Use dll, lib, h at other program.



*Use DLL
1. Make project


2. Copy lib, dll, h into new project folder.

3. Write dll file name into Additional library

4. Now, let's program using dll


Source code <here>

In the source code, Making DLL and Using DLL projects are included.
And also there is a document but it is written by korean but it is same content with I posted.
Thank you.

Plz give me your valuable opnion.
And I want to your comment about my broken english.











9/27/2011

Copy Constructors, Assignment Operators, Example C++ / 복사 생성자, 대입 연산자 예제 소스

There are A, B and C classes.
C is including A,B classes. and B is including A class.
When copy from C2 to C1, How to make "Copy Constructors, Assignment Operators"?

C c1;
C c2(xx,yy);
c1 = c2;
Below source code is example of these case.

----------------------------------------------------------------------------------------------
#include <vector>
using namespace std;

struct coordi{
 int x;
 int y;
};

class A{
public:
 A():val1(0),val2(0){}
 A(int inV1){
  val1 = inV1;
 }
 A(int inV1, vector<coordi> inV2){
  val1 = inV1;
  val2 = inV2;
 }
 A(const A &in)
 {
  val1 = in.val1;
  val2 = in.val2;
 }
 bool operator = (const A &inA )
 {
  val1 = inA.val1;
  val2 = inA.val2;
  return 0;
 }

 void printfAll()
 {
  printf("class A\n");
  printf("val1 = %d\n", val1);
  for(int i=0; i<val2.size(); ++i)
  {
   printf("val2[%d] - x = %d, y=%d\n", i, val2[i].x, val2[i].y );
  }
  printf("\n");
 }

private:
 int val1;
 vector<coordi> val2;
};

class B{
public:
 //////////////////////////////////////////////////////////////////////////
 B():val1(0),val2(0),class1(){}
 B(int inV1){
  val1 = inV1;
 }
 B(int inV1, vector<coordi> inV2 ){
  val1 = inV1;
  val2 = inV2;
 }
 B(int inV1, vector<coordi> inV2, A inV3 ){
  val1 = inV1;
  val2 = inV2;
  class1 = inV3;
 }
 //////////////////////////////////////////////////////////////////////////
 B(const B &in)
 {
  val1 = in.val1;
  val2 = in.val2;
  class1 = in.class1;
 }
 bool operator = (const B &inB )
 {
  val1 = inB.val1;
  val2 = inB.val2;
  class1 = inB.class1;

  return 0;
 }
 //////////////////////////////////////////////////////////////////////////
 void printfAll()
 {
  printf("class B \n");
  printf("val1 = %d\n", val1);
  for(int i=0; i<val2.size(); ++i)
  {
   printf("val2[%d] - x = %d, y=%d\n", i, val2[i].x, val2[i].y );
  }
  printf("\n");
  class1.printfAll();
 }

private:
 A class1;
 int val1;
 vector<coordi> val2;
};


class C{
public:
 //////////////////////////////////////////////////////////////////////////
 C():val1(0),val2(0),class1(),class2(){}
 C(int inV1){
  val1 = inV1;
 }
 C(int inV1, vector<coordi> inV2 ){
  val1 = inV1;
  val2 = inV2;
 }
 C(int inV1, vector<coordi> inV2, A inV3 ){
  val1 = inV1;
  val2 = inV2;
  class1 = inV3;
 }
 C(int inV1, vector<coordi> inV2, A inV3 , B inV4){
  val1 = inV1;
  val2 = inV2;
  class1 = inV3;
  class2 = inV4;
 }
 //////////////////////////////////////////////////////////////////////////
 C(const C &in)
 {
  val1 = in.val1;
  val2 = in.val2;
  class1 = in.class1;
  class2 = in.class2;
 }
 bool operator = (const C &inC )
 {
  val1 = inC.val1;
  val2 = inC.val2;
  class1 = inC.class1;
  class2 = inC.class2;
  return 0;
 }
 //////////////////////////////////////////////////////////////////////////
 void printfAll()
 {
  printf("class C \n");
  printf("val1 = %d\n", val1);
  for(int i=0; i<val2.size(); ++i)
  {
   printf("val2[%d] - x = %d, y=%d\n", i, val2[i].x, val2[i].y );
  }
  printf("\n");
  printf("class 1\n");
  class1.printfAll();
  printf("class 2\n");
  class2.printfAll();
 }

private:
 A class1;
 B class2;
 int val1;
 vector<coordi> val2;
};

int _tmain(int argc, _TCHAR* argv[])
{
 //////////////////////////////////////////////////////////////////////////
 int sampleV1 = 100;
 vector< coordi > sampleV2;
 for(int i=0; i< 10; ++i)
 {
  coordi tCoordi;
  tCoordi.x = i;
  tCoordi.y = i*i;
  sampleV2.push_back(tCoordi);
 }
 //////////////////////////////////////////////////////////////////////////
 A cA1;
 cA1.printfAll();

 A cA2(sampleV1);
 cA2.printfAll();

 A cA3(sampleV1, sampleV2);
 cA3.printfAll();
 printf("===============\n");
 //////////////////////////////////////////////////////////////////////////

 B cB1;
 cB1.printfAll();

 B cB2(sampleV1, sampleV2);
 cB2.printfAll();

 B cB3(sampleV1,sampleV2,cA3);
 cB3.printfAll();

 B cB4(cB3);
 cB4.printfAll();

 B cB5;
 cB5 = cB4;
 cB5.printfAll();
    //////////////////////////////////////////////////////////////////////////

 C cC1;
 cC1.printfAll();

 C cC2(sampleV1);
 cC2.printfAll();

 C cC3(sampleV1, sampleV2);
 cC3.printfAll();

 C cC4(sampleV1, sampleV2,cA3);
 cC4.printfAll();

 C cC5(sampleV1, sampleV2,cA3,cB3);
 cC5.printfAll();

 C cC6(cC5);
 cC6.printfAll();

 C cC7;
 cC7 = cC5;
 cC7.printfAll();

 return 0;
}

You can download source code <here>.

9/11/2011

When the sparse bundle adjustment(v1.6) make c++ project source using CMake (v2.8.4), Do you know Why warning message occur?

Firstly, I downloaded SBA(Sparse Bundle Adjustment v1.6) from <here>.
And I prepared CLAPACK Lib from <here>.
And My CMake version is 2.8.4.

Step 1. Directory setting


Step 2. Configuration, Fininsh(in ppoup window, after generator selecting(in my case - vs 2008)


Step 3. After Step2. I modify wrong property in the list(red color)



Step 4. Re-Configure


Step 5. Some Warning is appeared. but I do the Generation progress.


Step 6. In my target directory, project files is generated by cmake. but I can not be sure whether It made well or not?


Who can help me? Why did these warning message appear? How do I do to correct warning message? Plz give me your thought. Thank you!!

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를 잘 해주지 않으면 무한 루프에 빠지기 쉽다..











9/02/2011

Simple Image Processing Tool / C++ Source(MFC, OpenCV) / 간단한 영상처리 툴

Created Date : 2008.10
Language : C++(MFC)
Tool : Visual C++ 6.0
Library & Utilized : OpenCV 1.0
Reference :  Image Processing Book, Learning OpenCV
etc. : -



When I teach Image Processing to undergraduate students,  this program is made for practicing programming.
This code includes simple image processing method.

ex) Image adding, reverse, Lookup Table making, Gamma adjusting, Image Zoom in/out, Rotation, Morphology, Histogram Drawing, Stretching, Laplacian, sovel, RGB, HSI, YCbCr..

The code may be useful to beginner studying image processing , MFC and OpenCV.


<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!!)---------------------------------------------------------------------------



간단한 영상 처리 소스
RAW 를 오픈하여
2영상 더하기, 역상계산, 룩업데이블 생성, 감마 조절
영상 축소, 영상확대, 영상 회전
모폴로지, 히스트그램 그리기, 스트레칭, 평활화
라플라시안, 평화화 소벨
을 처리함
또한 BMP 파일을 오픈하여 RGB, HSI, Ycbcr로 채널을 분리한다.
그리고 OpenCV를 이용하여
영상 밝기 조절, 크기 조절, 회전, 이진화, 팽창, 수축, 필터를 적용해 본다.

압축 파일에 소스, 이미지, 간략한 설명 문서가 있음



<source code>



좋은 의견이나 답변 남겨 주세요.

SICK LMS sensor communication interface / C++ source code (MFC) / SICK 레이져 센서 커뮤니케이션 소스


Created Date : 2010.6
Language : C++(MFC)
Tool : Visual C++ 6.0
Library & Utilized : -
Reference :  Sensor Manual, Internet Reference
etc. : SICK sensor, serial cable, power cable ... some equips about SICK









This program is SICK LMS communication application.
I made this code when I prepare 'Unmanned vehicle competition - hosted Hyundai-Kia'.
Communication method is Serial.
This zip file includes manual of SICK and useful site about LMS sensor.





reference is here http://study.marearts.com/2011/09/sick-lms-sensor-inteface-c-mfc.html

source code is here https://github.com/MareArts/LMS-Laser-sensor




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




SICK LMS센서와 Serial 통신을 통하여 포트를 열고,
LMS센서의 스캔 데이터를 받아서 화면에 그려주는 소스.
LMS의 보오드, 스캔 레졸루션, 단위를 설정할 수 있다.
마우스 휠을 통하여 그려주는 화면을 축소,확대 할 수 있다.
(SICK 메뉴얼 포함, LMS설명 관련 사이트 캡쳐 파일 포함)


Stereo Feature Tracking for visual odometry (document)




Created Date : 2011.2
Reference :
Robust and efficient stereo feature tracking for visual odometry
stereo odometry - a review of approaches
multiple view geometry




How to get 3D point when we know feature image points of right and left camera?
How to propagate error? if we get the 3D point that calculated including stereo distance error.
If we know translated two 3D point, How to optimize error of R, T?
This document introduces about these problems.


- contents -

① Stereo Image Point :
Left Image Image
Camera Parameters :
Focal Length f, Principal point , Baseline B
Homogeneous Point
,
Non-Homogeneous Coordinate
-(stereo odometry A Review of Approaches)
ing in Stereo Navigation L. Matthies
Noise Propagation
X point Gaussian
Mean , Covariance
X Point(3D) mean, covariance ?
f is nonlinear function of a random vector with mean , covariance
② 3D point Covariance
~ Multiple view Geometry Nonlinear Error Forward propagation
③ Estimation of motion parameters
3D points ,
X:before motion, i-th:interest point, Y:after motion
Unique solution
(X, Y will be disturbed by same amount of noise)
Mean square error
Becomes minimal?
Several solutions.
- A solution based a singular value decomposition.
- A solution based on Essential Matrix.
- A maximum likelihood solution.
④ Maximum likelihood solution


<Doc> <PDF>


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!!)

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

스테레오 카메라에서 특정 점에 대한 왼쪽 영상에서 x,y점 오른쪽 영상에서 x,y점 을 알때 3D point를 어떻게 구할까?
3D을 구했을때 스테레오 영상에서 포함된 에러가 3D point에 에러가 어떻게 전파될까?
이동된 두 3D point가 일을때 어떻게 하면 에러를 최소화하는 R, T를 구할수 있을까?
이런 질문들에 대한 내용에 대한 솔루션을 다룬다.


<Doc> <PDF>


좋은 의견이나 답변 남겨 주세요.

Kalman Filter hand note / 칼만 필터 손으로 정리한 노트




Created Date : 2008.6
Reference : Probabilistic Robotics


When I studied 'Probabilistic Robotics Book', I organized Kalman filter theory by hand.
This document may be poor, because that time, understanding about kalman is insufficient.
You can download zip file. <here>


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!!)

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

Probabilistic Robotics (sebastian thrun, wolfram burgard, dieter fox)의 저서에 나오는
칼만 필터에 대하여 손으로 정리하였습니다.


베이즈 필터 정리
-베이즈 필터 알고리즘 유도
칼만 필터 조건
-칼만 필터의 선형 조건, 가우시안 조건 설명
칼만 필터 알고리즘
-칼만 필터 동작 원리 그림과 수식으로 표현
칼만 필터 수학적 증명 6page
- 예측, 입력, 업데이트 파트 정리



이 문서를 만들 당시 칼만필터에 대한 이해가 부족하여서, 좋은 자료가 될지 모르겠습니다. ^^
전체 파일은 여기서 다운 받을 수 있습니다. <here>


좋은 의견이나 답변 남겨 주세요.