1. 程式人生 > >MFC picture控制元件畫矩形框選取影象ROI區域

MFC picture控制元件畫矩形框選取影象ROI區域

  1. 上述帖子中提到了兩種方法,一是#5提到的直接在滑鼠響應函式中畫矩形框,二是使用橡皮筋類畫框。
  2. 我是使用了第一種方法,但是出現了一個問題,點選滑鼠的位置和開始畫框的位置不一致,總有固定的一段距離,分析應該是picture控制元件左上座標和對話方塊左上座標不一致的原因造成的。採取了一種妥協的解決方法是儘量將picture控制元件的左上角與對話方塊左上角對齊,雖然無法完全對齊,最後看起來效果基本滿意。有待進一步解決。
  3. 為了實現拖動滑鼠實時畫出矩形框,而不是等到最後才畫框,在mousemove訊息函式中,實時重新整理影象,重新繪製矩形。這樣有一個問題是,當影象很大(2592*1944)時,重新整理速度跟不上滑鼠移動速度,會有延遲出現。影象較小時,不會有這個問題。有待進一步解決。
void CPcbRegionMatchDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值
    m_fLButtonDownNotUp = true;
    if((point.x<m_picRect.right)&&(point.x>m_picRect.left)&&(point.y<m_picRect.bottom)&&(point.y>m_picRect.top)){
        m_chRegionLeftTopPoint = point;
} CDialogEx::OnLButtonDown(nFlags, point); } void CPcbRegionMatchDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 if((point.x<m_picRect.right)&&(point.x>m_picRect.left)&&(point.y<m_picRect.bottom)&&(point.y>m_picRect.top
)){ if(m_fLButtonDownNotUp){ //m_drawImg = m_pcbOcr.getImg(); m_cimg.CopyOf(&IplImage(m_drawImg),m_drawImg.channels()); GetDlgItem(IDC_PICTURE)->GetClientRect(&m_picRect); //獲取box1客戶區 m_cimg.DrawToHDC(m_picHDC,&m_picRect); m_chRegionRightBottomPoint = point; CDC *pDC = GetDlgItem(IDC_PICTURE)->GetDC(); CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH); CPen* pen = new CPen(PS_SOLID,1,RGB(0,255,0)); CPen* oldPen = pDC->SelectObject(pen); pDC->Rectangle(CRect(m_chRegionLeftTopPoint,m_chRegionRightBottomPoint)); pDC->SelectObject(pOldBrush); pDC->SelectObject(oldPen); delete pen; } } CDialogEx::OnMouseMove(nFlags, point); } void CPcbRegionMatchDlg::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 if((point.x<m_picRect.right)&&(point.x>m_picRect.left)&&(point.y<m_picRect.bottom)&&(point.y>m_picRect.top)){ if(m_fLButtonDownNotUp){ m_chRegionRightBottomPoint = point; //繪製矩形 CDC *pDC = GetDlgItem(IDC_PICTURE)->GetDC(); CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH); CPen* pen = new CPen(PS_SOLID,1,RGB(0,255,0)); CPen* oldPen = pDC->SelectObject(pen); pDC->Rectangle(CRect(m_chRegionLeftTopPoint,m_chRegionRightBottomPoint)); pDC->SelectObject(pOldBrush); pDC->SelectObject(oldPen); delete pen; //矩形區域換算到影象區域 double widthRatio = double(m_drawImg.cols)/m_picRect.Width(); double heightRatio = double(m_drawImg.rows)/m_picRect.Height(); m_subImgRect.x = int(m_chRegionLeftTopPoint.x * widthRatio); m_subImgRect.y = int(m_chRegionLeftTopPoint.y * heightRatio); m_subImgRect.width = int((m_chRegionRightBottomPoint.x - m_chRegionLeftTopPoint.x)* widthRatio); m_subImgRect.height = int((m_chRegionRightBottomPoint.y - m_chRegionLeftTopPoint.y)* heightRatio); /*Mat subImg = m_drawImg(m_subImgRect); namedWindow("subImg"); imshow("subImg",subImg); waitKey();*/ } } m_fLButtonDownNotUp = false; CDialogEx::OnLButtonUp(nFlags, point); }