VS 2013 MFCは直接OpenCV 2を操作する.0/3.0ライブラリ内のMat構造の画像をPicture Control(画像コントロール)に渡す

3152 ワード

上記VS 2013 MFC+OpenCV 3に続く.0画像を開く;
OpenCV 1から0 OpenCV 2に着きました.0はさらに高く、MFCベースの画像処理プログラムを書くときにOpenCVの旧式の文法構造に戻るのは難しい.
このような優雅な方式は、MFCフレームワークの中で、OpenCV 2.0ライブラリのMat形式のピクチャをPicture Control(ピクチャコントロール)表示に直接伝える方法があることを知っていますか?
コード修正セクションに直接アクセスします.
1.必要なヘッダファイルを追加
C**Dlgクラスに対応するヘッダファイル(**Dlg.h)に次のように追加します.
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include "CvvImage.h"

2.OpenCVウィンドウの作成
C**Dlgで.hクラスに対応するソースファイル(**Dlg.cpp)のBOOL CMFC_DEMODlg::OnInitDialog()を追加します.
    cv::namedWindow("view", cv::WINDOW_AUTOSIZE);
    HWND hWnd = (HWND)cvGetWindowHandle("view");
    HWND hParent = ::GetParent(hWnd);
    ::SetParent(hWnd, GetDlgItem(IDC_STATIC)->m_hWnd);
    ::ShowWindow(hParent, SW_HIDE);

3.マウスの左ボタンに応答して、画像を表示する
OnBnClickedOpenImage関数内:
    cv::Mat img = cv::imread("./BaboonRGB.bmp");
    cv::imshow("view", img);

4.一つの問題を修正する
ビューウィンドウハンドルの方法は、設定されたビューウィンドウが対応するIDのPictureControlに表示されているが、表示された画像はダイアログボックスのPictureControlウィンドウサイズに応じて適応的に表示されるのではなく、元のサイズのままである.
したがって、imshow(「view」,img)を呼び出す前に、以下を加えたほうがいい.
    cv::Mat m_dst;
    cv::Mat img = cv::imread("./BaboonRGB.bmp");
    CRect rect;
    GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
    cv::Rect dst(rect.left, rect.top, rect.right, rect.bottom);
    cv::resize(img, m_dst, cv::Size(rect.Width(), rect.Height()));
                                //      #include <opencv2/imgproc/imgproc.hpp>
    cv::imshow("view", m_dst);