(E2E_L2)GOMfcTemplate在vs2017上的運行並融合Dnn模塊


GOMfcTemplate一直運行在VS2012上運行的,而且開發出來了多個產品。在技術不斷髮展的過程當中,出現了一些新的矛盾:
一、因爲須要使用DNN模塊,而這個模塊到了4.0以上的OpenCV才支持的比較完善,因此須要修改OpenCV版本;
二、4.0以上的OpenCV須要使用c++11,因此VS2012沒法使用,故直接跳過VS201三、VS2015,直接使用2017;
三、4.0以上的OpenCV不支持老版本的CV,因此CVVImage中不少東西沒法使用。
c++

爲了解決系列問題,進行研究。而且將研究結果記錄下來:

1、解決模塊衝突問題
一、在將GOMfcTemplate改爲64位的過程當中,一個常見的問題爲頭文件支持錯誤,好比「 出現error C2146: 語法錯誤: 缺乏「;」(在標識符「PVOID64」的前面) 」或者「 出現error C2061 : 語法錯誤: 標識符「LPDIRECT3D2」等之類的 通過修改後的頭文件應該是這樣的:

應該可以解決絕大多問題;

2、升級過程當中的版本問題

在設置的時候,注意
以及

3、版本統一,所有使用PreBuild版本


可是在使用過程當中,可能會報這樣的錯誤
須要添加設置
在Lib的附加依賴項
而且添加這兩個.lib

4、代碼融合問題
爲了獲得這樣的結果,在幾個地方須要作出修改:


在OnInitDialog中

在主要處理的線程中

將代碼繼續維護,豐富「採用算法」按鈕。

5、丟掉CVVImage

CVVImage中須要CV庫的引入,但在新版本的代碼中,cv.h都找不到了。爲了完全地解決這個問題,直接從新了showimage函數,將CVVImage中有用的部分引入進來。
獲得的結果可以使用,可是可能存在一些因爲不是很完備而形成的問題,特別是輸入函數的圖像必定要是cv_8u RGB的,可能還會存在其餘問題,須要在使用過程當中特別注意:

void CGOMfcTemplate2Dlg::showImage(Mat srcUINT ID)
{
    if (src.empty())
        return;
    CRect rect;
    GetDlgItem(ID) ->GetClientRect( &rect );    // 在哪裏進行顯示?
    CDCpDC = GetDlgItemID ) ->GetDC();   
    HDC hDC = pDC ->GetSafeHdc();                // 獲取顯示控件(位置)的 HDC(設備句柄)
    
    BITMAPINFO bmi = { 0 };                     //生成bitmap
    bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
    bmi.bmiHeader.biCompression = BI_RGB;
    bmi.bmiHeader.biWidth = src.cols;
    bmi.bmiHeader.biHeight = src.rows * -1;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 24;
    m_bitmapBits = new RGBTRIPLE[src.cols * src.rows];
    Mat cv_bitmapBits(Size(src.colssrc.rows), CV_8UC3m_bitmapBits);
    src.copyTo(cv_bitmapBits);                      //拷貝到內存中
    
    if (rect.Width() > src.cols)
    {
        SetStretchBltMode(
            hDC,           // handle to device context
            HALFTONE);
    }
    else
    {
        SetStretchBltMode(
            hDC// handle to device context
            COLORONCOLOR);
    }
    ::StretchDIBits(hDC, 0, 0, rect.Width(), rect.Height(), 0, 0, src.cols,src.rowsm_bitmapBits,&bmiDIB_RGB_COLORSSRCCOPY);//顯示在街面上
    ReleaseDCpDC );
}

這裏使用的是對話框模式,若是在Model/View模式中使用,能夠結合Paint/Draw等,將模式更好地使用。

目前在64位、PreBuild下都是能夠運行的,Dshow也沒有問題,應該說是獲得了比較好的結果。




附件列表

相關文章
相關標籤/搜索