MFC에서 카메라 영상 PictureControl에 띄워 주는 예제
- 이전 예제 [MFC]OPENCV연동-1.VIEW MAT image ( http://rootiel.tistory.com/3 )에 이어서 실제 카메라 센서에서 입력받은 영상을 Picture Control에 실시간으로 보여주는 예제입니다.
- 이전 예제에서 Opencv연동, Opencv mat image를 Cstatic으로 변환시킨 후 Picture Control에 바로 보여주는 작업이 이미 완료되었다고 가정하고 진행합니다.
onTimer 생성
영상이라고 해서 복잡하게 생각할 것 없다. 단순히 이미지가 연속적으로 보여지면 되는 것이다.
MFC에서 반복적으로 동일한 작업을 진행하는 이벤트로 onTimer가 있다. onTimer는 일정한 주기로 작업을 반복하게 만들어 준다.
특정작업을 반복할 위치에서 SetTimer를 불러주면 되는데 프로그램 시작부터 onTimer가 반복되려면initDialog함수 내부에 SetTimer를 위치시켜 준다.
1 | SetTimer(_PMD_CAM_DEPTH, 100, NULL); | cs |
_PMD_CMD_DEPTH : 미리 DEFINE된 특정값
100 : 반복 주기 0.1초
0.1초 마다 아래와 같은 OnTimer가 호출되는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | void CpmdCamViewerDlg::OnTimer(UINT_PTR nIDEvent) { switch (nIDEvent) { case _PMD_CAM_DEPTH: if (pmdListener.savedCheck){ pmdListener.getDepthImage(pmdDepth); iml.getPseudoColor(pmdDepth, pmdDepth_sudoColor, CV_32FC1); DisplayImage(pmdDepth_sudoColor); } break; } } | cs |
//다이알 로그 헤더
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class CpmdCamViewerDlg : public CDialogEx { ... public: cv::Mat pmdDepth; cv::Mat pmdDepth_sudoColor; ... private: pmdListener pmdListener; imageHandling iml; } | cs |
그리고 실제 돌려보면 영상이 잘나온다.
예제 끝 !!!!!!
이라고 하면 좋으나 사실 코드 내의 pmdListener의 savedCheck라던지 getDepthImage함수
그리고 Image Handling하기 위한 getPseudoColor 함수등은 내가 직접 만든 것이다.
카메라 종류에 따라서 Opencv Mat으로 결과를 바로 뽑을 수 있게 솔루션을 제공해주는 친절한 업체도 많지만 이번에 사용한 카메라는 불행히도 그렇지 않다.
Camera or ToF Sensor
코드 내용을 보고 눈치챌 수도 있겠지만 이번에 사용한 카메라는 다음과 같다.
PMD의 Pico FLEXX 제품( TOF Sensor )
PMD의 Pico FLEXX 사양은 다음과 같다.
앞에서 Camera 라 표현 했지만 거의 대부분 TOF(Time Of Flight) Sensor라 부르더라.
최근 3D sensor를 만지고 있는 사람이라면 Resolution이나 화각이 너무 작은 게 아니냐 생각할 지도 모르겠으나 실내 전용으로 만들어진 것이고 실제 만져보면 굉장히 작고 가볍다.
모바일용으로 만들어 졌다고 한다(지들말로는)
어쨋든 현재 하는 작업이 먼 거리의 깊이 정확도가 중요치 않기 때문에 사용중이다.
그리고 생각보다 깊이 결과(Depth)가 정확하다.(구체적으로 말하기는 조금 그렇고...)
단순한 Vision Camera나 웹캠 뿐만이 아니라 ToF sensor던지 Thermal camera(열화상)던지 하물며 단순한 영역의 Laser sensor라 할지라도 일정 영역만큼 특정한 값의 행렬로 결과가 리턴이 된다면 Mat으로 표현이 가능하다. Mat 자체가 행렬표현식이기 때문이다.
1 2 3 4 5 6 7 8 9 | struct DepthPoint { float x; //!< X coordinate [meters] float y; //!< Y coordinate [meters] float z; //!< Z coordinate [meters] float noise; //!< noise value [meters] uint16_t grayValue; //!< 16-bit gray value uint8_t depthConfidence; //!< value from 0 (invalid) to 255 (full confidence) }; | cs |
실제 PMD library에서 제공 받을 수 있는 struct인데 x, y, z값을 받을 수 있으므로 쉽게 Mat 행렬을 만들 수 있다.
그리고 만일 z가 Mat의 단위값이라면 z(m)값의 범위는 0.1 ~ 4 (거리 최소,최대)가 되므로
이 Mat을 바로 출력하면 흑색으로만 나오게 되니
예제 코드에서는 pseudoColorMapping 을 통해서 특정 범위의 값 Mat을 이쁘게 표현한 것이다.
'연구중 > MFC' 카테고리의 다른 글
[MFC]OPENCV연동-1. VIEW MAT image (5) | 2017.08.02 |
---|