제 7 장 동영상 처리.

Slides:



Advertisements
Similar presentations
데이터 완전삭제프로그램 Perfect Delete 사용설명서  주의 이 프로그램을 이용하여 삭제된 데이터는 어떠한 방법으 로도 복구가 불가능합니다. 그러므로 실제 데이터 삭제시 신중을 기하기 바랍니다.
Advertisements

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
Windows XP SP2 문제해결 Windows XP SP2를 설치한 회원께서는 Pop-up차단 기능과 ActiveX 설치의 어려움 발생 아래의 예는 안철수 바이러스 설치 시 문제점을 해결 하는 방법의 설명. 1. ActiveX 컨트롤 설치 ① 주소 표시줄 아래의 '이.
목차 Contents 무선인터넷용 비밀번호 설정방법 Windows 7 Windows 8 Windows XP MAC OS.
4장 영상 입출력 프로그램 만들기 비트맵 파일, MDI를 이용한 입출력 프로그램 (THU)
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷
기초C언어 제1주 실습 강의 소개, C언어 개요, Cygwin/Eclipse 사용 컴퓨터시뮬레이션학과 2016년 봄학기
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 쪽)
컴퓨터프로그래밍 1주차실습자료 Visual Studio 2005 사용법 익히기.
MCMS3000 네트워크 설정방법 [반도 HFCNMS 시스템 Set-up] 반도전자통신
Image & Video processing
제 1 장 영상처리 기초.
제 6 장 영상 워핑과 모핑.
윤 홍 란 다이알로그(대화상자) 윤 홍 란
제 9 장 구조체와 공용체.
공통 컨트롤의 종류와 특징을 개관한다. 각종 공통 컨트롤의 사용 방법을 익힌다..
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제 9 장 영상압축.
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
TETRIS FOR QTOPIA.
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
DSP Lab. Week 3 My image Doug Young Suh Media Lab. Rm401
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
제 5 장 기하학적 처리.
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
BMP(Bit Map).
프로그래밍 랩 – 7주 리스트.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
14장. 포인터와 함수에 대한 이해.
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
C#.
제 3 장 영역 기반 처리.
13. 연산자 오버로딩.
헤더 파싱 ( Header Parsing ).
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
영상처리 실습 인공지능연구실.
WZC 무선 연결 방법 (Windows XP Ver.).
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Video For Windows 멀티미디어 공학 이 정 우.
※ 편리한 사이버 연수원 사용을 위한 인터넷 최적화 안내 ※
빌드 성공.
컴퓨터 계측 및 실습 디지털 출력 영남대학교 기계공학부.
CHAP 21. 전화, SMS, 주소록.
OpenCV 설정 2.21 만든이 딩딩.
영상처리 실습 (OpenCV + MFC) Chonbuk National University A.I. Lab.
가장 많이 사용 Accelerator 최상위 WM_COMMAND, OLE 메시지 관련 이벤트 처리만 가능 이 클래스를 상속받아서 다른 이벤트 처리 이벤트 처리 관련 윈도우(창) 최상위 클래스 멀티 테스킹(모듈) CFrameWnd, Cview,
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
메뉴(Menu) 컴퓨터응용 및 실습 I.
기초C언어 제2주 실습 프로그래밍의 개념, 프로그램 작성 과정 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원
구조체(struct)와 공용체(union)
엔코더 프로그램 설명 // 쓰레드를 사용하기 때문에 변수와 핸들을 전역변수로 지정 HANDLE hDevice;
아두이노 프로그래밍 2일차 – Part4 아날로그 키패드 활용하기 강사: 김영준 목원대학교 겸임교수
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
Power Point 예제 디자인 적용 (서식) - (디자인적용) - (원하는 디자인 선택)
Chapter 11. 문서 인쇄 및 파일 형식.
Presentation transcript:

제 7 장 동영상 처리

학습목표 AVI 파일에 대해 설명할 수 있다 VFW 라이브러리를 활용할 수 있다 동영상과 PC 카메라 영상에 대한 영상처리 프로그램을 작성할 수 있다 2018-11-19 영상처리

AVI 파일 디스플레이 AVI(Audio Video Interface) 스트림(stream) 이라는 단위로 구성 AVI파일은 오디오 스트림, 비디오 스트림, MIDI 스트림, 텍스트 스트림 AVI파일은 하나 이상의 스트림을 포함해야 함 동일한 스트림을 여러 개 포함할 수도 있음 비디오 스트림 대부분 압축되어 있음 Cinepak, Indeo 등 여러 가지 형식 2018-11-19 영상처리

AVI 파일 디스플레이 VFW(Video For Windows) 비디오 처리를 위한 라이브러리 AVI 파일을 읽어서 각 frame을 추출할 수 있는 함수 제공 2018-11-19 영상처리

AVI 파일 디스플레이 LPBITMAPINFOHEADER pbmih; PAVIFILE pavi; PAVISTREAM pstm; PGETFRAME pfrm; AVIFILEINFO fi; AVISTREAMINFO si; int stm; int frame; int x, y; unsigned char *image; AVIFileInit(); AVIFileOpen(&pavi, AVIFileName, OF_READ | OF_SHARE_DENY_NONE,NULL); AVIFileInfo(pavi,&fi,sizeof(AVIFILEINFO)); 2018-11-19 영상처리

AVI 파일 디스플레이 AVIStreamGetFrameClose(pfrm); for (stm = 0;stm < fi.dwStreams; stm++) { AVIFileGetStream(pavi, &pstm, 0, stm); AVIStreamInfo(pstm, &si, sizeof(si)); if (si.fccType == streamtypeVIDEO) { pfrm = AVIStreamGetFrameOpen(pstm,NULL); for (frame = 0; frame < si.dwLength; frame++) { pbmih = (LPBITMAPINFOHEADER) AVIStreamGetFrame(pfrm,frame); if (!pbmih) contunue; image = (unsigned char *) ((LPSTR)pbmih + (WORD)pbmih->biSize); // 프레임의 비트맵 데이터 사용 (일차원 배열 형태로 저장비트맵 // 데이터를 image가 가리킴) } AVIStreamGetFrameClose(pfrm); AVIStreamRelease(pstm); AVIFileRelease(pavi); AVIFileExit(); 2018-11-19 영상처리

실습

AVI 파일 출력 프로그램 메뉴막대에 동영상 처리 메뉴 추가 [동영상 처리] 메뉴에 부메뉴 추가 이름 : 동영상 처리 ID : ID_AVI_VIEW 2018-11-19 영상처리

AVI 파일 출력 프로그램 CImageProView 클래스에 OnAviView() 함수를 추가 void CImageProView::OnAviView() { CFile file; CFileDialog dlg(TRUE); if(dlg.DoModal()==IDOK) { strcpy(AVIFileName, dlg.GetPathName()); viewMode = AVI_FILE; } Invalidate(FALSE); 2018-11-19 영상처리

AVI 파일 출력 프로그램 ImageProView.cpp 파일의 앞부분에 AVI_FILE 상수에 대한 정의를 추가 // 추가한 후 #define TWO_IMAGES 1 #define THREE_IMAGES 2 #define TWO_IMAGES_SCALED 4 #define MORPHING 8 #define AVI_FILE 16 2018-11-19 영상처리

AVI 파일 출력 프로그램 CImageProView 클래스에 AVIFileName 변수를 추가 class CImageProView : public CScrollView { protected: // create from serialization only CImageProView(); DECLARE_DYNCREATE(CImageProView) // Attributes public: CImageProDoc* GetDocument(); int viewMode; char AVIFileName[256]; // 추가된 부분 ... } 2018-11-19 영상처리

AVI 파일 출력 프로그램 OnDraw() 함수를 수정 void CImageProView::OnDraw(CDC* pDC) { CImageProDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (viewMode == AVI_FILE) { loadAVIFile(pDC); return; } if (pDoc->inputImg == NULL) return; ... 2018-11-19 영상처리

AVI 파일 출력 프로그램 loadAVIFile() 함수를 CImageProView 클래스에 추가한다. 반환 형식 : void 매개변수 형식 : CDC * 매개변수 이름 : pDC 2018-11-19 영상처리

AVI 파일 출력 프로그램 loadAVIFile() 함수 편집 void CImageProView::loadAVIFile(CDC * pDC) { LPBITMAPINFOHEADER pbmih; PAVIFILE pavi; PAVISTREAM pstm; PGETFRAME pfrm; AVIFILEINFO fi; AVISTREAMINFO si; int stm; int frame; int x, y; unsigned char *image; 2018-11-19 영상처리

AVI 파일 출력 프로그램 AVIFileInit(); AVIFileOpen(&pavi, AVIFileName, OF_READ | OF_SHARE_DENY_NONE, NULL); AVIFileInfo(pavi,&fi,sizeof(AVIFILEINFO)); for (stm=0;stm < fi.dwStreams;stm++) { AVIFileGetStream(pavi,&pstm,0,stm); AVIStreamInfo(pstm, &si, sizeof(si)); if (si.fccType == streamtypeVIDEO) { pfrm = AVIStreamGetFrameOpen(pstm,NULL); for (frame = 0; frame < si.dwLength; frame++) { pbmih = (LPBITMAPINFOHEADER) AVIStreamGetFrame(pfrm,frame); if (!pbmih) contunue; image = (unsigned char *) ((LPSTR)pbmih + (WORD)pbmih->biSize); 2018-11-19 영상처리

AVI 파일 출력 프로그램 for (y = 0; y < fi.dwHeight; y++) for (x = 0; x < fi.dwWidth; x++) pDC->SetPixel(x, fi.dwHeight-y-1, RGB(image[(y*fi.dwWidth+x)*3+2], image[(y*fi.dwWidth+x)*3+1], image[(y*fi.dwWidth+x)*3])); } AVIStreamGetFrameClose(pfrm); AVIStreamRelease(pstm); AVIFileRelease(pavi); AVIFileExit(); 2018-11-19 영상처리

AVI 파일 출력 프로그램 CImageProView.h 파일 앞부분에 VFW 라이브러리에 대한 헤더 파일에 대한 include 문을 추가 // ImageProView.cpp : implementation of the CImageProView class // #include "stdafx.h" #include "ImagePro.h" #include "ImageProDoc.h" #include "ImageProView.h" #include <vfw.h> // 추가된 부분 2018-11-19 영상처리

AVI 파일 출력 프로그램 VFW 라이브러리를 링크하도록 설정 솔루션 탐색기 뷰를 선택 ImagePro를 선택하고 마우스 오른쪽 버튼을 클릭 팝업메뉴에서 [속성] 메뉴 항목을 선택 2018-11-19 영상처리

AVI 파일 출력 프로그램 속성 창에서 [구성속성]=>[링커]=>[입력] 항목을 선택 [추가 종속성] 입력 상자를 선택하고 vfw32.lib를 입력 2018-11-19 영상처리

AVI 파일 출력 프로그램 프로그램을 컴파일하고 실행 [동영상처리] 메뉴에서 [AVI 파일 출력] 항목선택 2018-11-19 영상처리

비디오 캡쳐 함수 VFW 라이브러리의 비디오 캡쳐 함수 capGetDriverDescription() capCreateCaptureWindow() capDriverConnect() capPreviewRate() capPreview() capSetVideoFormat() capDriverDisconnect() capSetCallbackOnFrame() 2018-11-19 영상처리

비디오 캡쳐 함수 capGetDriverDescription() 함수 BOOL capGetDriverDescription(index, name, name_size, version, version_size); 입력 index : 드라이버 번호 (0 – 9) 출력 name : 캡쳐드라이버의 이름 version : 캡쳐드라이버의 버전 2018-11-19 영상처리

비디오 캡쳐 함수 capCreateCaptureWindow() 함수 HWND capCreateCaptureWindow(name, style, x, y, width, height, hWnd, id); 입력 name : 윈도우의 이름 style : 윈도우의 스타일 (예 : WS_CHILD, WS_VISIBLE) x,y : 캡쳐 윈도우의 좌측 상단의 좌표를 지정 width와 height : 캡쳐 윈도우의 크기 hWnd : 부모 윈도우의 핸들(handle) 값 id : 윈도우의 식별 번호 결과 윈도우가 정상적으로 생성되면 캡쳐 윈도우의 핸들 그렇지 않으면 NULL 값이 반환 2018-11-19 영상처리

비디오 캡쳐 함수 capDriverConnect() capDriverConnect(hWnd, index); 캡쳐 윈도우를 캡쳐 드라이버에 연결 입력 hWnd : 캡쳐 윈도우의 핸들 index : 캡쳐 드라이버의 번호 출력 TRUE : 캡쳐 장치가 정상적으로 작동하여 연결이 성공 FALSE : 실패 2018-11-19 영상처리

비디오 캡쳐 함수 capPreviewRate() capPreviewRate(hWnd, rate); 카메라에서 입력된 비디오를 파일에 저장하는 것이 아니라 화면에 보여줌 입력 hWnd : 캡쳐 윈도우의 핸들 값 rate : 밀리초(ms) 단위의 시간 rate 값을 66으로 설정하면 0.066초마다 새로운 비디오 프레임을 캡쳐해서 디스플레이 1초에 15개의 비디오 프레임이 디스플레이 2018-11-19 영상처리

비디오 캡쳐 함수 capPreview() capPreviewRate(hWnd, flag); 미리 보기 기능을 켜거나 끔 입력 flag : TRUE 또는 FALSE TRUE : 미리 보기 모드를 켬 FALSE : 미리 보기 모드를 끔 2018-11-19 영상처리

비디오 캡쳐 함수 capSetVideoFormat() capSetVideoFormat(hWnd, videoFormat, videoFormat_size); 캡쳐된 비디오 데이터 형식을 설정 입력 hWnd : 캡쳐 윈도우의 핸들 값 videoFormat 설정하고자 하는 비디오 데이터 형식 각 프레임에 대한 비트맵 형식을 BITMAPINFO 구조로 기술 2018-11-19 영상처리

비디오 캡쳐 함수 typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; typedef struct tagBITMAPINFOHEADER { DWORD biSize; // BITMAPINFOHEADER 구조체의 크기 LONG biWidth; // 영상의 가로 크기 LONG biHeight; // 영상의 세로 크기 (양수: 좌측하단, 음수:좌측상단이 원점) WORD biPlanes; // 목표 장치의 플레인 수(1로 설정해야함) WORD biBitCount; // 각 픽셀의 비트수 DWORD biCompression; // 압축 방법(BI_RGB 또는 0: 무압축 비트맵) DWORD biSizeImage; // 비트맵 영상 크기 (바이트단위) LONG biXPelsPerMeter; // 수평 해상도(미터당 픽셀 수) LONG biYPelsPerMeter; // 수직 해상도(미터당 픽셀 수) DWORD biClrUsed; // 사용된 컬러의 수 DWORD biClrImportant; // 비트맵 디스플레이에 사용되는 컬러 수 } BITMAPINFOHEADER; 2018-11-19 영상처리

비디오 캡쳐 함수 BITMAPINFOHEADER 구조체에서 biSize, biWidth, biHeight, biPlanes, biBitCount 값을 설정하고 나머지 값들은 0으로 설정하면 된다. BITMAPINFO bmi; memset( &bmi.bmiHeader, 0, sizeof(bmi.bmiHeader)); // 전체 값을 0으로 설정 bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); bmi.bmiHeader.biWidth = 320; bmi.bmiHeader.biHeight = 240; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 24; 2018-11-19 영상처리

비디오 캡쳐 함수 capDriverDisconnect() capDriverDisconnect(hWnd); capDriverConnect() 함수에 의하여 연결한 캡쳐 윈도우와 캡쳐 장치를 분리 2018-11-19 영상처리

비디오 캡쳐 함수 capSetCallbackOnFrame() BOOL capSetCallbackOnFrame(hWnd, func); 캡쳐 장치로부터 비디오 프레임이 캡쳐되었을 때에 이를 화면에 보여주기 위해서 호출되는 callback 함수를 설정 입력 hWnd : 캡쳐 윈도우의 핸들 값 func : 호출될 함수 이름 2018-11-19 영상처리

실습

카메라 영상 출력 프로그램 [동영상 처리] 메뉴 아래에 카메라 영상 출력을 위한 부메뉴를 추가 이름 : 카메라 영상 출력 ID : ID_CAMERA_VIEW 2018-11-19 영상처리

카메라 영상 출력 프로그램 CImageProView 클래스에 OnCameraView() 함수를 추가 void CImageProView::OnCameraView() { char DeviceName[80]; char DeviceVersion[80]; HWND hWndC = 0; HWND parent = m_hWnd; // 현재의 윈도우의 핸들 for( int wIndex = 0; wIndex < 10; wIndex++ ) { if( capGetDriverDescription( wIndex, DeviceName, sizeof (DeviceName), DeviceVersion, sizeof (DeviceVersion))) hWndC = capCreateCaptureWindow ( "My Own Capture Window", WS_CHILD | WS_VISIBLE , 0, 0, 320, 240, parent, 0); 2018-11-19 영상처리

카메라 영상 출력 프로그램 if( capDriverConnect (hWndC, wIndex)) { BITMAPINFO bmi; capPreviewRate(hWndC, 66); // rate, in milliseconds capPreview(hWndC, TRUE); // 미리 보기 기능을 켬 memset( &bmi.bmiHeader, 0, sizeof(bmi.bmiHeader)); bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biWidth = 320; bmi.bmiHeader.biHeight = 240; bmi.bmiHeader.biPlanes = 1; if (capSetVideoFormat( hWndC, &bmi, sizeof(bmi))) { capSetCallbackOnFrame( hWndC, FrameCallbackProc); viewMode = CAMERA; imageProView_obj = this; return; } else capDriverDisconnect( hWndC ); ::DestroyWindow(hWndC); } } } 2018-11-19 영상처리

카메라 영상 출력 프로그램 ImageProView.cpp 파일의 앞부분에 카메라 영상 출력에 대한 정의를 추가 // 추가한 후 #define TWO_IMAGES 1 #define THREE_IMAGES 2 #define TWO_IMAGES_SCALED 4 #define MORPHING 8 #define AVI_FILE 16 #define CAMERA 32 2018-11-19 영상처리

카메라 영상 출력 프로그램 FrameCallbackProc() 함수를 정의 CImageProView * imageProView_obj; void FrameCallbackProc( HWND hWnd, VIDEOHDR* hdr ) { if(hWnd && hdr && hdr->lpData) if( imageProView_obj ) imageProView_obj->OnFrame((unsigned char *) hdr->lpData); } 2018-11-19 영상처리

카메라 영상 출력 프로그램 CImageProView 클래스에 OnFrame() 함수를 추가 반환 형식: void 매개변수 형식 : unsigned char * 매개변수 이름 : data 2018-11-19 영상처리

카메라 영상 출력 프로그램 OnFrame() 함수를 다음과 같이 편집 void CImageProView::OnFrame(unsigned char *data) { Invalidate(FALSE); } 2018-11-19 영상처리

카메라 영상 출력 프로그램 OnDraw() 함수의 첫 부분을 수정 void CImageProView::OnDraw(CDC* pDC) { CImageProDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (viewMode == AVI_FILE) { loadAVIFile(pDC); return; } else if (viewMode == CAMERA) { ... 2018-11-19 영상처리

카메라 영상 출력 프로그램 프로그램을 컴파일하고 수행 [동영상 처리] 메뉴에서 [카메라 영상 출력] 항목을 선택 2018-11-19 영상처리

동영상에 대한 선명화 연산 [동영상 처리] 메뉴에 선명화 연산에 대한 부메뉴를 추가 이름 : 선명화(카메라) ID : ID_VIDEO_SHARPENING 2018-11-19 영상처리

동영상에 대한 선명화 연산 CImageProView 클래스에 OnVideoSharpening() 함수를 추가 void CImageProView::OnVideoSharpening() { operation = SHARPENING; } 2018-11-19 영상처리

동영상에 대한 선명화 연산 변수 operation을 CImageProView 클래스 정의에 추가 class CImageProView : public CScrollView { protected: // create from serialization only CImageProView(); DECLARE_DYNCREATE(CImageProView) // Attributes public: CImageProDoc* GetDocument(); int viewMode; char AVIFileName[256]; int operation; // 추가된 부분 … } 2018-11-19 영상처리

동영상에 대한 선명화 연산 CImageProView() 함수에서 변수 operation의 값을 초기화 CImageProView::CImageProView() { operation = NO_OP; } 2018-11-19 영상처리

동영상에 대한 선명화 연산 변수 operation에 사용할 상수를 CImageProView.cpp 파일 첫 부분에 정의 #define TWO_IMAGES 1 #define THREE_IMAGES 2 #define TWO_IMAGES_SCALED 4 #define MORPHING 8 #define AVI_FILE 16 #define CAMERA 32 #define NO_OP 0 // 추가된 부분 #define SHARPENING 1 // 추가된 부분 2018-11-19 영상처리

동영상에 대한 선명화 연산 OnFrame() 함수를 다음과 같이 수정 void CImageProView::OnFrame(unsigned char *data) { if (operation == NO_OP) { Invalidate(FALSE); } else if (operation == SHARPENING) CImageProDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int x, y, i; pDoc->imageHeight = 240; pDoc->imageWidth = 320; pDoc->depth = 3; 2018-11-19 영상처리

동영상에 대한 선명화 연산 // 기억장소 할당 pDoc->inputImg = (unsigned char **) malloc(pDoc->imageHeight * sizeof(unsigned char *)); pDoc->resultImg = (unsigned char **) malloc(pDoc->imageHeight * for (i = 0; i < pDoc->imageHeight; i++) { pDoc->inputImg[i] = (unsigned char *) malloc(pDoc->imageWidth * pDoc->depth); pDoc->resultImg[i] = (unsigned char *) malloc(pDoc->imageWidth * } 2018-11-19 영상처리

동영상에 대한 선명화 연산 // 입력 영상 복사 for (y = 0; y < pDoc->imageHeight; y++) for (x = 0; x < pDoc->imageWidth * pDoc->depth; x++) pDoc->inputImg[y][x] = data[y*pDoc->imageWidth*3+x]; // 영상 처리 수행 pDoc->RegionSharpening(); // 결과 영상 복사 data[y*pDoc->imageWidth*3+x] = pDoc->resultImg[y][x]; Invalidate(FALSE); } 2018-11-19 영상처리

동영상에 대한 선명화 연산 [동영상 처리] 메뉴에서 [카메라 영상 출력] 부메뉴를 선택 그 다음에 [선명화(카메라)] 부메뉴를 선택 2018-11-19 영상처리

동영상에 대한 차영상 출력 [동영상 처리] 메뉴에 차영상 출력을 위한 부메뉴를 추가 이름 : 차영상 출력(카메라) ID : ID_VIDEO_SUBTRACT 2018-11-19 영상처리

동영상에 대한 차영상 출력 CImageProView 클래스에 OnVideoSubtract() 함수를 추가 void CImageProView::OnVideoSubtract() { operation = SUBTRACT; } 2018-11-19 영상처리

동영상에 대한 차영상 출력 CImageProView.cpp 파일 첫 부분에 SUBTRACT 상수를 정의 #define TWO_IMAGES 1 #define THREE_IMAGES 2 #define TWO_IMAGES_SCALED 4 #define MORPHING 8 #define AVI_FILE 16 #define CAMERA 32 #define NO_OP 0 #define SHARPENING 1 #define SUBTRACT 2 2018-11-19 영상처리

동영상에 대한 차영상 출력 OnFrame() 함수를 다음과 같이 수정 void CImageProView::OnFrame(unsigned char *data) { if (operation == NO_OP) { Invalidate(FALSE); } else if (operation == SHARPENING) CImageProDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int x, y, i; pDoc->imageHeight = 240; pDoc->imageWidth = 320; pDoc->depth = 3; 2018-11-19 영상처리

동영상에 대한 차영상 출력 // 기억장소 할당 pDoc->inputImg = (unsigned char **) malloc(pDoc->imageHeight * sizeof(unsigned char *)); pDoc->resultImg = (unsigned char **) malloc(pDoc->imageHeight * for (i = 0; i < pDoc->imageHeight; i++) { pDoc->inputImg[i] = (unsigned char *) malloc(pDoc->imageWidth * pDoc->depth); pDoc->resultImg[i] = (unsigned char *) malloc(pDoc->imageWidth * } 2018-11-19 영상처리

동영상에 대한 차영상 출력 // 입력 영상 복사 for (y = 0; y < pDoc->imageHeight; y++) for (x = 0; x < pDoc->imageWidth * pDoc->depth; x++) pDoc->inputImg[y][x] = data[y*pDoc->imageWidth*3+x]; // 영상 처리 수행 pDoc->RegionSharpening(); // 결과 영상 복사 data[y*pDoc->imageWidth*3+x] = pDoc->resultImg[y][x]; Invalidate(FALSE); } 2018-11-19 영상처리

동영상에 대한 차영상 출력 else if (operation == SUBTRACT) { static unsigned char *image1=NULL; static unsigned char *image2=NULL; int i, length = 320 * 240 * 3; if (image1 == NULL) { image1 = (unsigned char *) malloc(length); for (i = 0; i < length; i++) image1[i] = data[i]; } else if (image2 == NULL) { image2 = (unsigned char *) malloc(length); for (i = 0; i < length; i++) image2[i] = data[i]; else { for (i = 0; i < length; i++) image1[i] = image2[i]; 2018-11-19 영상처리

동영상에 대한 차영상 출력 if (image1 && image2) { for (int i = 0; i < 320 * 240; i++) { if (abs((image1[i*3]+image1[i*3+1]+image1[i*3+2]) / 3 - (image2[i*3]+image2[i*3+1]+image2[i*3+2]) / 3) < 20) { data[i*3] = (char ) 0; data[i*3+1] =(char ) 0; data[i*3+2] = (char )0; } else { data[i*3] = (char )255; data[i*3+1] = (char )255; data[i*3+2] = (char )255; Invalidate(FALSE); }} 2018-11-19 영상처리

동영상에 대한 차영상 출력 프로그램을 컴파일하고 실행 카메라 앞에서 움직이면 움직인 부분이 하얀색으로 표시됨 2018-11-19 영상처리