googleAdsense_widever


c++기반 영상처리 프로그램 Programing . Common

c++ 프로그램으로 간단한 커스텀 영상처리를 하고 싶은 나같은 사람이 많을까 싶지만,
정작 이 부분을 하려고 인터넷을 뒤지면 쉽게 나오지 않는다.
영상을 회전하고, binary화 하고, 밝기조절 같은걸 하는 것은 극히 단순한 원리이지만 그걸 하기 위한 베이직 mfc 뼈대를 만드는게 문제

그 과정에 대한 기초적인 내용의 포스팅이다.
참고로 visual studio 2005 를 이용했지만, 내용상으로는 c++ 6.0과 차이가 없다.

New Project > MFC Application
Multiple document, None Database 옵션으로 생성한다.

Class View에서 C~View > OnDraw 에서 코드를 수정한다.
tilde(~) 부분은 프로젝트를 생성할 때 short file name 부분에서 지정한대로 자동으로 붙여지는 부분이다.

C~View::OnDraw 클래스를 다음과 같이 수정한다.



void CImageProccessorView::OnDraw(CDC* pDC)
{
CImageProccessorDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

//배열을 위아래가 반전된 형태로 만든다. 원 영상(m_InImg)의 화면출력
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
m_RevImg[i][j]=pDoc->m_InImg[height-i-1][j];
}
}

SetDIBitsToDevice(pDC->GetSafeHdc(),0,0,width,height,0,0,0,height,m_RevImg,BmInfo,DIB_RGB_COLORS);

// 처리한 결과영상(m_OutImg)의 화면출력을 위한 부분
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
m_RevImg[i][j]=pDoc->m_OutImg[height-i-1][j];
}
}

SetDIBitsToDevice(pDC->GetSafeHdc(),300,0,width,height,0,0,0,height,m_RevImg,BmInfo,DIB_RGB_COLORS);
}


그리고 파일 입출력을 위한 변수를 추가한다.
C~Doc 클래스에서 m_InImg[256][256], m_OutImg[256][256] 을 추가한다.


오른쪽 팝업 > New > Variable
visual studio 2005에서는 위 창에서 직접 배열 선언이 되지 않는다. 배열부분은 제외하고 생성후 선언부분을 수정해주면 된다.

~Doc.h 헤더파일에서 아래 부분이다.

// Generated message map functions
protected:
DECLARE_MESSAGE_MAP()
public:
unsigned char m_InImg[256][256];
unsigned char m_OutImg[256][256];



그리고 파일입출력을 위한 함수를 작성해야 한다.
C~Doc 클래스의 Serialize 함수를 수정하면 된다.

~Doc.cpp 파일


// CImageProccessorDoc serialization

void CImageProccessorDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
ar.Write(m_OutImg,256*256);
}
else
{
// TODO: add loading code here
CFile *infile = ar.GetFile();
if(infile->GetLength()!=256*256)
{
AfxMessageBox("파일 크기가 256x256 사이즈가 아닙니다.");
return;
}
ar.Read(m_InImg, infile->GetLength());
}


역상계산 기능 하나를 추가하는 과정을 설명하고 이 포스트는 마무리한다.


Resource View에서 Menu > IDR_~TYPE 에서 메뉴하나를 추가한다.
나는 지금 기능 몇 개를 넣어 놓은 상황이다.
참고로 [H]와 같은 단축키의 등록은 별다른 작업이 필요없고, Caption을 입력할 때, inverse[&R] 과 같이 써주면 자동으로 R을 단축키로 인식한다.

입력한 메뉴를 오른쪽 클릭 팝업에서 Add Event Handler를 눌러 새 함수를 작성한다.


클래스를 View에 등록시켜준다. 
Add and Edit를 누르고 해당 함수를 찾아간다.
(클래스 뷰에서 C~View 클래스를 눌러보면 새로 추가한 부분을 찾을 수 있다.


아래와 같이 수정한다.

void CImageProccessorView::OnProcessInverse()
{
// TODO: Add your command handler code here
CImageProccessorDoc* pDoc = GetDocument(); //document를 참조하기 위해
ASSERT_VALID(pDoc); //instant address를 가져옴

for(int i=0; i<256; i++){
for(int j=0; j<256; j++){
pDoc->m_OutImg[i][j] = 255 - pDoc->m_InImg[i][j];
}
}
Invalidate(FALSE);
}



위 프로그램은 파일 정보에 대한 헤더가 전혀없는 Raw파일만 인식하고 크기 또한 256px*256px로 제한된다.
jpg, bmp 등을 읽기 위해선 별도의 헤더부분 처리가 필요한데 그건 다음에.


영상처리 책에 뻑하면(그 뻑이 아님) 튀어 나오는 Lena 그림을 역상처리 한 것이다.

실습용 Raw 파일은 http://realheart.egloos.com/2134504
위 링크에서 다운받길 바란다.















덧글

댓글 입력 영역


공지

어서오십시오.
트위터 : @FCliver
기저심리학 : 네이버카페
카카오톡 : FCliver
페이스북 : Fredric Cliver

통계 위젯 (화이트)

08
111
285969

접속자 위치