dev-logs

2. MFC를 이용한 viewer 만들기_jpg 불러오기 본문

공부/영상처리

2. MFC를 이용한 viewer 만들기_jpg 불러오기

두룹두두 2017. 12. 15. 18:01




간단한 뷰어 프로그램을 만들어보려 합니다.

UI는 c++ MFC를 사용합니다.
MFC 를 다루는건 이번이 처음인데 윈폼이 그리워집니다.







MFC 응용 프로그램 선택










대화상자 기반 을 선택하고 마침 합니다.










이런 dialog가 만들어집니다.












왼쪽에 리소스 뷰를 보시면 밑줄친폴더 우클릭 후 리소스 추가
Menu를 새로만들기 합니다.












메뉴 창이 따로 만들어지네요. 컨트롤을 입력해주세요!
참고로 이번포스팅은 File Open 까지 구현합니다..ㅎㅎ










File Open 버튼에서 우클릭 - 이벤트 처리기 추가    클릭












위와 같이 선택해주세요. 저는 보기편하게 함수처리기 이름을 위처럼 살짝 변경했습니다 :)
추가 및 편집 을 누르면 코드창으로 이동합니다.












이런 함수가 만들어지고 여기에 이벤트를 구현합니다.
openfiledialog에서 이미지파일을 오픈하게 구현할계획입니다.



우선 이 프로젝트에 opencv가 세팅이 안되어있으므로 세팅을 해줍니다!(이전 포스팅 참조)
프로젝트를 만들때마다 세팅해줘야한다더군요..ㅜ 
혹시 미리 설정해두는 방법 아시는분은 댓글로 알려주시면 감사하겠습니다ㅜ 참 번거로워요..ㅜ


헤더파일에 다음 선언을 먼저 해줍니다.



1
2
3
4
public:
    Mat InpImg, OutImg, TempImg;
    unsigned char** GrayImg;
    unsigned char** U, ** V;
cs




아, 
헤더파일 맨위에


1
2
3
#include "opencv2\opencv.hpp"
 
using namespace cv;
cs



이부분도 빼먹으시면 안됩니다ㅎㅎ






다음은 cpp 파일 이벤트함수 코드입니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CViewerDlg::OnFileOpenBtnClick()
{
    CFileDialog dlg(TRUE);           // true 일때만 dialog가 열린다고 합니다.
    if (dlg.DoModal() == IDOK)
    {
        if (dlg.GetFileExt() != "jpg" && dlg.GetFileExt() != "JPG")
        {
            MessageBox(_T("jpg 파일이 아닙니다."), _T("알림"), MB_OK);
            return;
        }
        InpImg = imread((const char*)dlg.GetPathName());
        imshow("InpImg", InpImg);
        waitKey(0);
    }
 
}
cs








opencv 에서 자주 사용되는 생성자를 정리해봤습니다.

Mat();
            -> default
Mat(int rows, int cols, int type);
            -> rows: 영상의 높이, cols: 영상의 폭, type: 영상의 Data type & channel
Mat(Size size, int type);
            -> size : 영상의 폭과 높이를 저장하는 구조체
Mat(const Mat& m, const Rect& roi);





다음은 주요 필드 멤버

int rows, cols;

uchar* data;
            -> 영상의 실제 값이 저장되어 있는 unsigned char * 형의 객체,
            -> 실제 데이터 접근은 At() Method를 통해 이루어짐.






 Mat 클래스의 주요 멤버메소드 입니다.

void copyTo(OutputArray m) const;
          -> 객체에 저장된 영상정보를 입력 객체에 복사
          -> ex:




1
2
3
Mat InputImage = imread("Test.jpg");
Mat OutputImage;
InputImage.copyTo(OutputImage);
cs





template<typename _Tp> _Tp& at(int i0, int i1)
         -> 객체에 저장된 영상 픽셀 1개의 값을 가져온다
         -> 템플릿 메서드
         -> ex : uchar pixel = InputImage.at<uchar>(100, 100);




Namespace cv 의 주요 메서드들

Mat imread(const String& filename, int flags = IMREAD_COLOR);
             -> 영상파일을 불러들여와 Mat 객체에 저장. jpg, png 포맷지원

bool imwrite(const String& filename, InputArray img, 
  const std::vector<int>& params = std::vector<int>());
             -> 객체에 저장된 영상정보를 filename을 이용해 저장한다.

void imshow(const String& winname, InputArray mat);
              -> Mat 객체를 특정 윈도우에 Display 한다.

int waitKey(int delay = 0);
              -> 지정된 시간만큼 키의 입력을 기다린다. 0을 입력하면 키보드입력이 들어올 때까지 무한대기.









Comments