2011/11/21

[OpenCV] Linear Least Square calculation using OpenCV

출처: http://mariotapilouw.blogspot.com/2011/04/least-square-using-opencv.html



OpenCV를 이용한 Linear Least Square 를 계산하는 방법에 대한 글이다. 이 내용은 Fitting 을 하기 위해 중요한 것으로 기록 차원에서 발췌해 두었다. 역시 실제 참고는 원문을 이용하기 바란다.



내용보기

[OpenCV] Plane Fitting using OpenCV

출처 : http://mariotapilouw.blogspot.com/2011/05/plane-fitting-using-opencv.html



OpenCV를 이용한 Plane Fitting 방법을 소개한 글을 찾아서 기록차원에서 일부를 발췌하였다. 아래는 기록용으로 발췌하여 기록한 것이므로 참고는 위 링크의 원문을 참고하기 바란다.



내용 일부 보기

<

Original Post : http://neodreamer-dev.tistory.com/618

[OpenCV] cvFitLine 사용하기

OpenCV 에서는 2D와 3D 데이터에 대한 Fitting 함수로 cvFitLine 함수를 제공 한다. cvFitLine 함수는 OpenCV 문서상 설명은 아래와 같이 되어있다.



FitLine

Fits line to 2D or 3D point set



void  cvFitLine( const CvArr* points, int dist_type, double param,
                 double reps, double aeps, float* line );

points

     Sequence or array of 2D or 3D points with 32-bit integer or floating-point coordinates.

dist_type

     The distance used for fitting (see the discussion).

param

     Numerical parameter (C) for some types of distances, if 0 then some optimal value is chosen.

reps, aeps

     Sufficient accuracy for radius (distance between the coordinate origin and the line) and angle, respectively, 0.01 would be a good defaults for both.

line

     The output line parameters. In case of 2d fitting it is array of 4 floats (vx, vy, x0, y0) where (vx, vy) is a normalized vector collinear to the line and (x0, y0) is some point on the line. In case of 3D fitting it is array of 6 floats (vx, vy, vz, x0, y0, z0) where (vx, vy, vz) is a normalized vector collinear to the line and (x0, y0, z0) is some point on the line.

The function cvFitLine fits line to 2D or 3D point set by minimizing sumiρ(ri), where ri is distance between i-th point and the line and ρ(r) is a distance function, one of:



dist_type=CV_DIST_L2 (L2):

ρ(r)=r2/2 (the simplest and the fastest least-squares method)



dist_type=CV_DIST_L1 (L1):

ρ(r)=r



dist_type=CV_DIST_L12 (L1-L2):

ρ(r)=2?[sqrt(1+r2/2) - 1]



dist_type=CV_DIST_FAIR (Fair):

ρ(r)=C2?[r/C - log(1 + r/C)],  C=1.3998



dist_type=CV_DIST_WELSCH (Welsch):

ρ(r)=C2/2?[1 - exp(-(r/C)2)],  C=2.9846



dist_type=CV_DIST_HUBER (Huber):

ρ(r)= r2/2,   if r < C

      C?(r-C/2),   otherwise;   C=1.345



하지만 문서상 어디에도 어떻게 사용하는지 설명이 되어 있지 않다.

인터넷에서 찾아 아래와 같은 결론에 이르렀다.

int nStart = (ptStart.y < ptEnd.y)? ptStart.y: ptEnd.y;
int nEnd = (ptStart.y > ptEnd.y)? ptStart.y: ptEnd.y;

int nCount = 0;
for ( int row = nStart; row < nEnd; ++row )
{
CvPoint2D32f p;
p.x = (float)nCount++;
p.y = m_pfData[ row * nWidth + ptStart.x ];
cvSeqPush( seq, &p );

TRACE("%.6f\n", p.y);
}

float fLine[4];
cvFitLine( seq, CV_DIST_L1, 1, 0.01, 0.01, fLine );
TRACE("Line > %.6f, %.6f, %.6f, %.6f\n",fLine[0] ,fLine[1],fLine[2],fLine[3]);

float fSlope = fLine[1] / fLine[0];
float fIntercept = fLine[3] - fSlope * fLine[2];





위 코드는 cvFitLine 을 사용한 일부분이다.

2D 데이터에 의한 Fitting을 하기 위해 32비트 Float 형식의 CvPoint2D32f 를 사용하였다.

데이터를 저장하기위한 메모리를 만들고 (cvCreateMemStorage) 시퀀스를 생성하였다. 그리고 Fitting에 필요한 데이터를 시퀀스에 담는다.

두 번째 인자는 Fitting 방법으로 거리 계산 방법인데 이에 대한 자세한 것은 아직 모르겠다. 세 번째는 두 번째 인자에서 지정한 거리 계산방법에 사용할 상수를 정하는 것으로 몇몇 거리계산 방법에는 적용되지 않는 것으로 보인다.  네 번째와 다섯 번째는 직선을 구하는 정확도를 의미하며 OpenCV 문서에서는 0.01로 지정하도록 권장하고 있다.



함수의 결과는 2D Fitting의 경우 결과 값으로 4개의 float 데이터가 반환된다.

두 개 단위로 값이 의미를 갖는데 첫 번째 두 개는 직선과 평행한  정규화된 벡터이고 다음 두 개는 이 벡터의 연장선상에 존재하는 한 점의 좌표를 의미한다.


3D Fitting에 대해서는 좀 더 공부를 해 봐야겠다.<

Original Post : http://neodreamer-dev.tistory.com/617

2011/11/16

Khronos Releases OpenCL 1.2 Specification

OpenCL 1.2 버전이 공개 되었다.



멀티 프로세싱쪽에 관심을 두고 있는데 짬이 없어 머뭇거리는 사이 OpenCL 1.2 버전이 공개 되었다.

OpenCL 의 경우 GPU까지 활용할 수 있어 OpenMP 보다 좋은 성능을 보여줄 것 같은데 아직 이렇다할 진행을 하지 못하고 있다.

틈틈히 관련 정보를 봐 두어야겠다.



OpenCL

OpenCL 1.2 Specification

OpenCL 1.2 Quick Reference&

Original Post : http://neodreamer-dev.tistory.com/616

2011/11/10

Google Reader 를 위한 Firefox Add-ons - Google Reader Plus



오랜만에 Firefox 를 사용해 보았다.

브라우징 속도는 많이 빨라진 것 같은데 아직 Chrome 속도는 못 따라 오는 것 같았다.

Firefox로 Google Reader 보는데 Chrome의 확장 기능인 Super Full Feeds for Google Reader™에 익숙해져 Reader 에서 모든 내용을 보는게 편했다. 그래서 Firefox에 그러한 기능을 하는 Add-on이 있는지 찾아 보았다.


걸려든 녀석은 바로 Google Reader Plus 이다.

전체 글을 볼 수 있는 기능 외에도 많은 기능을 지원하고 있다. 아래 슬라이드는 Google Reader Plus의 설정 창이다.












내가 찾던 Reader 에서 모든 글을 보는 기능은 콤보박스 형태와 키보드 단축키를 이용하여 지원하고 있다.

콤보박스 메뉴 해당 글의 타이틀 우측에 표시하며 전체글과 IFrame을 이용한 블로그 전체보기 기능을 지원한다.



Google Reader Plus for Firefox<

Original Post : http://neodreamer-dev.tistory.com/614

2011/11/09

Visual C++ 2005 에서 OpenCV 2.3.1 버전 사용하기

현재 배포되는 최신 버전의 OpenCV 2.3.1은 Visual C++ 2008과 2010 버전에 대해서만 바이너리 빌드를 제공 하고 있다.

2005에서 사용을 하려면 Visual C++ 2008 버전을 사용하거나 2005 버전으로 직접 컴파일 해야 한다.

직접 컴파일 하는 방법은 어렵지 않으며 아래 글을 참고하여 만들면 된다.



2010/10/17 - [Dev Story] - OpenCV 2.1 + TBB 를 Visual Studio 2010 에서 컴파일하기



먼저 OpenCV 2.3.1 버전을 테스트하기 위해 MFC Dialog 기반 프로젝트를 만들고 프로젝트 폴더에 OpenCV 2.3.1 패키지 않에 포함되어 있는 include 폴더(\build\include)와 직접 만든 lib 파일 또는 패키지 안에 있는 Visual C++ 2008 버전 용 라이브러리 파일(\build\x86\vc9\lib)들을 Project의 opencv 폴더에 복사해 아래 이미지와 같은 구조로 만들 었다.



마지막으로 프로젝트 루트 폴더에 패키지에 포함되어 있는 (\build\x86\vc9\bin) DLL 파일 이나 직접 만든 DLL 파일들을 복사해 둔다.



opencv_calib3d231.dll


opencv_contrib231.dll


opencv_core231.dll


opencv_features2d231.dll


opencv_ffmpeg.dll


opencv_flann231.dll


opencv_gpu231.dll


opencv_highgui231.dll


opencv_imgproc231.dll


opencv_legacy231.dll


opencv_ml231.dll


opencv_objdetect231.dll


opencv_ts231.dll


opencv_video231.dll


윈도우 시스템 경로에 두는 것도 한 방법이지만 프로그램을 배포하거나 프로젝트를 이리저리 옮기는 겨우 다시 복사를 해야하는 불편함이 있는 기본적으로 프로젝트 경로에 두고 사용한다.



디버그용 라이브러리와 DLL을 사용할 경우 메모리 누수 문제가 있어 테스트 프로젝트에는 릴리즈용만 사용하였다.

Debug 모드와 Release 모두 동일하게 아래와 같이 설정을 한다.



먼저  추가 포함 디릭토리에 프로젝트 하위로 복사한 include 폴더(.\opencv\include)를 지정한다.



그리고 링커 메뉴에서 추가 포함 라이브러리 폴더 역시 라이브러리를 복사해 둔 경로(.\opencv\lib)를 지정한다.



그리고 추가 라이브러리 파일 목록에 아래 파일들을 입력 한다.



opencv_calib3d231.lib


opencv_contrib231.lib


opencv_core231.lib


opencv_features2d231.lib


opencv_flann231.lib


opencv_gpu231.lib


opencv_haartraining_engine.lib


opencv_highgui231.lib


opencv_imgproc231.lib


opencv_legacy231.lib


opencv_ml231.lib


opencv_objdetect231.lib


opencv_ts231.lib


opencv_video231.lib




처음부터 모든 파일이 필요한 것은 아니고 필요한 기능에 따라 사용하지 않는 파일들도 있지만 모든 기능을 테스트해 보기 위해서는 모두 입력을 해 두는 것이 좋을 것 같다.



프로젝트 설정은 모두 끝났고 아래 코드는 간단하게 OpenCV 2.3.1 버전을 사용하는 예이다.

// stdafx.h
// For OpenCV
#include "opencv/cv.h"
#include "opencv/highgui.h"


void COpenCV231TestDlg::OnBnClickedButtonLoadImage()
{
CFileDialog dlgFile(TRUE);

if ( dlgFile.DoModal() == IDOK )
{
CStringA strFile = CStringA(dlgFile.GetPathName());

IplImage* pIplImage = cvLoadImage( strFile );

cvNamedWindow( "Image" );
cvShowImage( "Image", pIplImage );

cvReleaseImage( &pIplImage );
}
}





프로젝트를 실행하고 메인 다이얼로그의 버튼을 누르면 이미지 선택 대화상자가 활성화 되고 이미지를 선택하면 화면에 보여준다.

<

Original Post : http://neodreamer-dev.tistory.com/613

2011/11/03

OpenCV 2.x Memory Leak 문제

OpenCv 2.2 부터인가 배포할 때 .lib 파일과 .dll 파일을 포함해서 배포하고 있는데 Visual C++ 2005 버전은 제외되었다. 그래서 2.3.1버전을 받아서 직접 만들어 사용을 하여야 해서 직접 컴파일을 하여 테스트 했다.



2.2버전을 사용할 때에도 메모리 누수 문제가 발생하였는데 2.3.1버전에서도 여전히 문제가 발생하였다.



메모리 누수 로그 더보기



 원인은 MFC 라이브러리가 로드 되기전에 OpenCV core 라이브러리가 로드되어서 발생하는 문제로 OpenCV의 core 프로젝트 설정에서 use MFC 를 Shared DLL로 설정하고 System.cpp 파일에 아래 내용을 추가해 주면 해결 된다고 한다.(http://tech.groups.yahoo.com/group/OpenCV/message/78198)

#ifdef _DEBUG
// required for including afh.h
#undef _WINDOWS_
#include <afx.h>
// Force linking to MFC.
static BOOL unused = afxTraceEnabled;
#endif





하지만 2.3.1 버전에서는 통하지 않는 것으로 보인다. 

이 문제는 프로젝트의 MFC 사용 설정을 Static 으로 설정하면 되지만 기존의 프로젝트가 Static으로 설정할 수 없는 경우는 소용이 없다.

현재로서는 Release 용 lib와 dll을 사용하거나 무시하는 방법 밖에 없어 보인다. 실제 배포하는 파일을 이용해도 동일한 현상이 발생하는데 왜 수정되지 않는지

Original Post : http://neodreamer-dev.tistory.com/612

2011/11/02

넌 누구냐! -1.#IND00

-1.#IND00 은 NaN 이다.



NaN 은 Not a Number의 약자이고 연산의 결과값이 불명확한 경우 -1.#IND00 또는 1.#IND00 가 발생한다.

IND는 indeterminate의 약자이다.



NaN을 유도하려면  sqrt(-1.0) log(-1.0)를 수행하면 된다.



참고로  1.#INF00 의 경우 overflow가 발생하는 경우이다. (inf는 infinite로 유추된다.)

Original Post : http://neodreamer-dev.tistory.com/611

SQLite 3.7.9 Release (include Library)

SQLite Release 3.7.9 On 2011 November 1 (3.7.9)

  • If a search token (on the right-hand side of the MATCH operator) in FTS4 begins with "^" then that token must be the first in its field of the document. ** Potentially Incompatible Change **

  • Added options SQLITE_DBSTATUS_CACHE_HIT and SQLITE_DBSTATUS_CACHE_MISS to the sqlite3_db_status() interface.

  • Removed support for SQLITE_ENABLE_STAT2, replacing it with the much more capable SQLITE_ENABLE_STAT3 option.

  • Enhancements to the sqlite3_analyzer utility program, including the --pageinfo and --stats options and support for multiplexed databases.

  • Enhance the sqlite3_data_count() interface so that it can be used to determine if SQLITE_DONE has been seen on the prepared statement.

  • Added the SQLITE_FCNTL_OVERWRITE file-control by which the SQLite core indicates to the VFS that the current transaction will overwrite the entire database file.

  • Increase the default lookaside memory allocator allocation size from 100 to 128 bytes.

  • Enhanced the query planner so that it can factor terms in and out of OR expressions in the WHERE clause in an effort to find better indices.

  • Added the SQLITE_DIRECT_OVERFLOW_READ compile-time option, causing overflow pages to be read directly from the database file, bypassing the page cache.

  • Remove limits on the magnitude of precision and width value in the format specifiers of the sqlite3_mprintf() family of string rendering routines.

  • Fix a bug that prevent ALTER TABLE ... RENAME from working on some virtual tables in a database with a UTF16 encoding.

  • Fix a bug in ASCII-to-float conversion that causes slow performance and incorrect results when converting numbers with ridiculously large exponents.

  • Fix a bug that causes incorrect results in aggregate queries that use multiple aggregate functions whose arguments contain complicated expressions that differ only in the case of string literals contained within those expressions.

  • Fix a bug that prevented the page_count and quick_check pragmas from working correctly if their names were capitalized.

  • Fix a bug that caused VACUUM to fail if the count_changes pragma was engaged.

  • Fix a bug in virtual table implementation that causes a crash if an FTS4 table is dropped inside a transaction and a SAVEPOINT occurs afterwards.


SQLITE_SOURCE_ID: "2011-11-01 00:52:41 c7c6050ef060877ebe77b41d959e9df13f8c9b5e"


SHA1 for sqlite3.c: becd16877f4f9b281b91c97e106089497d71bb47




SQLite website




<

Original Post : http://neodreamer-dev.tistory.com/610

2011/11/01

Notepad++ v5.9.6 Released!





괜찮은 윈도우즈용 편집기인 Notepad++이 5.9.6 버전을 공개하였다.



Notepad++ 화면

Notepad++ 화면 (출처: http://notepad-plus-plus.org)



Notepad++은 여러 파일을 탭으로 관리하는 탭 브라우징과 다양한 형식에 대한 문법강조 기능을 제공하는 무료 편집기이다.



아래 내용은 이번 버전(v5.9.6) 버저에서 달라진 점과 각각의 버전에 포함된 Plugins에 대한 정보이다.

New features and fixed bugs in Notepad++ v5.9.6

Add a new feature "Adding files recursively from a floder" in Project Manager.


Fix a bug in Project Manager regarding open and reload commands.






Included plugins (Unicode)


Spell Checker v1.3.3


NppFTP 0.24.1


NppExport v0.2.8


Plugin Manager 0.9.3.1


Converter 3.0






Included plugins (ANSI)


TextFX v0.25


NppExec v0.4.1


Spell Checker v1.3.3


NppExport v0.2.8


Light Explorer v1.6


Compare Plugin 1.5.5