zoukankan      html  css  js  c++  java
  • 知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?

    一直以来,我使用的方法都是shiqiyu在opencvchina上面提供的引入directshow,并且采用cvvimage和cameraDs的方法。这个方法虽然在xp/win7/win8下面都能够成果使用,但是一直以来我都没有动机去深入看一看这个方法。这次在知乎上面看到 jie wu 提出的“将Opencv窗口添加到PictureControl”中的方法,感到思路很好,进行了具体实现

    http://pan.baidu.com/s/1nuixdhR

    具体可以看代码,我帖一些主要代码
    void CMfcRibbonTemplateView::OnInitialUpdate()
    {
    CFormView::OnInitialUpdate();
    GetParentFrame()->RecalcLayout();
    ResizeParentToFit();
    //根据控件的大小设置初始帧的大小
    CRect rect;
    GetDlgItem(IDC_PBSRC) ->GetClientRect( &rect ); // 获取控件尺寸位置
    m_lframe = Mat::zeros(rect.Height(),rect.Width(),CV_8UC3);
    GetDlgItem(IDC_PBSRC) ->GetClientRect( &rect );
    m_rframe = Mat::zeros(rect.Height(),rect.Width(),CV_8UC3);
    //绑定Mat到Picturebox上去
    namedWindow("src",WINDOW_AUTOSIZE);
    HWND hWnd = (HWND)cvGetWindowHandle("src");
    HWND hParnt = ::GetParent(hWnd);
    ::SetParent(hWnd,GetDlgItem(IDC_PBSRC)->m_hWnd);
    ::ShowWindow(hParnt,SW_HIDE);
    namedWindow("dst",WINDOW_AUTOSIZE);
    hWnd = (HWND)cvGetWindowHandle("dst");
    hParnt = ::GetParent(hWnd);
    ::SetParent(hWnd,GetDlgItem(IDC_PBDEST)->m_hWnd);
    ::ShowWindow(hParnt,SW_HIDE);
    }
     
    void CMfcRibbonTemplateView::OnSize(UINT nType, int cx, int cy)
    {
    CFormView::OnSize(nType, cx, cy);
    CWnd* pwndsrc = GetDlgItem(IDC_PBSRC);
    CWnd* pwnddst = GetDlgItem(IDC_PBDEST);
    //计算出长宽,这里的长宽是按照比例的,图像居中显示
    int iblank = 15; //边界空余
    int iwidth = cx/2-iblank*2;
    int iheight =(int)(iwidth*0.75);
    if (pwndsrc->GetSafeHwnd() && pwnddst->GetSafeHwnd()){
    pwndsrc->MoveWindow(iblank,(cy-iheight)*0.4,iwidth,iheight);
    pwnddst->MoveWindow(cx/2+iblank,(cy-iheight)*0.4,iwidth,iheight);
    }
    }
     
    void CMfcRibbonTemplateView::showimage(Mat& src, UINT ID)
    {
    if (src.empty())
    return;
    CRect rect;
    Mat dst = src.clone();
    GetDlgItem(ID) ->GetClientRect( &rect ); // 获取控件尺寸位置
    if (dst.channels() == 1)
    cvtColor(dst, dst, CV_GRAY2BGR);
    resize(dst,dst,Size(rect.Width(),rect.Height()));
    imshow("src",dst);
    }
    总体感到jie wu 提出的方法,对于解决比较简单的问题,的确是不错的(我记得halcon生成能够被csharp调用的代码的时候,好像采用的就是类似的方法)。但是它本身存在以下问题:
    1、在窗体初始化的时候会有一个黑框弹出来,应该是nameWindow的效果;
    2、在没有图片的时候,会自动将Picturebox的背景绘制成为灰色,而且好像不好控制;
    3、仅仅是imshow还不能完成全部的调用,比如控件的大小可能还会变化,那么就需要用showimage重新进行封装。
    如果加上这些7788的东西,那么最后调用起来,也是比较复杂的。
    但是jie wu的方法有一个天生的优点,就是可以调用high gui的callback机制,这个是非常强的东西,能够省不少麻烦事情。
    这里只是我粗浅的认识,若有不对之处,欢迎批评指正。
    最后说一句,其实看了一些opencv自己的代码,它里面有很多地方就是iplimage和mat相互转换的,很多使用mat接口的函数,只不过是把以前的使用iplimage的函数重新包装了一次。opencv毕竟是一个开源的类库,还有很多地方需要大家一起做得更好。
     
  • 相关阅读:
    toj 2819 Travel
    toj 2807 Number Sort
    zoj 2818 Prairie dogs IV
    zoj 1276 Optimal Array Multiplication Sequence
    toj 2802 Tom's Game
    toj 2798 Farey Sequence
    toj 2815 Searching Problem
    toj 2806 Replace Words
    toj 2794 Bus
    css截取字符
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/5188135.html
Copyright © 2011-2022 走看看