기본 콘텐츠로 건너뛰기

라벨이 OpenCV인 게시물 표시

[OpenCV] OpenCV 2.1 Cheat Sheet C++

OpenCV_CheatSheet.pdf [OpenCV] OpenCV 2.1 Cheat Sheet C++

[OpenCV]CvMat의 element 접근법

// 3x3 행렬 생성. element 자료형은 double형에 1 channel CvMat* matrix = cvCreateMat(3, 3, CV_64FC1); double element; // 1번째행 2번째열 데이터 접근하는 법. matrix->data.db[1*3+2] = element; element = matrix->data.db[1*3+2]; 또는 element = cvmGet(matrix, 1, 2); cvmSet(matrix, 1, 2, element); 그렇다면 matrix->data.db[1*3+1]에서 1*3+1에 대해서 알아보자. 일부러 3x3행렬의 중앙에 있는 element를 지정해 놓았다. 그 이유는 1*3+2의 의미를 확실히 외워라는 의미이다. | 1 2 3 | | 4 5 6 | 다음은 3x3 행렬로 각각의 element가 가지는 값을 표시해놓았다. | 7 8 9 | 1*3+1에서 먼저 1이 나타내는 것은 두번째 행(row)임을 나타내는 것이다. 열(column)이 절대 아님. 그렇다면 3이 나타내는 것은 당연히 이 행렬에서 한 행이 가지는 element의 수이다. 다시 말해서 열의 크기를 나타낸다. 마지막으로 1은 열을 나타낸다. 2번째 열에 있다는 이야기이다. 다음의 예를 보자. | 1 2 3 | | 4 5 6 | | 7 8 9 | 3번째 행 1번째 열을 나타내는 식은? 2*3+0 cvmGet이나 cvmSet을 이용하는 것보다 직접 접근하는 것이 편하지만 만약 행과 열을 헷갈린다면 결과는 OTL일 것이다. 신경써서 사용하자. 출처 : http://devnetga.com/blogtt/5?TSSESSIONdevnetgacom=5c8bf4d129f674b65a0766b03f728026   CV_32FC1과 CV_32FC2의 구조를 비교해보자.  CvMat *mat1 = cvCreateMat(2, 3, CV_32F);  CvMat *mat2 = cvCreateMat(1, 3, CV_32FC2);...

[OpenCV]matrix operations

Matrix-matrix operations: CvMat *Ma, *Mb, *Mc; cvAdd(Ma, Mb, Mc); // Ma+Mb -> Mc cvSub(Ma, Mb, Mc); // Ma-Mb -> Mc cvMatMul(Ma, Mb, Mc); // Ma*Mb -> Mc Elementwise matrix operations: CvMat *Ma, *Mb, *Mc; cvMul(Ma, Mb, Mc); // Ma.*Mb -> Mc cvDiv(Ma, Mb, Mc); // Ma./Mb -> Mc cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc Vector products: double va[] = {1, 2, 3}; double vb[] = {0, 0, 1}; double vc[3]; CvMat Va=cvMat(3, 1, CV_64FC1, va); CvMat Vb=cvMat(3, 1, CV_64FC1, vb); CvMat Vc=cvMat(3, 1, CV_64FC1, vc); double res=cvDotProduct(&Va,&Vb); // dot product: Va . Vb -> res cvCrossProduct(&Va, &Vb, &Vc); // cross product: Va x Vb -> Vc end{verbatim} Note that Va, Vb, Vc, must be 3 element vectors in a cross product. Single matrix operations: CvMat *Ma, *Mb; cvTranspose(Ma, Mb); // transpose(Ma) -> Mb (cannot transpose onto self) CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0] double d = cvDet(Ma); // det(Ma) -> d cvInvert(Ma, Mb); // ...

[OpenCV]cvCompareHist - CV_COMP_INTERSECT

[code cpp] double CompareHistogram(IplImage* BufSrc, IplImage* BufRef) {  double dfScore;  int nHistoSize = 256;  float ranges[] = { 0, 256 };  float *hist_range[] = { ranges }; CvHistogram *histSrc = cvCreateHist(1, &nHistoSize, CV_HIST_ARRAY, hist_range);  CvHistogram *histRef = cvCreateHist(1, &nHistoSize, CV_HIST_ARRAY, hist_range);  cvCalcHist(&BufSrc, histSrc, 0, NULL );  cvCalcHist(&BufRef, histRef, 0, NULL );  cvNormalizeHist( histSrc, 100);  cvNormalizeHist( histRef, 100);     // Score = 0.0 ~ 100.0  dfScore = cvCompareHist( histSrc, histRef, CV_COMP_INTERSECT ); return dfScore; } [/code]

[OpenCV]cvDrawContours

cvDrawContours 함수는 contour 를 그려주는 함수이며 thickness 가 0 이상일 경우에는 외곽선만을 그려주고 0 미만일 경우에는 내부를 채워준다 .   원형 void cvDrawContours ( CvArr *img, CvSeq* contour,                                 CvScalar external_color, CvScalar hole_color,                                 int max_level, int thickness=1,                                 int line_type=8, CvPoint offset=cvPoint(0,0) );   패러미터 img contour 를 그릴 IplImage 구조체의 포인터를 넘겨준다 . 다른 그리기 함수와 마찬가지로 contour 는 ROI 로 클리핑된다 . contour CvSeq 구조체의 포인터를 넘겨준다 external_color 외부 contour 의 색상을 설정한다 . hole_color 내부 hole 의 색상을 설정한다 . max_level 그려질 contour 의 최대 단계를 설정한다 . 만약 0 이면 contour 만이 그려질 것이고 1 이면 모든 contour 를 같은 레벨에 그려준다 . 2 이면 다음 레벨까지 그려줄 것이다 . 만약 음수이면...

[OpenCV]자주쓰는 기능..

[code cpp] //Exec Notepad CFileFind ff; //if( ff.FindFile( _T("C:\\WINDOWS\\notepad.exe") ) && ff.FindFile( _T("C:\\TEST\\temp.txt") ) ) // WinExec( "C:\\WINDOWS\\notepad.exe C:\\PARMI\\temp.txt", SW_SHOW );if( ff.FindFile( _T("C:\\WINDOWS\\notepad.exe") ) && ff.FindFile( strFilePath ) ) {  CString strCmd;  strCmd.Format( _T("C:\\WINDOWS\\notepad.exe ") );  strCmd += strFilePath;  USES_CONVERSION;  WinExec( W2A(strCmd), SW_SHOW ); } [/code] [code cpp] //Show Image void cvShowImageWindow(CString title, CvArr* image) {  USES_CONVERSION;  cvNamedWindow( W2A(title), CV_WINDOW_AUTOSIZE);  cvShowImage( W2A(title), image);  HWND hWnd = ::FindWindow(NULL, title);  if (hWnd)   ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); } [/code] [code cpp] //Save Image CString strFileName; std::string szFileName = CStringA( strFileName ); cvSaveImage( szFileName.c_str(), iplImage ); [/code]     [cod...

[OpenCV]accumulation_of_background

출처 : http://opencv.jp/sample/accumulation_of_background.html#background_sub   [code cpp] #include <cv.h> #include <highgui.h> #include <ctype.h> #include <stdio.h> int main (int argc, char **argv) {   int i, c, counter;   int INIT_TIME = 100;   int w = 0, h = 0;   double B_PARAM = 1.0 / 50.0;   double T_PARAM = 1.0 / 200.0;   double Zeta = 10.0;   CvCapture *capture = 0;   IplImage *frame = 0;   IplImage *av_img, *sgm_img;   IplImage *lower_img, *upper_img, *tmp_img;   IplImage *dst_img, *msk_img;   CvFont font;   char str[64];   // (1)コマンド引?によって指定された番?のカメラに?するキャプチャ構造?を作成する   if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))     capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0);   // (2)1フレ?ムキャプチャし,キャプチャサイズを取得する.   frame = cvQueryFrame (capture);   w = frame->width;   h = frame-...

OpenCV: fit line (line-fitting )

// fit-line for 2-D data (line-fitting) http://blog.weisu.org/2006/01/opencv-fit-line-line-fitting_14.html #include "stdafx.h" #include "cv.h" #include "highgui.h" #include <stdlib.h> void main ( int argc , char ** argv ) { FILE * fp ; int i ; int count = 48 ; // total number of points int tmp1 , tmp2 ; CvPoint left , right ; float * line ; line = new float [ 4 * count ]; IplImage * img = cvLoadImage ( "b.bmp" , 1 ); // just a black image cvNamedWindow ( "input_image" , CV_WINDOW_AUTOSIZE ); fp = fopen ( "xy.txt" , "r" ); // xy.txt have the (x, y) position CvPoint * points = ( CvPoint *) malloc ( count * sizeof ( points [ 0 ])); for ( i = 0 ; i < count ; i ++) { fscanf ( fp , "%d %d" , & tmp1 , & tmp2 ); points [ i ]. x = tmp1 ; ...

Pseudo Color 변환

Pseudo color(유사 색상) :  색이 없는 자료에 색을 부여하는 색 정합. 온도 표현을 위해 사용된다. 영상에서 낮은 온도는 푸른색으로 표현된다. 높은 온도는 붉은색으로 표현된다.                 Original                             Pseudo Color       흑백값에 따른 칼러 분포     C 에서 구현  math.h 를 이용하여 C 에서 삼각함수를 구현할 수 있다 그러나 삼각함수에 입력되는 값은 라디안 단위로 변화시켜야 한다(X°*π/180) Blue 값은 sin 함수 Red 값은 -sin 함수  Green 값은 -cos 함수   Y(흑백영상 값)의 범위는 0부터 255까지이고 사인,코사인함수의 주기(D)는 0°부터 360°이다                           이를 수식적으로 표현하면, Y : D = 256 : 360   라디안 단위로 변화시키면,                             삼각함수의 값(X)이 -1에서 1까지의 값을 가진다 이것을 0부터 255까지 대칭시키면, -1이 0, 0이 128, +1이 255값을 가져야 한다.   삼각함수의 값에 1을 더한후 127.5를 곱한다   구르는 돌에는 이끼가 끼지 않는다 |...

[MATLAB]3점에 의한 원의 중심 구하기...

원문 출처 : http://mathworld.wolfram.com/Circle.html 중 일부  입니다.   The equation of a circle passing through the three points for , 2, 3 (the circumcircle of the triangle determined by the points) is   (25) The center and radius of this circle can be identified by assigning coefficients of a quadratic curve   (26) where and (since there is no cross term). Completing the square gives   (27) The center can then be identified as   (28)   (29)   and the radius as   (30) where   (31)   (32)   (33)   (34) Four or more points which lie on a circle are said to be concyclic . Three points are trivially concyclic since three noncollinear points determine a circle.     아래는 원문중 원의 공식을 이용해 MATLAB과 OpenCV 행렬 함수를 이용해서 구현된 ...