티스토리 뷰

열감지 image 만들어보기~!

 

오늘은 열감지 이미지를 만들어보겠습니다.

 

제가 임의로 색상 테이블을 만들어

열감지, 온도차 이미지를 출력시키는 예제를 만들어 보았습니다.

 

제가 임의로 색상 테이블을 만들고

부족한 게 많아서 틀릴 수 있으니 참고만 해주시기 바랍니다~.

 

 

[결과 사진]

왼쪽은 열감지하기 전 원본 이미지이고

오른쪽은 열감지 후 이미지를 출력시킨 결과 사진입니다.

 

사진의 밝은 부분은 붉은색으로 처리하고

사진의 어두운 부분은 푸른색으로 처리한 것입니다. 

 

 

 

[코드 설명]

 

 

(원본 이미지 출력)

 

우선 원본 외부 이미지를 출력시키는 방법에 대해 설명드리겠습니다.

이 부분은 앞에서 많이 진행하였기 때문에 간단히 설명드리면서 넘어가겠습니다.

 

우선 코딩을 하기 전에

출력을 원하는 이미지를 하나 다운로드하여 주시고

사진을 해당 프로젝트 폴더 안에 넣어줍니다.

흑백 인물 이미지를 사용하시면 

좋은 결과 이미지를 얻으실 수 있습니다.

 

 

 

헤더 파일에 CImage 변수를 추가해줍니다.

Dlg.h 부분에 추가해주시면됩니다.

private:
    CImage m_image;
cs

 

 

 

다음은 소스 파일에 

Dlg.cpp 부분에 코드를 추가시켜줘야합니다.

아래는 OnInitDialog()에 이미지 load 해주는 소스입니다.

BOOL CMFCexam0120Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
 
    SetIcon(m_hIcon, TRUE);            
    SetIcon(m_hIcon, FALSE);        
 
    m_image.Load(L"test.bmp");
 
 
    return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
cs

 

 

 

OnPaint()에 이미지 draw 해주는 소스입니다.

OnPaint 부분은 OnInitDialog 밑에 있을 것 입니다.

void CMFCexam0120Dlg::OnPaint()
{
    CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
 
    if (IsIconic())
    {
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
 
        // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1/ 2;
        int y = (rect.Height() - cyIcon + 1/ 2;
 
        // 아이콘을 그립니다.
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        m_image.Draw(dc, 00);
        // CDialogEx::OnPaint();
    }
}
cs

CPaintDC dc(this)를 if분 밖으로 빼주었고

else문에 CDialogEx::OnPaint() 부분은 

주석처리해주었습니다.

 

여기까지 이미지를 출력하는 방법에대해 설명드렸습니다.


(온도차 이미지 출력)

 

다음 온도차 이미지를 출력시켜보겠습니다.

 

 

 

새로운 이미지를 출력시키기 위해 CImage 변수 하나를 추가시켜줍니다.

CImage m_two_image;

온도차 이미지를 처장시킬 변수입니다.

private:
    CImage m_image;
    CImage m_two_image;
 

 

 

 

원본 이미지를 로드해줬던 OnInitDialog 부분으로 이동해줍니다.

원본 이미지와 동일한 크기로 m_two_image를 create 해줍니다.

m_image.GetWidth()는 원본 이미지의 가로 픽셀 길이를 가져오는 함수입니다.

m_image.GetHeight()는 원본 이미지의 세로 픽셀 길이를 가져오는 함수입니다.

원본 이미지와 크기가 똑같은 

빈 도화지를 만들어주는 과정이라고 할 수 있습니다.

 

m_two_image.Create(m_image.GetWidth(), m_image.GetHeight(), m_image.GetBPP(), 0);

BOOL CMFCexam0120Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
 
    SetIcon(m_hIcon, TRUE);           
    SetIcon(m_hIcon, FALSE);        
 
    m_image.Load(L"test.bmp");
    m_two_image.Create(m_image.GetWidth(), m_image.GetHeight(), m_image.GetBPP(), 0);
 
    return TRUE;  
}
cs

 

 

 

 

저는 버튼이 눌리면 

온도차 이미지가 출력되게 만들었기 때문에

버튼을 하나 추가시켜줍니다.

리소스 뷰에서 Dialog로 이동해줍니다.

Dialog 편집하는 곳으로 이동했으면

도구상자에서 버튼 하나를 추가시켜줍니다.

 

그리고 버튼이 눌리면 사용자가 원하는 이벤트가 발생하게 만들어주기 위해선

만들어준 버튼을 더블클릭해줍니다.

그럽 소스파일에 아래처럼 함수가 하나 생기게 됩니다.

 

버튼을 눌렀을 때 발생되는 이벤트를 처리해주는 함수입니다.

이 함수에 아래 코드를 추가시켜 줍니다.

void CMFCexam0120Dlg::OnBnClickedButton1()
{
 
    CClientDC dc(this);
 
    COLORREF temp_color;
 
    int gray;
    int x, y, i;
 
    for (y = 0; y < m_image.GetHeight(); y++) {
        for (x = 0; x < m_image.GetWidth(); x++) {
 
            temp_color = m_image.GetPixel(x, y);
            gray = (GetRValue(temp_color) + GetGValue(temp_color) + GetBValue(temp_color)) / 3;
 
            if (195 < gray && gray <= 255) {
                m_two_image.SetPixel(x, y, RGB(255, (gray - 255* (-4), 0));
            }
            else if (135 < gray && gray <= 195) {
                m_two_image.SetPixel(x, y, RGB((gray - 135* 42550));
            }
            else if (75 < gray && gray <= 135) {
                m_two_image.SetPixel(x, y, RGB(0255, (gray - 135* (-4)));
            }
            else if (15 < gray && gray <= 75) {
                m_two_image.SetPixel(x, y, RGB(0, (gray - 15* 4255));
            }
        }
    }
    m_two_image.Draw(dc, 3000);
 
}
cs

2중 for 문을 통해 (x, y) 좌표 전체를 돌면서

해당 픽셀의 RGB 값을 더해 3으로 나눠 gray 값을 구해줍니다.

temp_color에 해당 좌표에 픽셀값의 색상을 잠시 저장한 후

그 픽셀값의 R,G,B 값을 더해 3으로 나누어준 것을 gray에 저장해주었습니다.

GetRValue함수는 해당 픽셀에서 R 값의 색상만 가져올 수 있는 함수입니다.

 

그리고 gray 값이 클수록 밝은색을 나타내고 작을수록 어두운색을 나타냅니다.

gray 값이 큰 순서대로 빨 주 노 초 파 색상을 매칭시켜줍니다.

 

해당 조건문을 보면 숫자가 복잡하게 되어있습니다.

그 이유는 빨간색은 RGB 값이 (255,0,0)입니다.

빨간색에서 노란색으로 갈 땐 G 값이 0~255까지 증가해 (255,255,0)이 됩니다.

다음으로 노란색에서 초록색으로 갈 땐 R 값이 255~0까지 감소해 (0,255,0)이 됩니다.

마지막으로 초록색에서 파란색으로 갈 땐 G 값이 255~0까지 감소하고

B값이 0~255까지 증가해 (0,0,255)이 됩니다.

 

이와 같이 빨간색에서 파란색까지 가는데 색상 테이블 증감이 복잡하기 때문에

조건문을 임의대로 만들어보았습니다.

 

 

 

 

 

이상 MFC를 사용해 온도차 이미지를 출력시키는 예제를 만들어보았습니다~:)