1. 程式人生 > >使用opencv實現影象區域性放大功能

使用opencv實現影象區域性放大功能

由於時間關係這裡先暫且貼上必要演算法的程式碼;

//獲取一個矩形區域中的子區域
void COpencvDlg::GetClipRect(CPoint point, LPRECT lpRect,int d)
{
 CRect rect ;
 rect=*lpRect ;

 lpRect->left=point.x-d ;
 lpRect->top=point.y-d ;

 if(lpRect->left<0)
  lpRect->left=0 ;
 if(lpRect->top<0)
  lpRect->top=0 ;

 lpRect->right=lpRect->left+2*d ;
 lpRect->bottom=lpRect->top+2*d ;
 if(lpRect->bottom>rect.bottom)
 {
  lpRect->top=rect.bottom-2*d ;
  lpRect->bottom=rect.bottom ;
 }
 if(lpRect->right>rect.right)
 {
  lpRect->left=rect.right-2*d ;
  lpRect->right=rect.right ;
 }
}

void COpencvDlg::ProcessMouseMove(int nFlags, CPoint point)
{
 CPoint mPoint1,mPoint2 ;
 CPoint mTemp ;
 CDC *pDc ;
 CRect rect ;
 CvRect rect1 ;
 CvvImage cimg1 ;
 float xScale,yScale ;
 int xOffset,yOffset ;
 CvSize size ;
 IplImage *pTemp ;
 mPoint1.x=0 ;
 mPoint1.y=0 ;
 mPoint2.x=0 ;
 mPoint2.y=0 ;
 GetDlgItem(IDC_STATIC)->ClientToScreen(&mPoint1) ;
 GetDlgItem(IDC_STATIC)->GetClientRect(&rect) ;
 ClientToScreen(&mPoint2) ;
 xOffset=mPoint1.x-mPoint2.x ;
 yOffset=mPoint1.y-mPoint2.y ;
 if(pImage!=NULL)
 {
  xScale=(float)(pImage->width)/(rect.right-rect.left) ;
  yScale=(float)(pImage->height)/(rect.bottom-rect.top) ;
 }
 mTemp.x=point.x-xOffset ;
 mTemp.y=point.y-yOffset ;
 if((mTemp.x<rect.right)&&(mTemp.y<rect.bottom)&&(mTemp.x>=0)&&(mTemp.y>=0))
 {//當且僅當在影象顯示區域時,捕捉滑鼠移動事件
  this->GetClipRect(mTemp,&rect,dd) ;
  pDc=GetDlgItem(IDC_STATIC)->GetDC() ;
 // pDc->Rectangle(&rect) ;
  if(pImage!=NULL)
  {
   this->OnPaint() ;
   rect1.x=rect.left*xScale ;
   rect1.y=rect.top*yScale ;
   rect1.width=2*dd*xScale ;
   rect1.height=2*dd*yScale ;//注意這裡由於影象大小與顯示區域不一致,所以我們要將座標轉化為畫素座標
   cvSetImageROI(pImage ,rect1) ;
   GetDlgItem(IDC_STATIC)->GetClientRect(&rect) ;
   this->GetClipRect(mTemp,&rect,dd*scale) ;
   size.width=rect.right-rect.left ;
   size.height=rect.bottom-rect.top ;
   pTemp=cvCreateImage(size,pImage->depth,pImage->nChannels) ;
   cvResize(pImage,pTemp) ;
   cimg1.CopyOf(pTemp) ;
   cvResetImageROI(pImage) ;

   cimg1.DrawToHDC(pDc->m_hDC,rect) ;
   cvReleaseImage(&pTemp) ;
  }
 }

}