60 #include "rnr/rnrconfig.h" 63 #include "opencv/cv.h" 64 #include "opencv/highgui.h" 67 #include "WM/WMCamera.h" 69 #include "WM/WMLookFeel.h" 70 #include "WM/WMSession.h" 71 #include "WM/WMState.h" 76 using namespace WMWin;
86 WMState::WMState(WMSession &session,
int nInitAction)
88 m_pWin = session.m_pWin;
90 m_nInitAction = nInitAction;
91 m_nCurAction = WMUIActionNone;
92 m_bHardBttnEnable =
true;
116 int WMState::getNextAction(WMSession &session,
int nTimeoutMs)
118 session.m_pWin->WaitEvent(nTimeoutMs);
121 if( m_pMenu != NULL )
123 m_nCurAction = m_pMenu->GetCurrentAction();
124 m_pMenu->SetCurrentAction(WMUIActionNone);
128 m_nCurAction = WMUIActionNone;
133 void WMState::buildInterface(WMSession &session)
139 if( m_pMenu != NULL )
141 m_pMenu->Bind(session.m_pWin);
142 m_nCurAction = m_pMenu->SetCurrentAction(m_nInitAction);
146 session.m_pWin->ShowPageId(session.GetPageNum());
149 setMenuStates(session);
152 session.SetContext(
this);
155 void WMState::destroyInterface()
157 if( m_pMenu != NULL )
164 m_pWin->WorkspaceRemoveAll();
174 bool WMState::isHardButtonPushed(WMSession &session)
177 uint_t key = session.m_pWin->GetLastKeyPress() & 0x00ff;
178 LOGDIAG4(
"Key 0x%x pressed. Camera key=0x%x.", key, WMHardButtonCtlKey);
179 return key == WMHardButtonCtlKey ?
true:
false;
180 #elif defined ARCH_overo 181 return WMHardButtonCtlGetState();
183 uint_t key = session.m_pWin->GetLastKeyPress() & 0x00ff;
184 LOGDIAG4(
"Key 0x%x pressed. Camera key=0x%x.", key, WMHardButtonCtlKey);
185 return key == (uint_t)
'c' ?
true:
false;
197 WMStateImage::WMStateImage(WMSession &session,
198 const CvSize &sizeDisplay,
199 const CvSize &sizeIoI,
201 WMState(session, nInitAction)
206 m_pImgDisplay = NULL;
207 m_sizeDisplay = sizeDisplay;
210 m_pTransShadow = NULL;
211 m_bIoICanZoomIn =
true;
212 m_bIoICanZoomOut =
false;
213 m_bIoIIsPanning =
false;
214 m_bShadowChanged =
false;
220 WMStateImage::~WMStateImage()
237 int WMStateImage::getNextAction(WMSession &session,
int nTimeoutMs)
239 session.m_pWin->WaitEvent(nTimeoutMs);
251 m_pMenu->SetCurrentAction(WMUIActionNone);
252 m_mouse.SetCurrentAction(WMUIActionNone);
257 void WMStateImage::buildInterface(WMSession &session)
260 WMState::buildInterface(session);
263 session.m_pWin->WorkspaceSetAsCvImage();
266 m_mouse.Bind(session.m_pWin);
272 m_pImgShadow = cvCreateImage(m_sizeDisplay, IPL_DEPTH_8U, 3);
275 m_pImgDisplay = cvCreateImage(m_sizeDisplay, IPL_DEPTH_8U, 3);
278 cvSet(m_pImgDisplay, GuiRgbImageBg);
281 session.m_pWin->ShowCvImage(m_pImgDisplay);
287 m_rectIoIRoI = cvRect(0, 0, m_sizeIoI.width, m_sizeIoI.height);
288 m_bShadowChanged =
true;
291 m_pTransIoI =
new WMWinIoI(m_sizeIoI, m_sizeDisplay,
292 WMImgTransRot, WMImgTransAlign, WMImgTransCrop);
295 m_pTransShadow =
new WMWinIoI(m_sizeDisplay, m_sizeDisplay,
296 WMImgTransRot, WMImgTransAlign, WMImgTransCrop);
299 void WMStateImage::destroyInterface()
303 if( m_pImgShadow != NULL )
305 cvReleaseImage(&m_pImgShadow);
309 if( m_pImgDisplay != NULL )
311 cvReleaseImage(&m_pImgDisplay);
312 m_pImgDisplay = NULL;
315 if( m_pTransIoI != NULL )
321 if( m_pTransShadow != NULL )
323 delete m_pTransShadow;
324 m_pTransShadow = NULL;
335 void WMStateImage::resetView(WMSession &session)
338 m_rectIoIRoI = cvRect(0, 0, m_sizeIoI.width, m_sizeIoI.height);
339 m_bShadowChanged =
true;
342 m_bIoICanZoomIn =
true;
343 m_bIoICanZoomOut =
false;
344 m_bIoIIsPanning =
false;
347 m_pTransIoI->SetTransParams(m_sizeIoI,
358 void WMStateImage::markupPanImg(WMSession &session)
360 CvRect shadowROI = mapRect(m_rectIoIRoI);
361 CvScalar brighter = cvScalar(80);
363 cvSetImageROI(m_pImgMarked, shadowROI);
364 cvAddS(m_pImgMarked, brighter, m_pImgMarked);
365 cvResetImageROI(m_pImgMarked);
376 void WMStateImage::showMarkupImg(WMSession &session)
379 if( m_bShadowChanged )
381 LOGDIAG3(
"Updating shadow image.");
384 cvResize(m_pImgIoI, m_pImgShadow);
388 cvSetImageROI(m_pImgIoI, m_rectIoIRoI);
389 cvResize(m_pImgIoI, m_pImgShadow);
390 cvResetImageROI(m_pImgIoI);
393 m_bShadowChanged =
false;
396 cvCopy(m_pImgShadow, m_pImgDisplay);
397 m_pImgMarked = m_pImgDisplay;
404 markupPanImg(session);
410 session.m_pWin->ShowCvImage(m_pImgDisplay);
419 void WMStateImage::showImg(WMSession &session, IplImage *pImg)
422 cvSet(m_pImgDisplay, GuiRgbImageBg);
428 LOGDIAG4(
"Resolution of displayed image: %d, %d",
429 pImg->width, pImg->height);
430 m_pTransShadow->WMWinIoITrans(pImg, m_pImgDisplay);
434 session.m_pWin->ShowCvImage(m_pImgDisplay);
444 CvPoint WMStateImage::mapPt(CvPoint& ptHiRes)
450 ptShadow.x = ptHiRes.x - m_rectIoIRoI.x;
451 ptShadow.y = ptHiRes.y - m_rectIoIRoI.y;
454 fScale = (1.0 * (double)m_sizeDisplay.width) / (double)m_rectIoIRoI.width;
456 ptShadow.x = (
int)(fScale*ptShadow.x);
457 ptShadow.y = (int)(fScale*ptShadow.y);
469 CvPoint WMStateImage::mapPtPan(CvPoint& ptHiRes)
475 fScale = (1.0 * m_sizeDisplay.width) / m_sizeIoI.width;
477 ptShadow.x = (
int)(fScale*ptHiRes.x);
478 ptShadow.y = (int)(fScale*ptHiRes.y);
490 CvRect WMStateImage::mapRect(CvRect& rectHiRes)
495 fScale = (1.0 * m_sizeDisplay.width) / m_sizeIoI.width;
497 rectShadow.x = (
int)(rectHiRes.x*fScale);
498 rectShadow.y = (int)(rectHiRes.y*fScale);
499 rectShadow.width = (int)(rectHiRes.width*fScale);
500 rectShadow.height = (int)(rectHiRes.height*fScale);
516 void WMStateImage::transZoomIn(WMSession &session)
521 if( !m_bIoICanZoomIn )
526 sizeZoom =
ar43width((
int)(m_rectIoIRoI.width * 0.9));
528 if( (sizeZoom.width <= m_sizeDisplay.width) &&
529 (sizeZoom.height <= m_sizeDisplay.height) )
532 m_bIoICanZoomIn =
false;
538 x = m_rectIoIRoI.x + (m_rectIoIRoI.width / 2) - (sizeZoom.width /2);
539 y = m_rectIoIRoI.y + (m_rectIoIRoI.height/ 2) - (sizeZoom.height/2);
541 m_rectIoIRoI = cvRect(x, y, sizeZoom.width, sizeZoom.height);
542 m_bShadowChanged =
true;
544 if ( !m_bIoIIsPanning )
546 m_pTransIoI->SetTransParams(m_sizeIoI,
554 showMarkupImg(session);
556 m_bIoICanZoomOut =
true;
558 setModifiedState(
true);
568 void WMStateImage::transZoomOut(WMSession &session)
573 if( !m_bIoICanZoomOut )
578 sizeZoom =
ar43width((
int)(m_rectIoIRoI.width * 1.1));
580 if( (sizeZoom.width >= m_sizeIoI.width) ||
581 (sizeZoom.height >= m_sizeIoI.height) )
583 sizeZoom = m_sizeIoI;
584 m_bIoICanZoomOut =
false;
588 x = m_rectIoIRoI.x + (m_rectIoIRoI.width / 2) - (sizeZoom.width /2);
589 y = m_rectIoIRoI.y + (m_rectIoIRoI.height/ 2) - (sizeZoom.height/2);
592 if( x + sizeZoom.width > m_sizeIoI.width )
594 x = (m_sizeIoI.width - sizeZoom.width);
601 if( y + sizeZoom.height > m_sizeIoI.height )
603 y = (m_sizeIoI.height - sizeZoom.height);
610 m_rectIoIRoI = cvRect(x, y, sizeZoom.width, sizeZoom.height);
611 m_bShadowChanged =
true;
613 if ( !m_bIoIIsPanning )
615 m_pTransIoI->SetTransParams(m_sizeIoI,
623 showMarkupImg(session);
625 m_bIoICanZoomIn =
true;
627 setModifiedState(
true);
637 void WMStateImage::transPan(WMSession &session)
645 ptRaw = m_mouse.GetMousePoint();
648 if( (ptRaw.x < 0) || (ptRaw.x >= m_sizeDisplay.width) ||
649 (ptRaw.y < 0) || (ptRaw.y >= m_sizeDisplay.height) )
652 LOGDIAG4(
"Mouse pt out of scope for panning.");
655 showMarkupImg(session);
659 ptImg = m_pTransIoI->WMWinIoIMapPoint(ptRaw);
667 if( nAction == WMUIActionDragStart )
669 LOGDIAG4(
"Drag Start");
674 else if( nAction == WMUIActionDragEnd )
676 LOGDIAG4(
"Drag End.");
681 if(( abs(m_ptPanRaw.x - ptRaw.x) < 10 ) && (abs(m_ptPanRaw.y - ptRaw.y) < 10))
686 x = m_rectIoIRoI.x - m_ptPan.x + ptImg.x;
687 y = m_rectIoIRoI.y - m_ptPan.y + ptImg.y;
693 else if( x + m_rectIoIRoI.width > m_sizeIoI.width )
695 x = m_sizeIoI.width - m_rectIoIRoI.width;
702 else if( y + m_rectIoIRoI.height > m_sizeIoI.height )
704 y = m_sizeIoI.height - m_rectIoIRoI.height;
711 CvRect tmpRoI = cvRect(0,0, m_sizeIoI.width, m_sizeIoI.height);
712 m_pTransIoI->SetTransParams(m_sizeIoI,
722 showMarkupImg(session);
724 setModifiedState(
true);
735 WMStateCvCamera::WMStateCvCamera(WMSession &session,
736 const CvSize &sizeDisplay,
737 const CameraRes eVideoRes,
738 const CameraRes eImageRes,
740 WMState(session, nInitAction),
741 m_camera(session.m_sVidDevName, session.m_nVideoIndex, eVideoRes, eImageRes)
744 m_pImgDisplay = NULL;
745 m_sizeDisplay = sizeDisplay;
746 m_eVideoRes = eVideoRes;
755 WMStateCvCamera::~WMStateCvCamera()
772 int WMStateCvCamera::getNextAction(WMSession &session,
int nTimeoutMs)
774 session.m_pWin->WaitEvent(nTimeoutMs);
789 m_pMenu->SetCurrentAction(WMUIActionNone);
794 void WMStateCvCamera::buildInterface(WMSession &session)
797 WMState::buildInterface(session);
800 session.m_pWin->WorkspaceSetAsCvImage();
803 m_pImgDisplay = cvCreateImage(m_sizeDisplay, IPL_DEPTH_8U, 3);
806 cvSet(m_pImgDisplay, GuiRgbImageBg);
809 session.m_pWin->ShowCvImage(m_pImgDisplay);
819 m_pTransIoI =
new WMWinIoI(
m_camera.getVideoResolution(),
833 void WMStateCvCamera::destroyInterface()
835 if( m_pImgMarked != NULL )
837 cvReleaseImage(&m_pImgMarked);
841 if( m_pImgDisplay != NULL )
843 cvReleaseImage(&m_pImgDisplay);
844 m_pImgDisplay = NULL;
847 if( m_pTransIoI != NULL )
859 void WMStateCvCamera::cloneFrame(WMSession &session)
864 if( m_pImgMarked != NULL )
866 cvReleaseImage(&m_pImgMarked);
871 if( (pImgFrame =
m_camera.getCurFrame()) != NULL )
873 m_pImgMarked = cvCloneImage(pImgFrame);
884 void WMStateCvCamera::showMarkupImg(WMSession &session)
893 showImg(session, m_pImgMarked);
902 void WMStateCvCamera::showImg(WMSession &session, IplImage *pImg)
905 cvSet(m_pImgDisplay, GuiRgbImageBg);
910 m_pTransIoI->WMWinIoITrans(pImg, m_pImgDisplay);
914 session.m_pWin->ShowCvImage(m_pImgDisplay);
928 void WMStateCvCamera::transRunVideo(WMSession &session)
932 if( (pImgFrame =
m_camera.grabFrame()) == NULL )
934 session.PushFatalState(
"Failed to grab video frame.");
938 showImg(session, pImgFrame);
949 void WMStateCvCamera::transRunMarkupVideo(WMSession &session)
953 if( (pImgFrame =
m_camera.grabFrame()) == NULL )
955 session.PushFatalState(
"Failed to grab video frame.");
959 showMarkupImg(session);
970 void WMStateCvCamera::transStopVideo(WMSession &session)
983 WMStateGstCamera::WMStateGstCamera(WMSession &session,
984 const CvSize &sizeDisplay,
985 const CameraRes eVideoRes,
986 const CameraRes eImageRes,
988 WMState(session, nInitAction),
989 m_camera(session.m_sVidDevName, session.m_nVideoIndex, eVideoRes, eImageRes)
999 WMStateGstCamera::~WMStateGstCamera()
1016 int WMStateGstCamera::getNextAction(WMSession &session,
int nTimeoutMs)
1018 session.m_pWin->WaitEvent(nTimeoutMs);
1033 m_pMenu->SetCurrentAction(WMUIActionNone);
1038 void WMStateGstCamera::buildInterface(WMSession &session)
1041 WMState::buildInterface(session);
1047 m_camera.setXid(session.m_pWin->GetGstXid());
1053 void WMStateGstCamera::destroyInterface()
1064 void WMStateGstCamera::cloneFrame(WMSession &session)
1075 void WMStateGstCamera::showMarkupImg(WMSession &session)
1087 void WMStateGstCamera::showImg(WMSession &session, IplImage *pImg)
1102 void WMStateGstCamera::transRunVideo(WMSession &session)
1114 void WMStateGstCamera::transRunMarkupVideo(WMSession &session)
1125 void WMStateGstCamera::transStopVideo(WMSession &session)
int m_nCurAction
current state input action
bool m_bPaused
capturing images is [not] paused
Menu * m_pMenu
button menu
bool m_bHardBttnEnable
enable/disable hard button input
cv::Size ar43width(cv::Size &siz)
Calculate the nearest 4:3 aspect ratio from the width component of the target size.
GstCamera m_camera
video camera instance
CvSize m_sizeVidWin
size of video window
int getCurAction()
Get the currently retrieved input action.