当前位置:   article > 正文

MFC picture控件画矩形框选取图像ROI区域_mfc 旋转矩形 roi

mfc 旋转矩形 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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/144236
推荐阅读
相关标签
  

闽ICP备14008679号