MFC picture控件畫矩形框選取圖像ROI區域

參考《關於對話框picture控件裏畫矩形的問題》http://bbs.csdn.net/topics/390772898

  1. 上述帖子中提到了兩種方法,一是#5提到的直接在鼠標響應函數中畫矩形框,二是使用橡皮筋類畫框。
  2. 我是使用了第一種方法,但是出現了一個問題,點擊鼠標的位置和開始畫框的位置不一致,總有固定的一段距離,分析應該是picture控件左上座標和對話框左上座標不一致的原因造成的。採取了一種妥協的解決方法是儘量將picture控件的左上角與對話框左上角對齊,雖然無法完全對齊,最後看起來效果基本滿意。有待進一步解決。
  3. 爲了實現拖動鼠標實時畫出矩形框,而不是等到最後才畫框,在mousemove消息函數中,實時刷新圖像,重新繪製矩形。這樣有一個問題是,當圖像很大(2592*1944)時,刷新速度跟不上鼠標移動速度,會有延遲出現。圖像較小時,不會有這個問題。有待進一步解決。
  4. 調用將opencv的Mat在MFC中的繪製類CvvImage,具體參考## MFC如何使用opencv中的CvvImage類 ##http://blog.sina.com.cn/s/blog_6d1ba4910100w51v.html
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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章