现在的位置: 首页 > 综合 > 正文

使用opencv实现图像局部放大功能

2018年03月16日 ⁄ 综合 ⁄ 共 1894字 ⁄ 字号 评论关闭

由于时间关系这里先暂且贴上必要算法的代码;

//获取一个矩形区域中的子区域
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) ;
  }
 }

}

抱歉!评论已关闭.