1장. 디지털 영상처리의 개념(2) 임은경 2주차 - 디지털영상처리의개념
차례 및 목적 차례 영상처리의 개념 영상처리의 응용분야 영상처리의 전망 영상처리에 대한 이야기 영상 데이터에 대한 이해 2주차 - 디지털영상처리의개념
차례 및 목적 차례 오픈소스 CxImage로 영상다루기 CxImage 제공 함수 목록 영상처리 프로그래밍 패턴 영상 읽기 영상 보기 영상 저장 CxImage 기반 영상 처리 프로그램 작성 – 지터 효과(jitter effect) CxImage 기반 visualGS 라이브러리 작성과 지터 효과 프로그램 작성 수행시간 측정하기 CxImage 제공 함수 목록 2주차 - 디지털영상처리의개념
CxImage로 영상다루기 영상 포맷 RAW JPEG BMP PNG GIF 다양한 포맷이 나온 이유? 영상의 대용량 처리 압축 기술에 차이 압축 기술은 영상의 특성을 잘 반영하여 표현 2주차 - 디지털영상처리의개념
CxImage로 영상다루기 영상 포맷의 차이 BMP, RAW 비교 HEAD HEAD 없음 영상 데이터 영상 데이터 BMP, JPG, GIF, 등의 헤드가 있는 파일들 RAW 파일(헤드가 없음) * 헤드 내에는 영상의 크기, 컬러의 수, 팔레트 등의 다양한 정보가 들어 있음 * RAW 파일은 헤드 정보가 없으며 파일을 읽기 위해서는 영상의 크기를 미리 알고 있어야 함. 2주차 - 디지털영상처리의개념
CxImage로 영상다루기 BMP, GIF, JPEG 헤더 정보 비교 그림 1.22를 통해서 헤더 정보의 내용 차이를 알수 있음 2주차 - 디지털영상처리의개념
CxImage 라이브러리 만들기 CxImage 의 최신 버전과 최근 버전을 다운로드 압축 풀기 라이브러리 생성하기 http://www.xdp.it 강의 홈페이지를 통해서 다운 가능 CxImage599c_full.zip 다운로드 받기 압축 풀기 영상처리 프로젝트를 개발할 폴더와 같은 위치에 압축 풀기 d:\dip\cximage599c_full\ 라이브러리 생성하기 압축 푼 폴더 내에 CxImageLib.dsw를 마우스로 더블클릭하여 실행 2주차 - 디지털영상처리의개념
CxImage 라이브러리 만들기 Workspace 창의 [File View]탭을 클릭하기 CxImage file ~ demoDll File 까지 정적 링크 라이브러리를 생성하기 위해 빌드함 생성되는 정적 링크 라이브러리 CxImage.Lib CxImageCrtDll.Lib cximaged.dll Demod.exe Demoddll.exe Demod.exe 실행하기 2주차 - 디지털영상처리의개념
프로그램 뼈대 만들기 프로그램 뼈대 만들기 비주얼 c++ 실행하기 메뉴 File – New 를 선택 프로젝트 생성 창에 프로젝트 탭을 선택하고, MFC AppWizard(exe) 를 선택 프로젝트 폴더 : d:\dip\ 확인버튼 클릭하여 다음단계로 넘어감 프로젝트 생성 6단계 창에서… Base class를 CScrallView로 선택하고 마침 버튼 클릭 프로젝트 생성 후, 실행하기 2주차 - 디지털영상처리의개념
프로그램 뼈대 만들기 윈도우 프로그램 작성 Visual C++에서는 윈도우 프로그램 작성을 도와주는 마법사를 제공 몇 가지 선택 사항을 입력하면 자동으로 기본적인 윈도우 프로그램이 생성됨 생성된 윈도우 프로그램을 확장하여 개별적인 응용 프로그램을 작성할 수 있도록 해주는 기능이 제공됨 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 Visual C++ 프로그램 실행한 다음 [File] 메뉴에서 [New] 항목 선택 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 2. [Projects] 탭을 선택한 다음 “MFC AppWizard(exe)”를 선택. Project name 상자에 프로그램 이름 “Hello”를입력. Location 상자에서 폴터 위치 지정 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 3. 1단계 부터 6단계 까지의 선택 사양 설정을 해야 하는데, 여기에서는 기본 설정을 사용해도 되므로 1단계에서 바로 [Finish] 버튼 선택해도 상관없다. 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 옵션에 따른 프로그램 타입의 종류 Single Document Multiple Document Dialog based 타입 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 4. 2단계 – database 기능을 추가할 것인지 아닌지를 설정하는 단계를 나타냄 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 5. 3단계 – OLE와 관련된 선택 사항들을 설정하는 단계 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 6. 4단계 – 툴바, 상태바, 프린트기능 등을 부여할 것인지 여부를 설정하는 단계 6. 4단계 – 툴바, 상태바, 프린트기능 등을 부여할 것인지 여부를 설정하는 단계 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 앞의 대화상자에서 [Advanced…]를 클릭하면, 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 옵션 설명 File Extension 앞의 대화상자에 존재하는 옵션과 설명… 옵션 설명 File Extension 실행파일의 메뉴에서 읽어들일 영상파일의 확장자를 지정해줌. 이 프로젝트에서 읽을 파일은 RAW파일이므로 확장자 “raw”를 적어줌 File type ID 시스템 레지스트리에 등록될 문서 타입 ID Main frame caption 프로그램 타이틀 바에 나타날 이름 설정 Doc type name 새로운 Doc 템플릿 추가시 사용하는 Doc 타입 이름 지정 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 7. 5단계 – 실행될 프로그램의 스타일과 설명문(주석문)을 자동으로 삽입할 것인지 여부, MFC 라이브러리를 어떤 방식으로 사용할 것인지 여부 등을 설정함 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 8. 6단계 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 8. 마지막 단계 – 생성될 프로젝트의 정보를 나타냄 4주차 - MFC를 이용한 영상처리 프로그래밍
애플리케이션 마법사를 이용한 MFC 프로젝트의 작성 9. 생성된 프로젝트의 모습 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 10. 실행결과 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 탭의 전환에 따른 workspace 정보들 탭에 대한 설명 탭 선택 설명 클래스 정보 리소스 정보 프로젝트에 포함된 클래스들의 종류와 멤버변수, 함수등의 정보를 보여줌 리소스 정보 프로젝트에 사용될 메뉴, 버튼, 아이콘 등의 작성과 관리 파일 정보 프로젝트에 포함된 파일이름과 헤드 파일들을 보여주고 관리함 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 MFC프로그램의 구성요소 세가지 MFC 프로그래밍 메인프레임 윈도우 문서객체 뷰객체 윈도우 내부의 오픈된 창 부분을 제외한 나머지 부분을 가리킴 메뉴, 툴바, 상태바 등의 프로그램을 뼈대를 가짐 문서객체 데이터의 저장, 변환, 처리, 삭제 등을 담당하는 객체 눈에 보이지 않음 뷰객체 문서객체의 데이터를 화면(열린창)에 출력하는 역할을 담당하는 객체 MFC 프로그래밍 데이터의 처리와 데이터의 출력을 분리된 두개의 다른 클래스에서 담당 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 View 클래스의 OnDraw() 함수 데이터를 화면에 출력하는 기능을 담당하는 함수 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 객체들간의 메시지 통신 세가지 객체들은 서로 통신되어야 함 HOW? 객체들 사이에서 데이터나 함수의 상호참조를 위해 유용한 함수를 제공함 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 Document 클래스(CtestDoc)에 마우스를 두고 오른쪽 버튼을 누르면 메뉴가 나타남 이 메뉴상에서 <Add Member Variable…>을 선택 클래스에 새로운 멤버변수를 추가하고자 할 경우에 사용함 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 입력대화상자가 나타나고, 각 변수 타입과 변수이름, 접근 방법을 물어본다. 다음과 같이 설정하라. 변수명 접근방법 unsigned char m_InImg[256][256] Public m_OutImg[256][256] 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 다음과 같이 나타남 4주차 - MFC를 이용한 영상처리 프로그래밍
프로그램 뼈대 만들기 프로그램 타입 Single Document Multiple Document SDI 하나의 프로그램에 하나의 창만 존재하는 구조 Internet Explorer는 대표적인 SDI 구조 Multiple Document MDI PaintShop과 같이 프로그램 내에 여러 개의 창이나 문서를 열 수 있는 구조 많은 응용 프로그램들이 이 구조를 사용함 Dialog based 타입의 Document 메시지 박스나 이와 같은 구조를 사용하는 프로그램 4주차 - MFC를 이용한 영상처리 프로그래밍
CxImage 라이브러리 연동하기 헤더 파일 복사하기 FirstCxImage 프로젝트의 폴더 공간에 include 폴더를 만듬 Cximage599c_full/CxImage의 모든 헤더파일(*.h)를 앞의 include 폴더로 복사하기 2주차 - 디지털영상처리의개념
CxImage 라이브러리 연동하기 헤더 파일 디렉토리를 프로젝트 설정에 포함하기 2주차 - 디지털영상처리의개념
CxImage 라이브러리 연동하기 StdAfx.h에 CxImage의 헤더 파일인 xImage.h 추가하기 2주차 - 디지털영상처리의개념
CxImage 라이브러리 연동하기 CxImage 정적 링크 라이브러리 연동하기 윈도우 검색 메뉴를 이용하여, Cximage599c_full 폴더에서 제공된 *.lib 를 찾아보자 여러 개의 파일 중 영상 포맷 관련 라이브러리를 복사하자 파일들… J2k.lib , Jasper.lib , Jbig.lib , Jpeg.lib , Png.lib , Tiff.lib , Zlib.lib 자신이 생성한 프로젝트 FirstCxImage 폴더 안에 lib 폴더를 만들고 그 안에 복사하여 붙여 넣자. 2주차 - 디지털영상처리의개념
CxImage 라이브러리 연동하기 CxImage 정적 링크 라이브러리 복사하기 Cximage599c_full 폴더 내에 있는 CxImage 폴더 내에 있는 debug 폴더 내에 Cximage.lib 를 복사하기 FirstCxImage 폴더 내에 debug 폴더 안에 복사한 CxImage.lib 를 붙여넣기 2주차 - 디지털영상처리의개념
CxImage 라이브러리 연동하기 CxImage 정적 링크 파이브러리명과 영상 포맷 관련 라이브러리 명을 프로젝트에 설정하기 Object/library modules 밑의 입력 창에 다음을 입력 Debug/cximage.lib ./lib/png.lib ./lib/Jpeg.lib ./lib/zlib.lib ./lib/Tiff.lib ./lib/j2k.lib ./lib/jbig.lib ./lib/jasper.lib 2주차 - 디지털영상처리의개념
CxImage 라이브러리 연동하기 FirstCxImage 재빌드 시키고 실행하기 2주차 - 디지털영상처리의개념
영상 읽기 MFC 구현 영상을 읽고 저장할때 필요한 변수를 관리하는 곳…? 읽은 영상 데이터를 우리 눈에 보여주는 곳…? 수행은…? 읽은 영상 데이터를 우리 눈에 보여주는 곳…? View와 Document 클래스 Document 클래스 데이터의 저장, 변환, 처리를 위한 역할 View 클래스 도큐먼트 클래스의 데이터를 화면에 출력하는 역할 2주차 - 디지털영상처리의개념
영상 읽기 도큐먼트 클래스에 멤버 변수 추가 CFirstCxImageDoc 선택 후, 오른쪽 마우스 버튼을 누르면 팝업 메뉴가 나타남 Add Member Variable…을 선택 입력 대화창에 변수 이름과 데이터형을 입력한다. 데이터형 : CxImage* 변수 이름 : m_pImage 확인버튼 클릭하면, workspace창이나 소스의 헤더 파일에 추가됨. 추가된 m_Image를 초기화하기 FirstCxImageDoc.cpp의 생성자 파일 CFirstCxImageDoc()에서 초기화하기 m_pImage = NULL; 2주차 - 디지털영상처리의개념
영상 읽기 영상 파일을 읽어 오는 함수 재정의 읽거나 저장하는 방법 Serialize 멤버 변수를 사용하는 것 MFC 클래스 내 데이터를 직접 읽거나 저장하는 가장 손쉬운 방식 OnOpenDocument 함수를 재정의(overriding)하는 것 가상 함수를 추가 영상 데이터의 파일 포맷별 고유 특징 때문에 OnOpenDocument(), OnSaveDocument()함수를 재정의한 후, 파일명을 넘겨 받아 처리하는 루틴 추가 OnOpenDocument() 함수를 추가 CFirstCxImageDoc.cpp 문서에 팝업 메뉴에서 [Add Virtual Funtion]을 선택하기 OnOpenDocument를 선택하고 OnNewDocument를 선택하여 [Add & Edit] 버튼을 클릭 2주차 - 디지털영상처리의개념
영상 읽기 함수 내에 다음을 추가하기 m_pImage = new CxImage; m_pImage->Load(lpszPathName, 0); 앞에서 메모리 할당 받음… 삭제해주는 Virtual 함수도 추가해야 함.. 2주차 - 디지털영상처리의개념
영상 읽기 DeleteDocuments 함수 추가 CFirstCxImageDoc.cpp 문서에 팝업 메뉴에서 [Add Virtual Funtion]을 선택하기 DeleteDocuments를 선택하고 OnNewDocument를 선택하여 [Add & Edit] 버튼을 클릭 함수 내에 다음을 추가하기 if(m_pImage ) delete m_pImage; 2주차 - 디지털영상처리의개념
영상 읽기 파일 열기 함수 OnFileOpen() 재정의 프레임 윈도우(frame window) 클래스 메뉴, 툴바, 상태바 등 프로그램을 구성하는 부분을 담당하는 클래스 CFirstCxImageApp 클래스를 의미함 메뉴에 프로그램 추가하기 Workspace 창의 Resource View의 메뉴 중 IDC_MAINFRAME을 선택하기 [파일]-[열기]를 선택하고 오른쪽 마우스를 클릭 메뉴 중 [class wizard]를 선택 다음과 같이 셋팅하기 2주차 - 디지털영상처리의개념
영상 읽기 Add Function을 클릭하면 [OK]버튼 클릭하면 member functions에 함수가 추가됨 Edit Code를 클릭하면 소스 작성 창으로 접근 2주차 - 디지털영상처리의개념
영상 읽기 다음과 같이 작성하기 char szFilter[] = "지원 영상 파일(*.bmp, *.jpg, *.gif, *png, *.tif)|*.bmp;*.jpg;*.gif;*.png;*.tif||"; 2주차 - 디지털영상처리의개념
영상 읽기 영상 보기 도큐먼트 클래스에서 넘어온 입력 파일에서 읽어 들인 영상 데이터는 m_pImage에 저장됨 이를 보여주기 위해 뷰 클래스 사용함 OnDraw 멤버 함수를 호출하여 프로그램 작성하기 OnDraw () 화면에 결과를 출력하는 Cview 클래스의 대부분 역할을 담당하는 멤버 함수 영상 출력하기 뷰클래스(CFirstCxImageView) 내의 OnDraw()함수 선택 소스 다음과 같이 코딩하기 2주차 - 디지털영상처리의개념
영상 읽기 실행해보기 2주차 - 디지털영상처리의개념
영상 읽기 2주차 - 디지털영상처리의개념
영상 읽기 영상 크기에 맞추어 스크롤 지원하기 Oninitialupdate()멤버 함수를 클릭하여 다음과 같이 코딩하기 2주차 - 디지털영상처리의개념
영상 읽기 다음과 같이 수정하시오. 2주차 - 디지털영상처리의개념
영상 읽기 실행결과 2주차 - 디지털영상처리의개념
영상 읽기 처음 실행 시 나타나는 창 제거하기 Workspace 창의 class View 탭에서 … 메인 프로임 윈도우 클래스인 CFirstCxImageApp의 InitInstance() 함수를 확인하기 다음과 같이 수정하기 2주차 - 디지털영상처리의개념
영상 읽기 그 외의 다른 방법 실행해보기 if (!ProcessShellCommand(cmdInfo)) return FALSE; 위의 내용을 주석 처리해서 실행하지 못하도록 막으면 새로운 창이 나타나지 않음. 실행해보기 2주차 - 디지털영상처리의개념
영상 읽기 드래그 앤 드롭으로 영상 파일 열기 프로그램에 영상 파일을 끌어다 놓으면 이를 감지하고 파일을 열어주기 Instance() 함수에 다음을 추가하자. 2주차 - 디지털영상처리의개념
영상 읽기 영상의 크기에 맞춰 보여주기 창의 크기와 영상의 원래 크기가 일치하지 않으므로 이를 수정하기 영상의 크기에 맞춰 창이 보여지게끔 해보자. [Class View]탭에서 CChildFrame 클래스를 선택하기 마우스 오른쪽 버튼을 눌러 팝업 메뉴 중 [Add Virtual Function]을 선택하기 가상 함수 ActiveFrame 멤버 함수를 선택, [Add & Edit] 버튼 클릭 ActiveFrame 멤버 함수 자식 프레임 클래스(child frame class)의 형태를 정의하는 것 메인 프레임 클래스는 부모 프레임 클래스를 지칭함 2주차 - 디지털영상처리의개념
영상 읽기 다음과 같이 소스 수정 및 추가하기 2주차 - 디지털영상처리의개념
영상 읽기 앞의 클래스 내의 헤더파일 추가하기 #include "FirstCxImageDoc.h" 2주차 - 디지털영상처리의개념
영상 저장 영상 저장을 위해 OnSaveDocument() 함수를 재정의 하고, 파일명을 넘겨받아 처리하는 루틴을 추가하기 도큐먼트 클래스의 소스인 CFirstCxImageDoc 에 추가하기 오른쪽 마우스 버튼 클릭 후, [Add Virtual Function] 선택하기 2주차 - 디지털영상처리의개념
영상 저장 가상 함수 중 OnSaveDocument()를 선택 하후, [Add & Edit]버튼을 클릭하고 소스 작성하기 2주차 - 디지털영상처리의개념
영상 저장 사실상, CxImage에서는 총 15개의 포맷을 지원 ximage.h 의 포맷 내용을 보면… enum ENUM_CXIMAGE_FORMATS{ CXIMAGE_FORMAT_UNKNOWN, CXIMAGE_FORMAT_BMP, CXIMAGE_FORMAT_GIF, CXIMAGE_FORMAT_JPG, CXIMAGE_FORMAT_PNG, CXIMAGE_FORMAT_MNG, CXIMAGE_FORMAT_ICO, CXIMAGE_FORMAT_TIF, CXIMAGE_FORMAT_TGA, CXIMAGE_FORMAT_PCX, CXIMAGE_FORMAT_WBMP, 2주차 - 디지털영상처리의개념
영상 저장 물론, 소스를 변경시키면 다른 포맷 역시도 지원 가능함 CXIMAGE_FORMAT_WMF, CXIMAGE_FORMAT_J2K, CXIMAGE_FORMAT_JBG, CXIMAGE_FORMAT_JP2, CXIMAGE_FORMAT_JPC, CXIMAGE_FORMAT_PGX, CXIMAGE_FORMAT_PNM, CXIMAGE_FORMAT_RAS, }; 물론, 소스를 변경시키면 다른 포맷 역시도 지원 가능함 2주차 - 디지털영상처리의개념
영상 저장 클래스의 역할 MFC AppWizard를 이용하여 FirstCxImage 프로젝트를 생성하면 여섯 개의 클래스가 생성됨 C FirstCxImageDoc 클래스 여기에서 Doc는 문서(Document)를 의미함 데이터의 저장이나 변환 등과 같이 실질적인 데이터 처리를 담당 C FirstCxImageView 클래스 CImageProDoc 클래스에서 처리된 데이터를 출력 장치를 통하여 보여주는 역할 수행 CMainFrame 클래스 프로그램 전체 윈도우에 대한 관리 담당 2주차 - 디지털영상처리의개념
영상 저장 CChildFrame 클래스 CAboutDlg 클래스 C FirstCxImageApp 클래스 프로그램 윈도우 안에 생성되는 여러 개의 서브윈도우에 대한 관리 담당 CAboutDlg 클래스 프로그램의 [도움말] 메뉴의 “FirstCxImage 정보“라는 항목을 선택하면 나타나는 대화상자에 대한 관리 담당 C FirstCxImageApp 클래스 FirstCxImage 프로그램 전체에 대한 관리를 담당 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 지터 효과(jitter effect) 이미지의 각 픽셀에서 각 랜덤 값을 추가함 지터 효과를 제공하는 라이브러리 함수의 특징 Bool CxImage::Jitter(long radius = 2)[inherited] Parameter Radius – maximum pixel displacement Returns True if everthing is ok 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 Jitter() 소스 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 프로그램에 메뉴 추가하여 지터 메뉴 삽입 [Resource View]탭에서 메뉴 IDC_FIRSTCTYPE을 선택 도움말 뒤에 메뉴 추가하기 도움말 뒤에 마우스 커서를 가져다 놓고 오른쪽 마우스 클릭하면 메뉴 중 [Properties]를 선택 메뉴 1장 아래로 또 다시 메뉴를 추가하기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 지터 함수 호출 메뉴를 선택할때 jitter()함수를 호출하여 실행할 곳이 필요함. 메뉴의 jitter – cximage를 선택하면 jitter()함수가 호출되도록 설정하기 연결할 메뉴를 선택 오른쪽 마우스버튼 클릭하면 메뉴 중 [ClassWizard]를 선택하기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 다음과 같이 설정하고, [Add Function]버튼을 클릭하기 [Add Member Function]창이 뜨면…[ok]버튼 클릭 Member functions에 앞의 함수 이름이 추가됨 Edit Code버튼을 눌러 소스 작성을 위해 포커스 이동 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 다음과 같이 JITTER함수를 호출할 소스 입력하기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 실행하기 Jitter 실행 결과 보기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 클립보드 복사, 붙여넣기 원 영상에 jitter() 함수의 결과가 덮여쓰여짐 클립보드 복사와 붙여 넣기를 통해 원 영상을 미리 복사하기 새로운 창에 같은 원 영상을 붙여 넣기 클립보드 특정 프로그램의 데이터를 다른 프로그램으로 데이터를 넘겨줄 수 있도록 해주는 기능 데이터의 포맷을 제대로 지원한다면 어디서나 사용 가능 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 클립보드 복사하기 [Class View] 탭을 선택하고, CFirstCxImageDoc를 선택하여 새로운 함수 CopyClipBoard()를 추가하기 추가된 CopyClipBoard()에 다음의 코드 삽입하기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 앞의 소스를 통해서 클립보드 복사 영역의 소스를 구현했지만 이를 연결해야 함. 메뉴 중 [편집 복사]에 연결하기 메뉴 [편집 복사]를 선택한 후, 오른쪽 마우스 버튼 클릭하면 나타나는 메뉴 중 [ClassWizard]를 선택 클래스 위저드를 다음과 같이 설정하고, [Add Function]버튼을 클릭한다. Add member function 창에 함수이름을 설정하고 [ok]버튼을 클릭하면, 클래스 위저드 창의 Member function에 추가되고 Edit Code 버튼 클릭 후, 소스를 작성하자. 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 소스는 다음과 같이 작성 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 클립보드 붙이기 [편집]-[붙여넣기] 메뉴를 통해서 소스를 작성하자. 여기서는 도큐먼트 클래스가 아니라 프레임 윈도우를 이용함 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 다음과 같이 코드 작업하기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 소스(1) void CFirstCxImageApp::OnEditPaste() { // TODO: Add your command handler code here POSITION pos = GetFirstDocTemplatePosition(); CDocTemplate *pTemplate = GetNextDocTemplate(pos); CFirstCxImageDoc *pDoc = (CFirstCxImageDoc* )pTemplate->OpenDocumentFile(NULL); if( pDoc ){ HANDLE hBitmap=NULL; if (::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd())) hBitmap = ::GetClipboardData(CF_DIB); if( hBitmap ) pDoc->m_pImage = new CxImage(); pDoc->m_pImage->CreateFromHANDLE(hBitmap); 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 소스(2) POSITION pos = pDoc->GetFirstViewPosition(); CFirstCxImageView *pView = (CFirstCxImageView *)pDoc->GetNextView(pos); CSize sizeTotal = CSize(pDoc->m_pImage->GetWidth(), pDoc->m_pImage->GetHeight()); pView->SetScrollSizes(MM_TEXT, sizeTotal); pView->ResizeParentToFit(FALSE); } ::CloseClipboard(); 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 hBitmap = ::GetClipboardData(CF_DIB)에서 CF_DIB 데이터가 존재해야 함. OnEditPaste() 함수 전에 호출되는 OnUpdateEditPaster()함수를 이용해서 CF_DIF를 활성화시킴 [Add Function] 클릭 [Edit Code] 버튼 클릭 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 다음과 같이 소스 작성하기 2주차 - 디지털영상처리의개념
예제로 지터 효과 주기 실행하기 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 앞의 방법 직접 구현해보자. 공개된 라이브러리를 통해서 작성한 방식 파일 읽기, 저장, 보기 함수만을 이용하고 실제 다른 영상 처리 기법들은 우리가 구현해보도록 하자. 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 직접 구현하기 위한 작업 다양한 영상 처리를 지원해줄 클래스를 만들자. 새로운 클래스 생성하기 클래스의 옵션을 다음과 같이 설정하기 클래스 타입 Generic Class Name Cfilter 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 Filter.h 헤더파일 작성하기 [File View] 탭에 접근하여 코드 추가하기 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 Filter.cpp 작성하기 소스 내에 #include "math.h“를 추가하기 그리고 기본 소스는 다음과 같이 추가함 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 소스(1) void CFilter::GS_Jitter( CxImage *m_pImage, long radius ){ RGBQUAD color; int i, j; int rnd_height, rnd_width; int height = m_pImage->GetHeight(); int width = m_pImage->GetWidth(); for(i=0; i<height; i++) { for(j=0; j<width; j++) { rnd_height = i+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2)); rnd_width = j+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2)); 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 소스(2) if( rnd_height > height || rnd_width > width ) { rnd_height = height; rnd_width = width; } color = m_pImage->GetPixelColor(rnd_width, rnd_height); m_pImage->SetPixelColor(j, i, color); return; 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 작성한 지터 효과를 메뉴에 연결하기 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 메뉴에서 클래스 위저드로 접근하여 다음과 같이 설정함 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 다음과 같이 연결하기 위한 코드 작성하기 먼저, 헤더 파일 추가하기 Filter 클래스의 내용을 끌어다 사용하므로 헤더파일에 추가해야 함 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 실제 지터함수를 연결하는 코드 작성하기 2주차 - 디지털영상처리의개념
직접 구현한 지터 효과주기 실행하기 2주차 - 디지털영상처리의개념
수행 시간 측정하기 수행 시간 측정 메모리를 많이 차지하는 영상 처리 시간이 관건 다양한 알고리즘 중 성능을 평가하기 위한 의도로 수행 시간을 측정함 각 영상 처리의 수행 시간을 Debug 결과를 통해서 알려주려 함 수행 시간을 보는 방법 TRACE 매크로를 이용하는 방법 디버그 모드가 아니라 릴리즈 모드에서 볼 수 있음 Debug View를 통해서 확인하는 방법 사용할 방법 가벼운 디버깅 모니터링 도구인 Debug View를 이용하여 수행 시간 확인 2주차 - 디지털영상처리의개념