使用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) ;
}
}
}