본문 바로가기
연구중/MFC

[MFC]OPENCV연동-1. VIEW MAT image

by 루티즈 2017. 8. 2.
반응형

MFC에서 간단하게 Opencv Mat이미지를 Picture Control에 띄워 주는 예제 





- 새로 영상 관련 mfc project 하나 만들일이 있어서 프로젝트 만드는 김에 중간 중간 캡처떠서 블로그에 올려봅니다.

- 아마.... 진짜 처음 하시는 분은 이거보고 못 따라 하실 것 같고 그냥 리마인드용으로 보시면 됨.




1. Visual Studio에서 MFC Application Project를 생성한다.

   (간단하게 Dialog based Application을 생성하였다.)










2. Dialog창에서 Picture Control을 적당히 삽입한다.








3. Picture Control 을 Control할 예정이므로 ID를 원하는 걸로 바꿔준다.

그리고 NOTIFY 옵션을 TRUE로 바꿔준다.








4. Project 환경을 64 bit로 맞춰둔다.

   ( Opencv library 64bit version 을 사용할 예정 만일 32bit를 사용한다면 바꿔줄 필요 없음)







5. Opencv_3.1.0.props를 Propery manager에 넣어 준다.






opencv props 내용은 다음과 같다.

include directories 
/opencv설치된경로에서include/include
lib directories 
/opencv설치된경로/lib
Additional Dependencies
opencv_world310d (debug), opencv_world310 (release)


//include, library directories



//Additinal dependencies



- 이 예제에서는 opencv관련 dll파일들은 이미 1. 환경변수로 경로 지정되어 바로 연동 되거나 혹은 2. project 내 또는 3. system폴더에 이미 들어 있다고 가정한다.
- opencv나 특정 library설치하는 방법이 익숙치 않다면 다른 설치 예제 참고.






6. 실제 Opencv를 사용하는 파일에 Opencv를 include 시킨다.

( Mat 파일을 단순 picture control에 띄워주는 예제로 projectDlg.h(헤더)에 include )










7. Button 을 하나 생성하고 Onclick 이벤트를 추가한다.














8. Picture control에 변수를 추가해준다.

PICTURE CONTROL의 NOTIRY 옵션이 TRUE여야 변수를 추가할 수 있다.











9. Picture control에 image를 보여주기 위한 과정


picture control에 이미지를 보여주기위해서는 이미지를 static으로 변형하는 과정을 거쳐야 한다.

따라서 imread를 이용하여 불러드린 MAT 파일을 Cimage로 변형시킨 후 Cstatic 으로 변환하여 picture control에 뿌린다.

cv::Mat ->  CImage ->  CStatic


//생성한 button의 onclick
- fileDialog를 이용하여 불러드릴 이미지를 직접 선택하도록.


1
2
3
4
5
6
7
8
9
10
11
void CforBLOGviewImagesDlg::OnBnClickedShowimage()
{
    char szFilter[] = "Image (*.BMP, *.GIF, *.JPG, *.PNG) | *.BMP;*.GIF;*.JPG;*.PNG;*.bmp;*.gif;*.jpg;*.png | All Files(*.*)|*.*||";
    CFileDialog dlg(TRUE, NULLNULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, AfxGetMainWnd());
    if (dlg.DoModal() == IDOK)
    {
        CString cstrImgPath = dlg.GetPathName();
        Mat src = imread(string(cstrImgPath));
        DisplayImage(src);
    }
}
cs



//displayImage


- 불러드린 Mat 파일을 8bit 3채널 비트맵으로 변형 후


Cimage로 변형 시키고 static 으로 뿌려준다.


m_pic 은 당연히 picture control의 handling 변수.


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
void CforBLOGviewImagesDlg::DisplayImage(cv::Mat& _targetMat)
{
    CDC* pDC;
    CImage* mfcImg = nullptr;
 
    pDC = m_pic.GetDC();
 
    cv::Mat tempImage;
    cv::resize(_targetMat, tempImage, Size(_targetMat.cols * 3, _targetMat.rows * 3));
 
    BITMAPINFO bitmapInfo;
    bitmapInfo.bmiHeader.biYPelsPerMeter = 0;
    bitmapInfo.bmiHeader.biBitCount = 24;
    bitmapInfo.bmiHeader.biWidth = tempImage.cols;
    bitmapInfo.bmiHeader.biHeight = tempImage.rows;
    bitmapInfo.bmiHeader.biPlanes = 1;
    bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bitmapInfo.bmiHeader.biCompression = BI_RGB;
    bitmapInfo.bmiHeader.biClrImportant = 0;
    bitmapInfo.bmiHeader.biClrUsed = 0;
    bitmapInfo.bmiHeader.biSizeImage = 0;
    bitmapInfo.bmiHeader.biXPelsPerMeter = 0;
 
    if (_targetMat.channels() == 3)
    {
        //tempImage = _targetMat.clone();
        mfcImg = new CImage();
        mfcImg->Create(tempImage.cols, tempImage.rows, 24);
    }
 
    else if (_targetMat.channels() == 1)
    {
        cvtColor(tempImage, tempImage, CV_GRAY2RGB);
        mfcImg = new CImage();
        mfcImg->Create(tempImage.cols, tempImage.rows, 24);
    }
    else if (_targetMat.channels() == 4)
    {
        //tempImage = _targetMat.clone();
        bitmapInfo.bmiHeader.biBitCount = 32;
        mfcImg = new CImage();
        mfcImg->Create(tempImage.cols, tempImage.rows, 32);
    }
 
    cv::flip(tempImage, tempImage, 0);
 
    ::StretchDIBits(mfcImg->GetDC(), 00, tempImage.cols, tempImage.rows,
        00, tempImage.cols, tempImage.rows, tempImage.data, &bitmapInfo,
        DIB_RGB_COLORS, SRCCOPY);
 
    mfcImg->BitBlt(::GetDC(m_pic.m_hWnd), 00);
 
    if (mfcImg)
    {
        mfcImg->ReleaseDC();
        delete mfcImg; mfcImg = nullptr;
    }
    tempImage.release();
    ReleaseDC(pDC);
}
cs






8. 최종 결과










//filedialog 실행 중(image 파일 선택)








//Picture Control 에 image가 보임 (  이미지 크기가 기준보다 커서 짤려나온다. 크기는 조정하면 됨)





별거 아닌데 blog에 올리려니깐 생각보다 시간 더럽게 많이 걸리네 ;;


반응형

'연구중 > MFC' 카테고리의 다른 글

[MFC]OPENCV연동-2.Camera 영상 재생  (0) 2017.08.03