반응형
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에 넣어 준다.
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, NULL, NULL, 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(), 0, 0, tempImage.cols, tempImage.rows, 0, 0, tempImage.cols, tempImage.rows, tempImage.data, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY); mfcImg->BitBlt(::GetDC(m_pic.m_hWnd), 0, 0); 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 |
---|