Books2011. 10. 25. 15:07
계속 출장다니고 미팅 다니느라 독후감을 따로 올리지 않고 있어서..
그동안 읽은 책들과 읽을려고 산 책들을 올려봅니다.

읽은 책들


아이디어 맨
- 폴 앨런 저
- 안진환 역
- 초반부는 흥미 진진, 후반부는 지루.. 특히 돈을 물쓰듯이 쓰는 이야기는 은근히 화가남.. 


철학이 필요한 시간
- 강신주 저
- 사계절
- 심오한(?) 철학을 하나의 장으로 축약하기에는 어렵지 않을까 생각했는데, 그 생각을 바꾸게 해줌.. 



눈먼 자들의 경제
- 마이클 루이스 외 12인
- 김 정해 역
- 한빛 비즈
- 소설처럼 읽혀 질거라 생각하였지만, 르포 라이터 형식의 글. 읽기가 조금 어렵다. 
  우리가 얼마나 경제 주체에서 벗어나 있는가를 잘 일깨워 주는 책



제대로 시켜라
- 류 량도
- 샘앤 파커스
- 우리나라에도 자기 개발서가 좋은 책이 많다는 것을 알려주는 책..
   나의 업무 지시 스타일은 비굴형(?) 과 폭군형이 혼재하는 것 같다. 



  


만약 고교 야구 매니져가 피터 드러커를 읽으면 ?
- 이와사키 나쓰미 저
- 권일영 역
- 고교 야구와 미소녀(?) 그리고 피터 드러커의 생경한 조합 하지만, 흥미 진진


읽을려고 대기중인 책들 ( 한무더기인데.. LIFO 정책에 따라서.. )

닥치고 정치
- 유명한 책, 한마디로 뜨는 책... 

Steve Jobs
- 오늘 입고한 따끈한 책

글자로만 생각하는 사람, 이미지를 창조하는 사람
- 한번 읽어보자
-> 읽은 결과 비추 입니다.
-> 서평에 속아서 샀다는 느낌.. 

자기 혁명...
- 요새 제일 좋아하는 박경철 선생님의 책

그외 다수...


 

'Books' 카테고리의 다른 글

6월 말까지 읽은 책들 모음  (2) 2012.07.11
이번 분기에 읽은 책 (4월까지..)  (0) 2012.04.20
거꾸로 배우는 소프트웨어 개발  (0) 2011.08.28
저녁싸리정사  (0) 2011.08.08
안도 타다오의 도시 방황  (0) 2011.08.03
Posted by GUNDAM_IM
Animation2011. 10. 10. 09:14
10/10일은 린 민메이 양의 생일입니다.
인류가 낳은 최후 / 최고의 슈퍼스타 린 민메이가 태어난 날이죠..

 

아무리 그 후에 많은 히로인이 등장해도 린민메이를 능가할 히로인은 없습니다. (단언.. 도장 쾅..)
그런면에서 보면 개인적으로는 이치죠 히카루 이넘이 나쁜넘이죠..  
ㅋㅋ

어찌되었던.. 오래간만에 에니메이션 포스팅이네요.. 

 

'Animation' 카테고리의 다른 글

아~~!! F.S.S.  (0) 2013.04.11
GUNDAM-AGE를 보면서~  (0) 2012.02.27
다시보는 Z 건담  (1) 2011.03.15
건담 팬들을 위한 부천 판타스틱 영화제  (2) 2010.05.26
강식 장갑 가이버 2005  (0) 2009.12.01
Posted by GUNDAM_IM
MAC Life2011. 10. 6. 12:34
인터넷에 올라와 있는 마지막 키노트 후의 사진입니다.
웬지...




 
Posted by GUNDAM_IM
Computer Vision2011. 10. 5. 21:07
3D Noise Reducton algorithm 을 테스트 하고 있습니다.

이미지는 아래와 같은데, 이것을 동영상으로 보면 유투브에서 너무 압축이 많이 되어서 잘 드러나지가 않네요


왼쪽 그림이 잡음 제거 전 오른쪽 그림이 잡음 제거 후입니다.
가우시안 잡음을 1단계로 주었을 때의 영상입니다.

 
위의 영상은 가우시안 잡음을 표준 편차를 0.003으로 주었을때의 영상과 그때의 잡음 제거 결과입니다.
잡음이 정말 많기 때문에 완전하게는 제거를 못하지만, 하여튼  하드웨어로 구현하기에는 쓸만한 성능입니다.
 
요 영상을 유투브에 올려서 링크를 걸려고 하였는데
동영상은 압축이 너무 많이 되어서 잡음이 오히려 표현이 안되네요 



 


  



최근에 원더걸스 동영상으로 테스트한 화면입니다.
노이즈 레벨을 강하게 하였습니다.

 

'Computer Vision' 카테고리의 다른 글

Optical Flow에 의한 영상 정보 분석  (0) 2013.05.28
OpenCV를 이용한 Face Detection  (0) 2013.05.19
OpenCV 2.3 Computer vision (4)  (4) 2011.09.14
OpenCV 2.3 Computer vision (3)  (0) 2011.09.06
OpenCV 2.3 Computer vision (2)  (0) 2011.09.05
Posted by GUNDAM_IM
Hobby2011. 9. 23. 13:16
DQ9 완파 이후에 이 접어 두었던 NDS를 꺼낸것은
BlueFish님의  뽐뿌질 때문이었습니다. 
안그래도 요새 할만한 게임이 없다고 심심해 하던 차에..  딱 눈에 띤 뽐뿌... 

 
이름하야 젤다의 전설-몽환의 모래시계
 
니텐도의 프랜차이즈 케릭터인 젤다를 가지고 모험을 즐기는 것입니다.
도입부를 하는 중인데 아기자기 퍼즐의 연속이네요.. 
특히 부머랭으로 트릭을 해쳐나가는 것은 참신한 아이디어 입니다. 

심심할때 외근나갈때 하면 좋을듯...

DQ9 완파 이후 오래간만에 완파에 도전하는 게임이 될 것 같습니다.

 
Posted by GUNDAM_IM
Computer Vision2011. 9. 14. 13:33
Using the mean shift algorithm to find an object

 Histogram projection으로 원하는 위치의 Histogram을 바탕으로 움직이는 물체를 추적할 수 있습니다. 이에 대한 대표적인 알고리듬이 Mean Shift Algorithm입니다.  이 절에서는 이것을 이용해서 실제 움직이는 물체를 추적하는 것을 해보겠습니다.

별도의 복잡한 알고리듬을 계속 사용하는 것이 아니라서 추적에 약간의 버그가 있음을 미리 알려드립니다.
- 책에 있는 내용에서 버그를 약간 수정한 버전입니다.


QT에서 QT Console로 프로젝트를 만듭니다. 
- 반드시 Qt일 필요는 없지만, 따로 빌드 스크립트 만드는게 귀찮아서 여기서합니다.
- 까짓거 속도가 좀느려도 어떠냐 라는 생각도 있습니다. ㅋㅋ


코드는 아래 것을 보시기 바라고 코드를 그대로 읽어보면 아래와 같습니다.

STEP 1 일단 이미지를 읽어들여서 관심 영역을 설정합니다.
 여기서는 움직이는 차량을 대상으로 합니다.

안타깝게도, 관심 영역은 자동으로 하지 못하므로 일일이 손으로 지정해야 하는 단점이 있습니다.
GIMP에서 픽셀단위로 위치를 확인합니다.


    // Set ROI
    cv::Mat imageROI = image(cv::Rect(127, 170 , 120 , 80));
    cv::rectangle(image,cv::Rect(127, 170 , 120 , 80),cv::Scalar(0,0,255));

그리고 화면에 보이기 위해서 사각형을 하나 그립니다.

그것이 이 아래의 그림입니다.



Step 2 : Hue의 Saturation을 구합니다. 

코드는 아래와 같습니다.

    // Get HUE histogram
    ColorHistogram hc;
    int minSat = 65;

    //cv::MatND colorhist = hc.getHueHistogram( imageROI ,  minSat );
    cv::MatND colorhist = hc.getHueHistogram( imageROI );


실세로는 Class로 선언된 ColorHistogram class에서 GetHueHistogram을 호출하여 가지고 옵니다.
그리고 그 대상은 관심 영역을 대상으로 합니다.

해당 함수는 아래와 같습니다.

	// Computes the 1D Hue histogram with a mask.
	// BGR source image is converted to HSV
	cv::MatND getHueHistogram(const cv::Mat &image) {

		cv::MatND hist;

		// Convert to Lab color space
		cv::Mat hue;
		cv::cvtColor(image, hue, CV_BGR2HSV);

		// Prepare arguments for a 1D hue histogram
		hranges[0]= 0.0;
		hranges[1]= 180.0;
		channels[0]= 0; // the hue channel 

		// Compute histogram
		cv::calcHist(&hue, 
			1,			// histogram of 1 image only
			channels,	// the channel used
			cv::Mat(),	// no mask is used
			hist,		// the resulting histogram
			1,			// it is a 1D histogram
			histSize,	// number of bins
			ranges		// pixel value range
		);

		return hist;
	}

이미지를 RGB에서 HSV로 바꾼뒤에 이중에서 Hue에 대한 것만 찾아서 Histogram을 만들어갑니다. 
Histogram을 만드는 함수는 다시 OpenCV내에 함수를 사용했습니다.
여하튼 이렇게 해서 Hue에 대한 Histogram을 얻어냅니다.

Step 3  ObjectFinder에서 finder를 선언합니다.
그리고 Search에 필요한 히스토그램 데이터를 설정합니다.
코드는 아래와 같습니다.

    // Object Finder
    ObjectFinder finder;
    finder.setHistogram(colorhist);
    finder.setThreshold(0.2f);


setHistogram은 아래와 같은 함수입니다.

	// Sets the reference histogram
	void setHistogram(const cv::MatND& h) {

		isSparse= false;
		histogram= h;
		cv::normalize(histogram,histogram,1.0);
	}

주어진 histogram데이터를 0~1사이에서  normalize시켜서 보관한다.

finder.setThreshold(0.2f);

은 그냥 내부 변수중 Threshld값을 0.2f로 설정해준다. 이 값은 나중에 연산할 때 사용한다.

Step 4 : 이미지를 HSV로 변경한 후에 이미지를 분할한다. 

    //convert to HSV space
    cv::cvtColor(image, hsv, CV_BGR2HSV);

    //split image
    vector<cv::Mat> v;
    cv::split(hsv,v);

HSV의 image를 다시 각각의 컬러 값들을 V plane으로 분리시켜둡니다.
이는 H값만을 대상으로 작업하기 편하게 만든 것입니다.
v[1]이 H값입니다.

Step 5 : Threshold를 찾아서 마스킹 시킵니다.

    // Identify pixel with low saturation
    cv::threshold(v[1],v[1], minSat, 255,cv::THRESH_BINARY);

이렇게 해서 얻은 이미지는 아래와 같다.



Step 6 HUE에 대한 Backproject을 얻습니다.

    // Let's obtain backrojection of the hue channel
    // Get back-projection of hue histogram
    int ch[1]={0};
    cv::Mat result= finder.find(hsv,0.0f,180.0f,ch,1);
    cv::namedWindow("Result Hue");
    cv::imshow("Result Hue",result);

 

결과 이미지는 아래와 같다.


- 약간 뭔가 이상한 그림이긴 하지만, 하여튼 결과는 위와 같다.

그리고 Low와 Saturation시킨 그림을 마스킹 시켜서 이미지를 다시 얻는다.

    // Eliminate low saturation pixels
    cv::bitwise_and(result,v[1],result);
    cv::namedWindow("Result Hue and");
    cv::imshow("Result Hue and",result);

 이미지는 아래와 같다.

앞서의 이미지보다는 약간 정돈된 느낌을 주지만, 뭐...



Step 8 : 두번째 이미지를 읽어들여서 HSV로 바꾼뒤에 다시 H 값을 얻습니다.
이 코드는 앞서 설명한 코드와 동일한 부분이므로,  그냥 Pass
그리고 나머지 부분도 그대로 앞서와 동일한 코드이므로 그대로 진행합니다.


Step 9 :  마지막으로 MeanShift를 수행합니다.

     cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER,10,0.01);
     cout << "meanshift= " << cv::meanShift(result,rect,criteria) << endl;

이렇게 얻은 사각형을 이미지에 그리고 화면에 출력합니다.
이렇게 얻어낸 이미지는 이 글의 마지막에 있습니다.



완성된 코드는 아래와 같습니다.

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

#include <QtCore/QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/contrib/contrib.hpp>

#include "colorhistogram.h"
#include "objectFinder.h"
 



int main(int argc, char *argv[])
{
    cv::Mat hsv;

    QCoreApplication a(argc, argv);

    // Read Data
    cv::Mat image = cv::imread( "./0172.jpg" );
    if (!image.data)
            return 0;
 

    // Set ROI
    cv::Mat imageROI = image(cv::Rect(127, 170 , 120 , 80));
    cv::rectangle(image,cv::Rect(127, 170 , 120 , 80),cv::Scalar(0,0,255));
 

    //Display Origitanl Image
    cv::namedWindow("Image 1 :: Orignal");
    cv::imshow("Image 1 :: Orignal",image);
 


    // Get HUE histogram
    ColorHistogram hc;
    int minSat = 65;
 

    //cv::MatND colorhist = hc.getHueHistogram( imageROI ,  minSat );
    cv::MatND colorhist = hc.getHueHistogram( imageROI );
 


    // Object Finder
    ObjectFinder finder;
    finder.setHistogram(colorhist);
    finder.setThreshold(0.2f);
 


    //convert to HSV space
    cv::cvtColor(image, hsv, CV_BGR2HSV);
 

    //split image
    vector<cv::Mat> v;
    cv::split(hsv,v);
 

    // Identify pixel with low saturation
    cv::threshold(v[1],v[1], minSat, 255,cv::THRESH_BINARY);
    cv::namedWindow("Saturation");
    cv::imshow("Saturation",v[1]);
 

    // Let's obtain backrojection of the hue channel
    // Get back-projection of hue histogram
    int ch[1]={0};
    cv::Mat result= finder.find(hsv,0.0f,180.0f,ch,1);
    cv::namedWindow("Result Hue");
    cv::imshow("Result Hue",result);
 

    // Eliminate low saturation pixels
    cv::bitwise_and(result,v[1],result);
    cv::namedWindow("Result Hue and");
    cv::imshow("Result Hue and",result);
 


    // load second image
    image = cv::imread("./0181.jpg");

    // Display image
     cv::namedWindow("Image 2");
     cv::imshow("Image 2",image);
 

     // Convert to HSV space
     cv::cvtColor(image, hsv, CV_BGR2HSV);

     // Split the image
     cv::split(hsv,v);

     // Eliminate pixels with low saturation
     cv::threshold(v[1],v[1],minSat,255,cv::THRESH_BINARY);
     cv::namedWindow("Saturation");
     cv::imshow("Saturation",v[1]);
 

     // Get back-projection of hue histogram
     result= finder.find(hsv,0.0f,180.0f,ch,1);

     cv::namedWindow("Result Hue");
     cv::imshow("Result Hue",result);
 

     // Eliminate low stauration pixels
     cv::bitwise_and(result,v[1],result);
     cv::namedWindow("Result Hue and");
     cv::imshow("Result Hue and",result);
 

     // Get back-projection of hue histogram
     finder.setThreshold(-1.0f);
     result= finder.find(hsv,0.0f,180.0f,ch,1);
     cv::bitwise_and(result,v[1],result);
     cv::namedWindow("Result Hue and raw");
     cv::imshow("Result Hue and raw",result);
 

     cv::Rect rect(127, 170 , 120 , 80);
     cv::rectangle(image, rect, cv::Scalar(0,0,255));

     cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER,10,0.01);
     cout << "meanshift= " << cv::meanShift(result,rect,criteria) << endl;

     cv::rectangle(image, rect, cv::Scalar(0,255,0));
 

    // Display Image
    cv::namedWindow("Image Result");
    cv::imshow("Image Result",image);
 

    cv::waitKey();
    return 0;


}


트래킹된 결과는 아래와 같습니다.


 위의 두개의 이미지를 가지고 자동차의 움직임을 추적하는 것입니다.




'Computer Vision' 카테고리의 다른 글

OpenCV를 이용한 Face Detection  (0) 2013.05.19
3D Noise Reduction algorithm test  (0) 2011.10.05
OpenCV 2.3 Computer vision (3)  (0) 2011.09.06
OpenCV 2.3 Computer vision (2)  (0) 2011.09.05
OpenCV 2.3 Computer vision (1)  (2) 2011.09.05
Posted by GUNDAM_IM
Computer Vision2011. 9. 6. 10:22
Creating a GUI application using QT

앞절에서는 Qt의 기본적인 내용만 정리한 것이고 , 이번에는 Qt와 OpenCV를 연결하여 좀더 Qt의  GUI를 사용하는 것을 테스트 합니다.   Graphic 관련 데이터를 처리하는데 O/S마다 종속성도 존재하고 귀찮은 GUI를 일일이 만들기도 그렇고 할때 딱 좋은 것이 이 Qt + OpenCV 조합입니다. 필요한 함수는 다 있으므로 이것을 이용해서 알고리듬을 만들어서 테스트 해보고 필요한 부분만 들어 내에서 H/W로 변경하면 됩니다.

이 OpenCV조합을 SystemC로 연결시켜서 테스트 할 수 있고 또 SystemC 조합을 다시 SDL로 연결시켜서 해볼 수 있기 때문에 이런것을 한번 알아 두면 두고두고 조합하면서 써먹을 수 있습니다. - 쉽게 말하면 아주 편하다는 의미입니다. 


이번에는 Create Project에서 QT GUI를 선택합니다.

 
프로젝트 이름은 원하는것으로 정하고 만들면 아래와 같이 만들어집니다.

 
위에서 중요한 것이  GUI 어플을 위한 Form입니다.
Visual base의 Form과 비슷한데 하여튼  GUI Template로 생각하면 됩니다.
GUI Template를 아래와 같이 만듭니다.

 
Push Button을 두개 넣어 두고 이름을 위와 같이 합니다.
버튼의 정식 이름은 오른쪽에 조그마한 창에 나오는데 이 버튼의 이름을
PB_OpenImage와 PB_Process로 정합니다.

 
이제 이벤트를 추가하면 됩니다.
이벤트는 버튼이 Push되었을때 즉  Click되었을때를 추가하면 됩니다.

 QT에서는  Event를 처리하는 개념을  Slot 을 추가한다고 합니다.
Slot을 추가하기 위해서는 마우스의 버튼 혹은 콘트롤 버튼과 함께 클릭하면 아래와 같은 Pop Up 매뉴가 나옵니다.
여기서  Slot 추가 매뉴 Go to Slot을 선택합니다.


 그럼 아래 창이 나타나는데 여기서 clicked를 추가합니다.

 
그럼 코드에 아래와 같이 나옵니다.

void MainWindow::on_PB_OpenImage_clicked()
{
    
}

같은 방법으로 Process도 만듭니다.

시작시에 말했듯이 이 프로그램은 Image를 읽어들여서 작업하는 프로그램입니다. 이미지를 읽어들여서 저장하기 위해서는 별도의 변수가 필요합니다. 엄밀하게는 이미지를 저장할 공간을 필요로 합니다.

다음과 같이 이미지를 저장할 변수를 추가합니다.


private 공간에 cv::Mat image를 추가합니다.
각각의 버튼이 눌려졌을때의 함수는 아래와 같이 추가를 합니다.

#include <QFileDialog>
...
 
void
MainWindow::on_PB_OpenImage_clicked()
{
    QString filename = QFileDialog::getOpenFileName( this, tr("Open Image") , "." , tr("Image Files (*.png *.jpg * jpeg *.bmp)")) ;
    image = cv::imread(filename.toAscii().data());
    cv::namedWindow("Original Image");
    cv::imshow("Original Image", image);
}

 
그리고 컴파일을 하면 아래와 같이 실행됩니다.
- project 파일에 옵션 추가하는 것은 2번째 글을 참고하시기 바랍니다.

 
  OpenImage를 눌러서 파일 다이얼로그를 띄우고 잘 처리하면 됩니다.

  Process에 대한 함수는 아래와 같이 추가합니다.

void MainWindow::on_PB_Process_clicked()
{
 cv::flip(image , image , 1);
 cv::namedWindow("Output Image");
 cv::imshow("Output Image", image);
}
 

위의 코드는 읽어들인  image를 flip시키는 것입니다.

컴파일과 실행하면 아래와 같이 나옵니다.



주) 항상 함수 하나 추가해보고 테스트 해보는 식으로 하는 것이 나중에 디버깅이 쉬워집니다.

이제 좀더 다음 단계로  다이얼로그 박스에 결과를 내보내는 것을 해보겠습니다.

먼저 Qt에서는 그래픽 데이터를 Label로 출력할 수 있으므로 Dialog에 label을 추가 합니다.



그리고 코드를 다음과 같이 수정합니다.


void MainWindow::on_PB_Process_clicked()
{
 cv::flip(image , image , 1);
 // cv::namedWindow("Output Image");
 // cv::imshow("Output Image", image);

 // Qt Image
 QImage img = QImage (( const unsigned char *) (image.data) , image.cols , image.rows, QImage::Format_RGB888);

// display on label
 ui->label->setPixmap( QPixmap::fromImage(img));
 ui->label->resize(ui->label->pixmap()->size());

}

  이제 실행하면 됩니다.

  

'Computer Vision' 카테고리의 다른 글

3D Noise Reduction algorithm test  (0) 2011.10.05
OpenCV 2.3 Computer vision (4)  (4) 2011.09.14
OpenCV 2.3 Computer vision (2)  (0) 2011.09.05
OpenCV 2.3 Computer vision (1)  (2) 2011.09.05
OpenCV 2.1 맥에서 빌드하기  (0) 2010.09.04
Posted by GUNDAM_IM
Computer Vision2011. 9. 5. 13:19
QT에 연결해서 빌드하기

QTCreator를 실행시킨뒤에 Create Project를 선택합니다.

 
Other Project에서 Console Project를 선택합니다.

 
이름은 아래와 같이 결정하다.

 

코드는 아래와 같이 추가해 둡니다.


#include
<QtCore/QCoreApplication>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    cv::Mat image = cv::imread("baboon.jpg");
    cv::namedWindow("My First QT Window");
    cv::imshow("My First QT Window",image);
    cv::waitKey(5000);
    return a.exec();
}




그리고 Project file에서 아래 부분을 추가합니다.


INCLUDEPATH += /usr/local/include

LIBS+= -L/usr/local/lib \
-lopencv_core\
-lopencv_highgui\
-lopencv_imgproc\
-lopencv_features2d\
-lopencv_calib3d

그리고 컴파일한 뒤에 실행하면 아래와 같은 창이 보입니다.



'Computer Vision' 카테고리의 다른 글

OpenCV 2.3 Computer vision (4)  (4) 2011.09.14
OpenCV 2.3 Computer vision (3)  (0) 2011.09.06
OpenCV 2.3 Computer vision (1)  (2) 2011.09.05
OpenCV 2.1 맥에서 빌드하기  (0) 2010.09.04
SURF Lib  (3) 2010.06.22
Posted by GUNDAM_IM
Computer Vision2011. 9. 5. 13:18
오래간만에 보는 전공 (?) 서적인 OpenCV 2 Computer vision application programming cookbook입니다.

Embedded 혹은 non windows 개발을 위해서 QT와 windows에서는 Visual studio에서 차례로 설명합니다.
내용은 어려운것이 없으니 쉽게 술술 읽어가면서 해볼 수있습니다.

OpenCV를 다운 받을 수 있는 홈페이지는 아래와 같습니다.
http://opencv.willowgarage.com/wiki/

최근에는 Android 버전으로도 Release되고 있는데 BETA입니다.
- 안정성에서는 확인한적이 없습니다.

QT를 다운 받을 수 있는 사이트는 아래와 같습니다.
qt.nokia.com

그리고 OpenCV 현재 버전은 2.3입니다. 2011년 7월에 Release되었습니다.

(MAC인 관계로.. ) QT도 설치하고 OpenCV도 설치합니다.

QT는 설치가 쉬운데 다운받아서 Pkg install만 하면 됩니다. 그럼 아래와 같은 창을 볼 수 있습니다.



OpenCV의 컴파일 및 설치
- OSX 기준

cmake를 사용하면 되는데 일단 소스 코드 폴더에서 cmake를 치면 다음과 같은 메시지를 마지막에 볼 수 있습니다.

Generators

The following generators are available on this platform:
  Unix Makefiles              = Generates standard UNIX makefiles.
  Xcode                       = Generate Xcode project files.
  CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
  Eclipse CDT4 - Unix Makefiles
                              = Generates Eclipse CDT 4.0 project files.
  KDevelop3                   = Generates KDevelop 3 project files.
  KDevelop3 - Unix Makefiles  = Generates KDevelop 3 project files.
...

위의 것을 기준으로 보면 Unix Makefiles와 XCode등을 해 볼 수 있습니다.
일단 Unix Makefile을 기준으로 한다면 아래와 같습니다.

cmake -G "Unix Makefiles"
 로 하면 makefile이 만들어집니다.

 이후에 
make all
make install
을 하여서 컴파일 및 설치를 완료 합니다.
 

같은 방법으로, XCode를 사용해서 하면 쉽게 컴파일을 할 수 있습니다.

cmake -G Xcode

로 하면 

OpenCV.xcodeproj

파일이 만들어 집니다. 이걸 XCode에서 불러들여서 컴파일하면 됩니다.

그리고,
인텔 IPP나 TBB등을 사용하면 빨라지겠지만 지금은 그냥 Pass
나중에 좀더 빠른게 필요해지면 그때 검토하고 지금은 쉽게 쉽게 갑니다.

Windows용도 Visual Studio에서 컴파일이 가능합니다.


Sample Program 빌드
테스트를 위해서 samples 폴더에서 하나를 빌드해 봅니다.
dft.cpp를 가지고 빌드합니다.

g++을 사용하며 아래와 같이 빌드합니다.

g++ -o dft.elf dft.cpp -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_ml -lopencv_imgproc 

실행은 아래와 같습니다.
./dft.elf stuff.jpg




이 책의 소스 코드는 PacktLib에서 다운 받을 수 있습니다.




 

'Computer Vision' 카테고리의 다른 글

OpenCV 2.3 Computer vision (3)  (0) 2011.09.06
OpenCV 2.3 Computer vision (2)  (0) 2011.09.05
OpenCV 2.1 맥에서 빌드하기  (0) 2010.09.04
SURF Lib  (3) 2010.06.22
Rob Hess의 SIFT [8]  (7) 2009.06.21
Posted by GUNDAM_IM
Books2011. 8. 28. 20:50
거꾸로 배우는 소프트웨어 개발

이 호종 저
로드 북 출판사.
 


"기술과 인문학의 교차점에 있다."

이것은 애플의 잡스옹께서 하신 말씀이고 이 말씀 이후로 많은 사람들이 듣도 보도 못한 용어가 무었인지 알기도 전에 잡스옹이 던진 마력에 빠져서 이 말을 자유로이 구사하고 다니고 있다

img_1314108442.jpg
"철학이 필요한 시간" (강신주, 사계절)을 보면 인문학은 솔직함에서 기반한다고 한다 시인의 마음처럼 솔직함, 임금님이 벌거 벗었다고 외칠수 있는 아이의 솔직함 그런 마음으로 사물과 현상을 바라 볼 수 있어야 하고 그것이 인문학의 시작이라 하고 있다

  이 책은 "솔직한 시선으로  소프트웨어의 개발에 대한 내용을 본다면 어떻게 보일까?"  라는 관점을 가지고 시작한다  그래서 책 제목에서 말하는 것 처럼 거꾸로 본다는 개념은 결국 솔직한 시선으로 있는 그대로의 개발에 대한 내용을 보여준다는 의미이다.  한편으로는 솔직하다는 의미는 작가의 (아주) 주관적인 생각에서 정리했다는 의미이다. 상당히 주관적으로 정리했기 떄문에 반론하는 사람들도 있겠지만, 전체적으로는  작가가 생각하는 잡식성 성향 그대로의 개발에 대한 생각을 정리한 책이다

책은 7개의 테마로 나누어져 구성되어 있지만 다시 분류를 내 마음대로 한다면
 

-  개발 전반에 걸친 잡다한 생각
-  개발 방식
-  개발 도구
-  TDD

로 나눌 수 있겠다

   우선 개발 전반에 잡다한 생각은 내 생각이고 실제 읽어 보면 저자는 개발이란 주제에 대해서 정말 많은 생각과 고민을 하면서 생각을 발전 시켜 왔다는 것을 알 수 있다. 학생때 프로그램으로 시작해서 SoC/ASIC 개발로 다시 인터넷으로 옮겨가며 만들어낸 저자의 개발에 대한 생각은 즐겁고 행복한 개발자를 지향한다고 볼 수 있다.
이를 위한 3종 세트 즉 소스 코드 관리, 개발 프레임 워크, 단위 테스트를 하면 개발이 즐겁다고 이야기한다.  만약 이렇게 해도 즐겁지 않다면 그것은 개발외의 요소 즉 외부 요소에 의해서 압박받고 통제받는 개발자의 삶을 살고 있다고 볼 수 있다.  


  두번째 테마는, 개발 방식이라고 간단하게 이름을 붙였지만 이 내부는 개발 조직과 방법론을 함께 엮어서 설명하고 있다. 

  얼마전부터 많이 사용하는 스크럼의 본질도 잘 집어서 설명해주고 있다. 내가 생각하는 스크럼의 본질은 윗 사람과 아래 사람 모두에게 마음의 안식을 줄 수 있는 방식이다. 윗사람들은  (싸장님 포함) 언제쯤 제품이 나올지 어느정도 기대감을 가지고 지낼 수 있다는 장점이 있다.  아래 분들 즉 개발자들은 정해진 스프린트 기간에는 윗분들의 어택이 존재하지 않을 것이라는 믿음으로 평안을 얻을 수 있다는 점이다.  저자는 책에서 후자 즉 개발자의 안식을 이야기 하고 있다.  


  개발 방식에서 빠질 수 없는 또하나의 주제가 협업이다. 
 

  협업을 성공 시키는 가장 확실한 방법은 협업을 최소화 하는 것이라는 패러독스가 존재 할 만큼 쉽지 않은 문제이다.  책에서는 조직내에서 협업의 전제 조건으로 존중과 신뢰 도움을 이야기 한다.  이를 하나로 이야기한다면 기업 문화라고 이야기할 수 있겠다. 기업 문화는 유리 같아서 강력한 칼날이 되지만 한편으로는 깨지기도 쉬운 물건이다. 이것을 어떻게 유지할 수 있고 발전 시킬 수 있는 것인지가 항상 고민되는 문제이다.  
협업의 적은 많다 못해 화려하기 까지 하다.  하지만 그것을 모두 모으면 사람의 마음이다 정확하게는 과한 욕심과 욕망이라는 것으로 귀착된다. 그것을 다루는 것 역시 사람이 해야 할 일이다.  

  아쉬운 부분은 저자도 아직 명확한 해결책 혹은 실버 블렛을 찾지 못한것 같다.  가장 그런 부분에 근접한 사람이 저자라고 생각하고 있기 때문에 나는 못찾았지만, 저자는 (언젠가는) 찾을 것이란 기대가 있다.  책에서는 한센 교수가 제시하는 체계적인 협업이라는 협업에 대한 실천적인 가이드를 제시하여 설명하고 있다. 

개발 도구에서는 
   코드 형상 관리 시스템과 이슈 트레킹 시스템을 이야기한다
   두 시스템 모두 입이 닯도록 이야기 하지만 잘 정착이 안되는 부분도 많다
   코드 형상관리는 좀 쉬운데 이슈 트래킹은 정착이 조금 어렵다.  
   -  이 부분은 회사마다 처해진 상황이 다르지만 
      우리는, 하드웨어 특히 개발 기간이 긴 ASIC이라는, 개발이라는 업종의 특성도 존재한다. 
      아직도 제대로 풀지 못한 숙제이다.
   - 이슈를 등록시키고 해결시키는 것이 ASIC 개발 업체라는 속성상 길어지게 되고 그렇게 되면,
      계속 이슈로 남게되는데 은근히 개발자들을 압박하게되는것 같다.
      (일종의 심리적 매카니즘이 나쁜 쪽으로 작용하는 예라고 볼 수 있다.) 


TDD
   처음에 TDD에 대한 내용을 볼 때에, 오죽 제대로 검사도 안하고 출하 했으면 이런 개발 방식이 나올까 생각하였만 
배우고 난뒤에는 개발과 동시에 안정정을. 확보할 수 있는 방법이라 생각되었다. 관련하여 책에서도 테스팅이 유일한 해법이라고 강조하고 있다. 
  저자는 TDD의 중요성을 강조하기 위해서 아래와 같은 예언을 하였다

  앞으로 10년이내에 단위 테스트와 TDD를 적용하지 않는 개발 회사들은 모두 사라질 것이다
  그리고, 단위 태스트와 TDD를 실행하지 못하는 개발자들 역시 그 회사들과 사라질 것이다 


마지막으로, 

  책은 저자가 블로그에 올렸던 글들을 모아서 삽화와 함께 책으로 다시 엮었다.  
  저자는 정말 많은 책을 계속 읽어가시는 분이라 그만큼 사변적이고 개성적인 시각을 가지고 있다.
하드웨어 개발자로 시작해서 소프트웨어 개발 그리고 조직 관리등을 거치면서 쌓인 경험과 생각을 한권의 책으로 엮었다.


  끝으로 책 중간에 나오는 개발자의 그레이드를 나누는 살벌한 피라미드가 있는데 , 댓글로 아웃사이더라고 달은 분이 계시다. 글을 쓴 분도 댓글을 다신 "분" 도 엘레강스 하고 그레이트하다  주제넘은 내 생각에는 개발자의 그레이드를 나누는 것은 아무런 의미가 없다고 생각한다. 나누어서 인증서를 줄 방법도 없고, 스스로 프로라고 하면 옆에 있던 사람들이 아냐 라고 할 수 있는 정량적인 방법은 존재하지 않는다. 개발자의 그레이드를 정량적으로 인정할 수 있는 유일한 방법은 허리 사이즈에 비례한다고 이야기 할 수 있다.  즉, 허리가 34 인치 이상만 일단 일정 수준에 오른 개발자라고 볼 수 있다.   

  물론 농담이고. 개발자는 아키텍트를 지향해야 한다고 생각한다. 전체를 조망하는 위치에 올라가야 나머지가 보인다. 그레이드에 속박당하지 말고 독수리 처럼 높은 시선으로 전체를 조망하도록 스스로 연마하고 노력한다면,  나머진 쉬워진다고 생각한다. 
 
  

Posted by GUNDAM_IM