Kinect 2.0을 구매한지 꽤~ 오래 되었지만, 드디어 맛 볼? 기회가 생겨서 이리저리 구동시켜 보았네요.

 

일단 기본 정보는 전에 포스팅 한것을 참조하시면 될듯 합니다.

 

2013/05/22 - [[ Topics ]/Kinect 2.0] - Xbox One & Kinect2 are announced!!

 

그래도 요약을 하자면,

 

Operating System: Windows 8.0 or 8.1 and Windows embedded standard 8

Field of view (RGB camera): 84.1º in horizontal , 53.8º in vertical

Field of view (IR camera): 70.6º in horizontal , 60º in vertical

Depth information: 0.5 ~ 8.0m (Reasonable distance: 0.8~4.0m), ToF(Time of Flight) camera

Color stream: 1920 X 1080 (16:9), YUY2, 30fps

Depth stream: 512 X 424, 30fps

IR stream: 512 X 424, 30fps

Data path: USB 3.0

 

대충 이렇습니다,

 

 

 

다른 블로거님의 포스팅을 빌려서 하드웨어 부분을 설명할께요 ^^;;

 

http://blog.naver.com/tachikomatic/220130374854

 

 

 

그리고 Kinect SDK 2.0 도 (한참전에) 출시가 되었습니다.

 

https://www.microsoft.com/en-us/kinectforwindows/develop/

 

여기로 가시면 바로 다운 받으실수 있어요.

 

 

 

제공된 샘플코드들을 실행해보고 느낀점은 훨씬 간단해졌다는 점이었습니다.

 

왜냐면 훨씬 잘 정돈 되어있었고, 간결해졌다고나 할까..??

 

또한 각각의 카메라 정보 (RGB, IR, Depth) 동시에! 획득 가능하다는 점!

 

개인적으로 제일 반가웠던 점입니다.

 

자체적으로 따로 구분 지어서 프로세스 되게 구축해놓은거 같더군요.

 

아무튼 개인적으로는 정말 희소식 입니다.

 

 

 

그리고, 혹시나 필요하신분들이 계실까봐 미천한 소스코드지만, 정리해서 올립니다. ^^;;;;;

 

프로그램은 콘솔 기반이구요, OpenCV 를 써서 영상을 출력 시켰습니다.

 

Kinect 2.0 장치를 초기화 및 구동하는데 필요한 부분만 SDK 샘플코드에서 발췌해서 만들었구요, RGB, IR, Depth 영상 따로 따로 CV윈도우 창 띄워서 출력 되게 만들었습니다.

 

좀 더 자세히 설명 드리자면.. Visual Studio 2012, OpenCV 2.4.2, Kinect SDK 2.0, C++, Console based 입니다.

 

아래 이미지들은 SDK에 있는 샘플소스코드들을 취합해서 만든 콘솔기반 프로그램에서 캡쳐한 영상들 입니다. 둘 다 쩍벌남이네요 ㅎㅎ (다리 좀 오므리고 찍을껄..)

 

 

KinectV2_Console_151027_RGB_IR_Depth_Complete.vol1.egg

 

KinectV2_Console_151027_RGB_IR_Depth_Complete.vol2.egg

 

 

Color image: 1920 X 1080 (16:9)

 

IR image: 512 X 424

 

Depth image: 512 X 424 (normalized in 0~255)

 

 

 

2013/05/22 - [[ Topics ]/Kinect 2.0] - Xbox One & Kinect2 are announced!!

 

2013/07/19 - [[ Topics ]/Kinect 1.0] - [KinectSDK 1.7]FaceTracking Test!

 

2013/02/28 - [[ Topics ]/Kinect 1.0] - Kinect의 IR-Camera 로의 접근

 

2012/04/24 - [[ Topics ]/Kinect 1.0] - RGB 이미지와 Depth 이미지의 Calibration

 

 

 

 

 

Posted by Tommy™
,

OpenCV 를 사용하다보면 이미지를 저장하는 배열의 형태가 사람마다 각각 다를 경우를 겪으신  분들이 있을겁니다.

 

예를들어 다른 선구자들이 만들어 놓은 소스코드를 참고하고자 할때, CvMat, cv::Mat, IplImage, CvArr 등등 각각 다른 포멧을 사용하는것을 보신 분들이 있을텐데요,

 

저도 이러한 경우를 자주 겪어서 정리 겸, 정보 공유 겸, 오랫만에 포스팅 겸.. 해서 글을 적게 되었네요.

 

 

 

 

//OpenCV 이미지 변환
//Mat & CvMat & IplImage, CvArr convert function

IplImage to->

 

IplImage* -> cv::Mat

1. Mat Mat_img(IplImage_img);

2. Mat Mat_img = cvarrToMat(IplImage_img);

 

IplImage* -> CvMat

cvGetMat( IplImage_img, &CvMat_img);

 

 

 

cv::Mat to->

 

cv::Mat -> IplImage*

IplImage *IplImage_img = new IplImage(Mat_img);

 

cv::Mat -> CvMat

CvMat CvMat_img = Mat_img; // convert directly

 

 

 

CvMat to->

 

CvMat -> IplImage*

IplImage *IplImage_img = cvGetImage(CvMat_img);

 

CvMat -> cv::Mat

Mat Mat_img(CvMat_img);

 

 

 

 

 

 

 

 

Referenced:

http://docs.opencv.org/index.html

http://v_lovepooh_v.blog.me/20170546845

http://blog.naver.com/makerslee/30146885035

http://codens.info/386

http://www.cyworld.com/fish_blog/4695785

Posted by Tommy™
,

역시나 오늘도 작업하다가 알게된 사소하지만 나름? 유익한 정보를 공유하고자 한다.

 

물론 알고 계신분들은 많으실거라 보지만, 난 몰랐기에...

 

일단 기본적으로 웹캠으로 부터 영상을 얻어오면 640X480 사이즈이다.

(예전에는 320X240 이었던 시절이..)

 

하지만,

 

요즘에는 FullHD 화질을 지원하는 웹카메라들이 많다.

 

그중에 나는 Microsoft 사의 LifeCam - Studio 모델을 사용한다.

 

그래서 OpenCV를 활용하여 1080p FullHD 영상을 매프레임 얻어오고자 하는데,

 

아무리해도 640X480 영상밖에 얻어오질 못했다.

 

그래서 구글링 하던 결과..

 

하나의 솔루션을 찾았는데,

 

링크 참조 : http://stackoverflow.com/questions/15768260/get-maximum-resolution-when-capturing-image-data-with-cvqueryframe

 

 

 

m_pCapture = cvCreateCameraCapture(0);

 

후에

 

cvSetCaptureProperty(m_pCapture,CV_CAP_PROP_FRAME_WIDTH,1920);
cvSetCaptureProperty(m_pCapture,CV_CAP_PROP_FRAME_HEIGHT,1080);

 

이렇게 하면 카메라 파라미터를 1920X1080 으로 세팅 해줌으로써 문제없이 FullHD 영상을 매 프레임 캡쳐할 수 있었다.

 

 

Posted by Tommy™
,

 

 

 

 

 

현재 하고 있는 프로젝트에서 cvReleaseCapture() 를 하게 되면 계속 프로그램이 정상적으로 release 되지않고 메모리릭을 발생시키면서 그냥 죽어버린다.

 

도대체 뭐가 문제일까....

 

참고 주소 : http://onbranding.kr/6

 

위 블로그를 통해 그 답을 얻을수 있었는데,

 

인용하면..

 

 

 

 

cvRetrieveFrame 함수나 cvQueryFrame 함수 등을 이용해 카메라에서 프레임을 받아넣은 IplImage 구조체는 따로 Release해주어서는 절대 안된다!!

 

 

 

 

그런데 나는 프레임을 받아넣은 IplImage 구조체를 먼저 cvReleaseImage() 해줬으니 계속 프로그램이 죽을수 밖에 없지 아니한가!

 

즉 할당한 구조체의 메모리를 반환하려는데, 이미 반환해버렸으니 접근자 에러로 인해 프로그램이 뻗는 논리인셈..

 

오늘도 새로운것 하나 알게 되었군 ^^

 

 

 

 

 

Posted by Tommy™
,

몇일전 OpenCV 2.4 버전이 릴리즈 되었다.

 

새로운 기능들이 많이 추가되고 한거같은데, 뭐 나의 관심 밖이니..

 

뭐 어째뜬 난 2.0 버전이 최신 버전일때부터 꾸준히 써왔는데, 이번에 작업하는 부분에서 동영상을 재생시켜야 했다.

 

잘 되려니 했는데.. 재생이 안되고 이런저런 문제점들이 급수기하적으로 막 쏟아지는거였다..

 

제일 중요한건 cvCreateFileCapture() 함수가 계속 파일을 못읽어들이고 NULL값을 리턴하는것이었다.

 

그래서 결국 2.4버전으로 갈아타고나서는 동영상 재생문제도 바로 해결,

 

하지만, 다른 커다란 문제점이 발생했다.

 

2.0버전만 써오던 나로써는 2.2 버전 Release 되었을때 CvvImage 클래스가 사라진것을 몰랐다..!! 젠장!!

 

그래서.. 이리저리 구글링하다가 나랑 같은 증상을 겪는 사람들이 많은걸 알고, 직접 구현??까진 아니구 취합해서 같은 기능을 하게 만들어보자고 생각해서 작업을 몇시간 진행했는데, 다행히 잘 구동 된다. 기존의 것과 똑같이!!

 

원래 CvvImage 클래스내부의 DrawToHDC()함수를 직접 구현했는데, 아래 소스코드도 첨부하겠다.

 

물론 소스코드는 본인이 취합한거라 지저분하거나 맘에 안드는 부분이 있을것인데, 쓸사람만 쓰길..

 

 

void CCV_Mgr::DrawToHDC(IplImage* pImage, HDC dc, RECT* rect)
{
    if( rect && pImage && pImage->depth == IPL_DEPTH_8U && pImage->imageData )
 {
  uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
  BITMAPINFO* bmi = (BITMAPINFO*)buffer;
  int bmp_w = pImage->width, bmp_h = pImage->height;
  CvRect roi = cvGetImageROI( pImage );
  CvRect dst = RectToCvRect( *rect );
  if( roi.width == dst.width && roi.height == dst.height )
  {
   Show( pImage, dc, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y );
   return;
  }
  if( roi.width > dst.width )
  {
   SetStretchBltMode(
       dc,           // handle to device context
       HALFTONE );
  }
  else
  {
   SetStretchBltMode(
       dc,           // handle to device context
       COLORONCOLOR );
  }
  FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(pImage), pImage->origin );
  ::StretchDIBits(
   dc,
   dst.x, dst.y, dst.width, dst.height,
   roi.x, roi.y, roi.width, roi.height,
   pImage->imageData, bmi, DIB_RGB_COLORS, SRCCOPY );
 }
}

void CCV_Mgr::Show( IplImage* pImage, HDC dc, int x, int y, int w, int h, int from_x, int from_y )
{
 if( pImage && pImage->depth == IPL_DEPTH_8U )
 {
  uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
  BITMAPINFO* bmi = (BITMAPINFO*)buffer;
  int bmp_w = pImage->width, bmp_h = pImage->height;
  FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(pImage), pImage->origin );
  from_x = MIN( MAX( from_x, 0 ), bmp_w - 1 );
  from_y = MIN( MAX( from_y, 0 ), bmp_h - 1 );
  int sw = MAX( MIN( bmp_w - from_x, w ), 0 );
  int sh = MAX( MIN( bmp_h - from_y, h ), 0 );
  SetDIBitsToDevice(
   dc, x, y, sw, sh, from_x, from_y, from_y, sh,
   pImage->imageData + from_y*pImage->widthStep,
   bmi, DIB_RGB_COLORS );
 }
}

void CCV_Mgr::FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
{
 assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));

 BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
 memset( bmih, 0, sizeof(*bmih));
 bmih->biSize = sizeof(BITMAPINFOHEADER);
 bmih->biWidth = width;
 bmih->biHeight = origin ? abs(height) : -abs(height);
 bmih->biPlanes = 1;
 bmih->biBitCount = (unsigned short)bpp;
 bmih->biCompression = BI_RGB;

 if( bpp == 8 )
 {
  RGBQUAD* palette = bmi->bmiColors;
  int i;
  for( i = 0; i < 256; i++ )
  {
   palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
   palette[i].rgbReserved = 0;
  }
 }
}

int CCV_Mgr::Bpp(IplImage* pImage)
{
 return pImage ? (pImage->depth & 255)*pImage->nChannels : 0;
}

CvRect CCV_Mgr::RectToCvRect(RECT rect)
{
 rect = NormalizeRect( rect );
 return cvRect( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top );
}

RECT CCV_Mgr::NormalizeRect( RECT r )
{
 int t;

 if( r.left > r.right )
 {
  t = r.left;
  r.left = r.right;
  r.right = t;
 }

 if( r.top > r.bottom )
 {
  t = r.top;
  r.top = r.bottom;
  r.bottom = t;
 }

 return r;
}

'[ Topics ] > OpenCV' 카테고리의 다른 글

cvReleaseCapture() 사용할때 주의사항!  (2) 2013.11.19
tbb.dll Error, 그리고 해결  (0) 2012.09.19
cvFindContours() 함수  (0) 2012.02.13
나의 구세주 : cvPointPolygonTest()  (0) 2012.02.09
Opencv Contour 구하는 부분  (0) 2010.12.10
Posted by Tommy™
,