*무게 중심(Center of Mass)
 - 좌표 공간에서의  무게 중심
 무게 중심 = sum(좌표값) / 좌표 개수
좌표 값을 모두 합한 뒤, 좌표의 개수로 나눔으로써 쉽게 구할 수 있다.
*영상의 무게 중심
- 영상 무게 중심 = sum(픽셀) / 픽셀 갯수
int nCount; // 총 픽셀 수
int nSumX; // X 좌표수
int nSumY; // Y 좌표수
double dCenter[2];           // 중심 좌표..
for(int i = 0; i < height; i++)
{
  index = i*img->widthStep;
  for(int j = 0; j < width; j++)
  {
    if( (BYTE)img->imageData[index + j] == 255)
    {
      nCount++;
      nSumX += j;
      nSumY += i;
    }
  }
}
/////////////////////////////////////////////////////////////////

if( nCount != 0 )
{
  dCenter[0] = nSumX  / nCount;
  dCenter[1] = nSumY  / nCount;
}
else
   dCenter[0] =  dCenter[1] = 0;

Posted by 가희나희아빠 희자매(가희나희)아빠
OpenCV에서 한글 출력과 관련해서 웹에서 찾아보니.. Conv2 님의 블로그에 보니 함수를 직접 만들어 사용하는 법이 나와 있었다.

정지 영상에서는 아무 문제없이 잘 되는 듯해서 사용하고 있었는데, 이것을 실시간 동영상으로 받아서 처리하다보니.. 메모리가 새는 문제가 있었다. (GDI증가.. 메모리 증가... 그러다가.. 다운... ㅠㅠ)
 Conv2님은 그대로 사용하지 말라고 했으나, 경고를 무시한 나의 잘못이니.. 그래서.. 직접 수정하기로 했다..

Conv2님의 설명은 아래 링크를 따라 가면 된다..

수정해서 나온 코드는 아래와 같다..
* 헤더 부분

더보기


* 소스부분

더보기


* 사용법

더보기


이렇게 처리하면 화면 메모리가 계속 증가해서 시스템이 다운되는 문제가 해결되었다.

아직까지는 문제가 없는 듯하지만.. 다른 문제가 발생한다면.. 다시 한번 찾아봐야지.. 뭐...

에고 힘들다..

P.S Conv2님의 글에 트랙백을 걸려고 했으나.. 트랙백이 막혀 있는지 트랙백 에러가 난다.. ㅠㅠ
Posted by 가희나희아빠 희자매(가희나희)아빠
두 라이브러리를 사용하다보니 서로 변환할 일이 생겼다.. 그래서.. 구글 사마에게 물어보니 아래와 같은 답을 보여 주었다..

ARUint8 *dataPtr;
IplImage *image_opencv, *gray_opencv;

//ARToolkit→OpenCV
image_opencv = cvCreateImage(cvSize(arImXsize, arImYsize), IPL_DEPTH_8U, 4);
memcpy(image_opencv->imageData, dataPtr, image_opencv->imageSize);

//何らかの処理
gray_opencv = cvCreateImage(cvSize(arImXsize, arImYsize), IPL_DEPTH_8U, 1);
cvCvtColor(image_opencv, gray_opencv, CV_BGRA2GRAY);
cvAdaptiveThreshold(gray_opencv, gray_opencv, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 11, 10);
cvCvtColor(gray_opencv, image_opencv, CV_GRAY2BGRA);

//OpenCV→ARToolkit
dataPtr = (ARUint8*)(image_opencv->imageData);




void ARtoIpl(IplImage* ipl, ARUint8* arimg,int flag){

int width = ipl->width; //ARのImageも同じ幅とする
int height = ipl->height; //ARのImageも同じ高さとする
int ARWidthStep = width * 4;

for(int j = 0; j < height; j++)
{
 for(int i = 0; i < width; i++)
{
  t0 = ipl->widthStep * j + i * ipl->nChannels;
  t1 = ARWidthStep * j + i * 4;
  
  for(int c = 0; c <>nChannels; c++)
{
   if(flag == -1) arimg[t1 + c] = ipl->imageData[t0 + c];
   else ipl->imageData[t0 + c] = arimg[t1 + c];
  }
 }
}




Posted by 가희나희아빠 희자매(가희나희)아빠
Visual 2008에서 OpenGL을 사용할려고 인터넷을 찾다보니..
opengl32.lib glu32.lib glut32.lib glaux.lib
라이브러리는 필수로 사용하는것처럼 되어있다..

그런데, 이놈의 VS2008은 glaux.h가 빠져있다.. ㅠㅠ (C++ Builder에는 잘 들어있는데...)

그런데, 웃긴것은 이 놈을 우선은 제거해도 된다는것... 

glut.h 함수만 사용해도 어느젇도 테스트 된다는것... 

정 필요하면... 웹에서 자료를 받아서 해당 폴더에 넣어주면 됨...


아래는 웹에서 찾은 자료...

[출처] http://tong.nate.com/kangdydtjs/44551101
1. OpenGL 이란?
* OpenGL 은 그래픽하드웨어가 제공하는 모든 기능들에 접근할 수 있는 수백개의 함수들을 모아 놓은것이다. 내부적으로  OpenGL은 하나의 state machine(상태기계) 처럼 작동한다. 개발자는 상태기계의 여러측면들(현재 색상, 조명, 혼합 등등)을 조사하거나 설정할 수 있다. 몇개의 상태들이 잘못 설정되면 최종적인 결과가 전혀 엉뚱하게 나오는 경우가 허다하므로,  OpenGL을 사용할때는 여러 상태들의 의미나 효과에 대해 잘 알고 있어야 한다. 
OpenGL 은 프로그래밍 언어가 아니다. 그것은 API(Application Programming Interface) 이다. API로써 OpenGL 라이브러리는 관례적으로 C를 따른다. 이것은 함수 자체가 C로 쓰여지거나 어셈블러나 다른 언어에 쓰여진 함수를 부르는 매개적 C함수가 제공되어 C가 API 에서 함수를 쉽게 부른다는것을 의미한다. (즉 우리는 C 를 사용해서 쉽게 OpenGL 을 사용)

2. OpenGL 구분
OpenGL  API는 서로 각기 다른 라이브러리로 구분된다. 
*  AUX 라이브러리에 대한 선언은 glaux.h 파일에 포함. 이 라이브러리에 포함되어 있는 함수는 정확히 OpenGL 만의 부분은 아니지만, OpenGL 을 불러내는 독립된 프레임위크를 제공하는 툴킷이다. 이 라이브러리의 모든 함수는 aux 로 시작된다. 

(tip: VS2008 에는 VS2005 까지는 있던(visual studio 2005 설치시 저절로 생기는) glaux.h 파일이 없네요. 구글에 가보니 왜 missing이냐 질문은 수백개인데 ms 욕해놓은 답말고는 아직 답변이 없네요^^. 이거 대신 뭘쓰라고 뺐냐는 질문에도 아직 답이 없구요- 책을 대략 찾아보니 aux 이용하는거는 옛날 방식이네요 아니 간단한 연습용에 주로 쓰이고 있네요. 살짝만 복잡한 그래픽 프로그래밍 코드를 보면 glaux.h 헤더 include 는 빠져있네요. 어쨌든 우리도 특별히 꼭 필요한경우에는 불러 쓰겠지만 일단은 이거 빼고 진행합시다-)

* OpenGL 을 실제로 정의하는 기능은 opengl32.dll 라이브러리와  그  gl.h 헤더파일에 들어있다. 이 라이브러리의 모든 함수는 gl 로 시작된다.

* OpenGL 유틸리티 라이브러리는 glu32.dll 과 그 glu.h 헤더파일이 있다. glu32.dll 과 glu.h 헤더파일은 구, 원반, 원통을 그리는것 과 같은 작업을 더 쉽게 만드는 유틸리티 함수가 포함되어 있다. 이 함수는 모두 glu 로 시작된다. 

* OpenGL 라이브러리와 헤더 정리
Posted by 가희나희아빠 희자매(가희나희)아빠

[자료 출처] http://uzys.tistory.com/entry/AR-Toolkit-Library-%EB%B0%8F-%EA%B4%80%EB%A0%A8-%EC%82%AC%EC%9D%B4%ED%8A%B8-%EC%A0%95%EB%A6%AC 

혹시 몰라 자료 복사해옴..

AR관련라이브러리

FLARToolKit - Flash AR Tool Kit
http://www.libspark.org/wiki/saqoosha/FLARToolKit/en
demo - http://blog.papervision3d.org/2009/01/07/augmented-reality-with-flartoolkit/

MXR Toolkit - Only C 
http://mxrtoolkit.sourceforge.net/

Iphone용 AR TOOLKIT
http://www.artoolworks.com/ARToolKit_iPhone.html

JarToolkit 
http://sourceforge.net/projects/jartoolkit/

PyARTK - Python Binding for ARToolKit
http://mgldev.scripps.edu/projects/pyartk/

ARToolKitPlus - for mobile
http://studierstube.icg.tu-graz.ac.at/handheld_ar/artoolkitplus.php

NyARToolKit -PureJava or C# or C ****
http://nyatla.jp/nyartoolkit/wiki/index.php?FrontPage.en

AR 관련 사이트
일본
http://park7.wakwak.com/~blackbox/
미국
http://studierstube.icg.tu-graz.ac.at/handheld_ar/old_projects.php
http://projekt.medieninformatik.de/argui/05_links.htm
http://www.hcilab.pe.kr/links/linkIndex.html

설치관련 문서 및 튜토리얼
AR TOOLKIt 설치
http://203.241.190.120/cgl_board/view.php?id=seminar_under&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=vote&desc=asc&no=93
http://blog.daum.net/_blog/BlogView.do?blogid=0I9L6&articleno=2871843&categoryId=#ajax_history_home
http://blog.naver.com/julaki/80045599991

AR Toolkit Documentation and Tutorital
http://www.hitl.washington.edu/artoolkit/documentation/


상용화된 프로그램
전뇌피규어 ARis
https://www.youtube.com/watch?v=yCCx7zANsGE&eurl=http://blog.eufy.com/1071&feature=player_embedded
https://www.youtube.com/watch?v=o5ytkOgEaMU&eurl=http://www.rupaus.com/blog/127&feature=player_embedded

PS3 - EyePet
https://www.youtube.com/watch?v=KTarqm4FCDY&eurl=http://yoon-o.tistory.com/77&feature=player_embedded

Posted by 가희나희아빠 희자매(가희나희)아빠
ARToolkit + OpenVRML Setting 

다음 사이트를 참조..
http://calmarea.net/?p=167
Posted by 가희나희아빠 희자매(가희나희)아빠
- Cximage api에 대해 잘 정리해 놓은것 퍼와서 편집함...
http://katalog.egloos.com/tb/2626276

A. CxImage classes
1. CxPoint2

더보기


2. CxRect2 

더보기



3. CxFile
추상클래스로 CxIOFile, CxMemFile의 부모 클래스가 된다. 

4. CxIOFile 

더보기


5. CxMemFile 
메모리 상에서 파일 입출력의 형태를 구현한 것이다. 

더보기



6. CxImage 

더보기

Posted by 가희나희아빠 희자매(가희나희)아빠
IplImage -> Bitmap 로 변경시

Bitmap -> IplImage 로 변경시
Posted by 가희나희아빠 희자매(가희나희)아빠
TAG OpenCV

gray_dilation_shape(m_hoSource, &ImageMax, 1.5, 1.5, "rectangle");              // Gray Level 확장

threshold(ImageMax, &Region, 140, 255);                                         // Threshold 찾기

connection(Region, &ConnectedRegions);                                          // 지정영역연결

HTuple lStart[2], lLast[2];                                                    // 영역지정값    

// 찾을영역지정

lStart[0] = (m_htImgWidth  / 2) - (lTipRgnWidth  * 0.5 * PIXEL_UNIT_ANTI);      // 좌상단 위치 지정 (가로)

lStart[1] = (m_htImgHeight / 2) - (lTipRgnHeight * 0.5 * PIXEL_UNIT_ANTI);      // 좌상단 위치 지정 (세로)

lLast[0]  = (m_htImgWidth  / 2) + (lTipRgnWidth  * 0.5 * PIXEL_UNIT_ANTI);      // 우하단 위치 지정 (가로)

lLast[1]  = (m_htImgHeight / 2) + (lTipRgnHeight * 0.5 * PIXEL_UNIT_ANTI);      // 우하단 위치 지정 (세로)

// 중심을 기준으로 검사 영역 설정

clip_region(ConnectedRegions, &RegionClipped, lStart[1],lStart[0],lLast[1],lLast[0]);  

select_shape(ConnectedRegions, &SelectedRegions1, "width", "and",10, 55);       // 지정크기영역만찾기(너비)

select_shape(SelectedRegions1, &SelectedRegions2, "height", "and",10, 55);      // 지정크기영역만찾기(높이)

select_shape(SelectedRegions2, &RegionTrans, "area", "and",100, 2700);          // 지정크기영역만찾기(영역)

shape_trans(SelectedRegions, &RegionTrans, "rectangle1");                       // 영역을변경

 

// 이하 이부분은 동일함 어차피 한 개의 영역만 구하고 화면 표시하는 부분이므로..

count_obj(RegionTrans, &SelectNum);                                             // 구한 영역 개수 구하기

long nNum;

tuple_int(SelectNum, &nNum);                                                    // 구한 개수를 일반 상수로 변경

// 구한 개수가 하나일 경우에만 다음과 같이 처리 하나 이상일 경우 에러 처리

HTuple X,Y, HalfX, HalfY;

area_center(RegionTrans, &Area, &Row, &Column);                                 // 구한 영역 중심값 구하기

// 영역 계산부분

// 현재 구한 부분을 전체 길이의 절반으로 뺀값이 중심부터 떨어진 값임

X = Column - (m_htImgWidth * 0.5);                                              // 가로축의 부분 계산

Y = Row - (m_htImgHeight * 0.5);                                                // 세로축 부분 계산

tuple_int(X, &lWidth);                                                          // 구한 값을 일반 상수로 변경

tuple_int(Y, &lHeight);

// 구한 결과값을 픽셀당 유니트 크기로 계산하기

nResultX = lWidth  * PIXEL_UNIT;                                                // PIXEL_UNIT은 미리 정의함

nResultY = lHeight * PIXEL_UNIT;

set_color(m_htDisp, "red");                                                     // 표시색상

set_tposition(m_htDisp, 10, 10);//nZoomScale + 10, nZoomScale + 10);            // 텍스트 표시 위치 설정

write_string(m_htDisp, "X : " + nResultX + " Y : " + nResultY);                 // 결과값표시

// 구한 영역을 외곽선만 표시함

set_line_width(m_htDisp, 1);                                                    // 굵기선택

set_draw(m_htDisp, "margin");                                                   // 외곽만표시

set_color(m_htDisp, "blue");                                                   // 표시색상 변경

disp_obj(RegionTrans, m_htDisp);                                               // 영역그리기

Posted by 가희나희아빠 희자매(가희나희)아빠
TAG halcon, MFC, MVT

* 십자 마크 중심에서 떨어진 값 구하기

gray_dilation_shape(m_hoSource, &ImageMax, 1.5, 1.5, "rectangle");              // Gray Level 확장

threshold(ImageMax, &Region, 200, 255);                                         // Threshold 찾기

connection(Region, &ConnectedRegions);                                          // 지정영역연결

select_shape(ConnectedRegions, &SelectedRegions1, "width", "and",300, 400);     // 지정크기영역만찾기(너비)

select_shape(SelectedRegions1, &SelectedRegions2, "height", "and",300, 400);    // 지정크기영역만찾기(높이)

select_shape(SelectedRegions2, &RegionTrans, "area", "and",50000, 100000);      // 지정크기영역만찾기(영역)

shape_trans(SelectedRegions, &RegionTrans, "rectangle1");                       // 영역을변경

 

// 이하 이부분은 동일함 어차피 한 개의 영역만 구하고 화면 표시하는 부분이므로..

count_obj(RegionTrans, &SelectNum);                                             // 구한 영역 개수 구하기

long nNum;

tuple_int(SelectNum, &nNum);                                                    // 구한 개수를 일반 상수로 변경

// 구한 개수가 하나일 경우에만 다음과 같이 처리 하나 이상일 경우 에러 처리

HTuple X,Y, HalfX, HalfY;

area_center(RegionTrans, &Area, &Row, &Column);                                 // 구한 영역 중심값 구하기

// 영역 계산부분

// 현재 구한 부분을 전체 길이의 절반으로 뺀값이 중심부터 떨어진 값임

X = Column - (m_htImgWidth * 0.5);                                              // 가로축의 부분 계산

Y = Row - (m_htImgHeight * 0.5);                                                // 세로축 부분 계산

tuple_int(X, &lWidth);                                                          // 구한 값을 일반 상수로 변경

tuple_int(Y, &lHeight);

// 구한 결과값을 픽셀당 유니트 크기로 계산하기

nResultX = lWidth  * PIXEL_UNIT;                                                // PIXEL_UNIT은 미리 정의함

nResultY = lHeight * PIXEL_UNIT;

set_color(m_htDisp, "red");                                                     // 표시색상

set_tposition(m_htDisp, 10, 10);//nZoomScale + 10, nZoomScale + 10);            // 텍스트 표시 위치 설정

write_string(m_htDisp, "X : " + nResultX + " Y : " + nResultY);                 // 결과값표시

// 구한 영역을 외곽선만 표시함

set_line_width(m_htDisp, 1);                                                    // 굵기선택

set_draw(m_htDisp, "margin");                                                   // 외곽만표시

set_color(m_htDisp, "blue");                                                   // 표시색상 변경

disp_obj(RegionTrans, m_htDisp);                                               // 영역그리기

Posted by 가희나희아빠 희자매(가희나희)아빠
TAG halcon, MFC, MVT

티스토리 툴바