Visual Studio 설치 후 IE8 에러 해결방법

 이미 Windows XP 설치 후 개인적인 설정에 보면 에러가 발생한다고 했지만 이제서야 그 해결방법을 발견하였다! … 포맷을 몇번이나 했는데 너무 늦게 알아냈잖아 ㅠㅠ

[ 증상 ]

  • Internet Explorer 8의 비정상적인 오류 발생
  • Visual Studio 를 설치하면 “잘못된 메모리 참조”, “예상치 못한 Win32 예외” 등 발생

[ 해결방법]

  • Internet Explorer를 프로그램 추가/삭제에서 삭제 후 재설치

Visual Studio 2008을 설치한 이유 IE8을 실행하면 몇 분 지나지 않아서 “메모리 참조“, “예상치 못 한 에러” 등등의 다양한 이유로 IE8가 종료되는 현상이 반복되었다. 이 현상 때문에 벌써 3번째 포맷 & 인스톨을 반복하였는데 드디어 방법을 찾아냈다. 이는 Visual Studio 와 IE8의 문제가 아닌 “IE8와 한글 2007″의 충돌로 인한 오류였다.

이유는 정확하게 찾아내지는 못 하였지만 IE8을 설치 후 한글 2007을 설치하게 되는 경우 위와 같은 에러가 계속 발생하였다. 이를 해결하기 위해서는 IE8을 프로그램 추가/삭제에서 제거하였다가 다시 설치하면 정상적으로 작동한다.

이렇게 간단한 작업인데 ㅠㅠ 포맷을 3번이나 하다니,
3일을 날려버린 기분이다 ㅠㅠ

OpenCV 1.1pre1 highgui(cvcam)와 MFC를 이용한 카메라 연결

일단 시작하기 전에 이 글은 MFC의 다이얼로그의 Picture Control로 OpenCV를 이용해서 캠 영상을 뿌리기 위한 방법을 알려주는 글입니다.^^v 쉽게 말해서~ 초보용입니다!!

OpenCV의 설치는 했으니 이제 캠과 컴퓨터를 연결해주는 아주 생각만 해도 어렵고 복잡해 보이는 일을 처리해야된다. 하지만 이런 작업들도 OpenCV 라이브러리에 다 들어있다고 하니 cvcam , 이름만 들어도 두근두근 거리게 멋지군!

나도 중간에 안 사실이지만 OpenCV 1.1부터는 cvcam이 사라지고 highgui 속에 포함된다!
다시 말해서 cvcam.lib 는 더이상 없고 함수명도 조금 달라졌다.

1. MFC 프로젝트의 생성

학교에서 지원해주는 Visual Studio 2008(VS는 너무 비싸다, 지원해주는걸 써야지^^;)을 이용해서 간단한 MFC  프로젝트를 생성한다. 그리고 프로젝트 속성에서 추가 라이브러리로

cv.lib cxcore.lib highgui.lib

을 추가한다.

OpenCV 프로젝트 설정 - 라이브러리 추가

2. stdafx.h 파일 수정

#include <cv.h>					// OpenCV 라이브러리
#include <cxcore.h>
#include <highgui.h>

기본적으로 OpenCV를 위한 필요한 헤더 파일을 추가한다.

3. UI의 제작

.rc 파일을 수정하여 자신이 사용할 다이얼로그의 디자인을 구성한다.

간단한 UI 구성

4. MediaGestureDlg.h 헤더파일 수정

	// For using OpenCV Camera
	CWinThread *m_thread;
	bool m_flagThread;
	bool m_cameraState;
 
	CListBox *m_msgLog;
	CWnd *m_pCameraWnd;
 
	// OpenCV 카메라 영상처리 쓰레드
	void OpenCamera(void);
	void OnThreadStart(void);
	void OnThreadStop(void);
	BOOL DestroyWindow(void);

위의 멤버변수 및 함수를 추가하여준다. 위의 변수들은 m_thread 는 OpenCV를 이용해서 실시간으로 캠으로부터 이미지를 캡쳐해내기 위한 변수이고 m_msgLog 는 로그용, m_pCameraWnd는 픽처컨트롤용 핸들이다.

위에 것이 이해가 안된다면 MFC 공부하러 고고씽!!

5. MediaGestureDlg.cpp 파일 수정

BOOL CMediaGestureDlg::OnInitDialog() 속에 기본적으로 핸들값과 기본설정을 한다.

UINT ManageThread(void* pParam)
{
	while(pDlg->m_flagThread)
	{
		pDlg->OpenCamera();
	}
	return 0;	// 쓰레드 내부에서 종료 시키면 더이상 움직이지 않음
}
 
void CMediaGestureDlg::OnThreadStart()
{
	if(!m_flagThread) {
		m_flagThread = true;
		m_thread = AfxBeginThread(ManageThread, this, THREAD_PRIORITY_NORMAL);
		m_thread->m_bAutoDelete = true;
	}
}
 
void CMediaGestureDlg::OnThreadStop()
{
	if(m_flagThread) {
		m_cameraState = false;
	}
}

위의 소스는 쓰레드의 생성과 중지이기 때문에 쓰레드 관련해서 조금만 공부하면 쉽게 이해가 될 것이기 때문에 또 간단하게 넘어가고 제일 중요한 OpenCamera() 함수이다. ManageThread에도 존재하고 있는데 여기서 무한루프를 돌기 때문제 짧고 건조하게 짜주는게 좋지 않을까?

하지만 영상처리! 조금씩 쓰다보면 복잡해진다. 헛소리 그만하고 OpenCamera는 다음과 같이 작성한다.

// OpenCV를 이용해서 카메라 영상 불러오기
void CMediaGestureDlg::OpenCamera(void)
{
	if(m_flagThread) {
		m_cameraState = true;			// 캠 켜짐, 쓰레드 중복 실행 방지
		IplImage *image = 0;			// IplImage 구조체에 그림파일을 저장
		CvvImage cvImage;
		CRect rect;						// 그려진 픽쳐컨트롤의 크기
 
		CvCapture *capture = cvCreateCameraCapture(0); 
		if(capture) {
			AddLog("카메라와의 연결에 성공하였습니다");
			m_pCameraWnd->GetClientRect(&rect);
			while(m_cameraState) {
				cvGrabFrame(capture);
				image = cvRetrieveFrame(capture);
				cvImage.CopyOf(image, 1);
 
				CClientDC dc(m_pCameraWnd);
				cvImage.Show(m_pCameraWnd->GetDC()->GetSafeHdc(), 0, 0, rect.right, rect.bottom);
			}
			cvReleaseCapture(&capture);
			m_cameraState = false;
			AddLog("카메라와의 연결을 해제하였습니다");
		}
		else {
			AddLog("에러: 카메라와의 연결에 실패했습니다");
		}
		m_flagThread = false;
	}
}

위의 소스에서 AddLog()는 개인적으로 필요해서 사용하는 함수이기 때문에 무시해도 된다. 기본적인 내용은 OpenCV의 내용과 동일하기 때문에 따로 설명할 것은 없다.

다음으로 소스의 가장 위쪽에 부모 파라미터 포인터 자식포인터를 위해서 아래와 같이 define문을 선언한다.

#define pDlg ((CMediaGestureDlg*)pParam) // 부모 파라미터 포인터 자식포인터 위해

그리고 마지막으로 다이얼로그가 종료될 때 쓰레드도 함께 종료시킬 수 있도록 DestoryWindow를 재정의한다.

BOOL CMediaGestureDlg::DestroyWindow()
{
	if(m_thread) {
		OnThreadStop();	// 스레드 종료 후 종료
		WaitForSingleObject(m_thread->m_hThread, 1000);
	}
	return CDialog::DestroyWindow();
}

이렇게만 하면 아래처럼 정상적으로 프로그램이 작동하게 된다. 참 쉽죠잉~!

하지만, 이제부터 본격적인 영상처리의 입문인게요!! 푸하하하!!!

OpenCV를 이용한 다이얼로그

그리고 정말 마지막으로 허접한 위의 소스를 다운 받고 싶은 분은 아래의 링크를 눌러주세요!!

Download : MediaGesture

위의 소스는 OpenCV설치하기 에 적힌 것처럼 OpenCV를 사용하기 위한 설정을 마쳤다면 컴파일 하였을 경우 바로 실행될 것이다. 참고로 Visual Studio 2008로 제작하였다.

해커스토익 스타트 Listening 사버렸다! 지독한 4학년 여름방학…

6월 11th, 2009 동근 한 개의 댓글

해커스토익 스타트 Listening

지금까지 약 4번정도 토익 시험을 응시해서 성적을 볼 때 점수를 좌우하던 100점의 폭은 LC의 독단적인 행동인 것을 발견하였다.그래서 LC를 다스리기 위한 특단의 조치를 내리기로 했다. 이제 알바도 하니깐 공부하는데 돈을 아낄 이유가 없다. 필요한 책 있으면 질러버리는거야!

그래서 어쩌튼 LC공부를 해야될 것 같아서 LC책을 이리저리 찾아보다가 유명한 해커스 토익 빨갱이스타트 LC를 두고 고민하다가 280점 받은 사람은 스타트 정독 2번하라고 해서 기초부터 시작하기로 했다.

“아무리 생각해도 난 기초가 부족한 것 같다.”

책 안에 있는 4주 스케쥴 그대로 딱 2번만 돌아보고 LC점수가 350점을 넘지 않는다면 난 답이 없는 거겠지? 정말 정식으로 시작하는 토익 공부니깐 제대로 한번 팍팍 파보자! 이번 여름 방학은 공부로 버닝하는거야!

[방학동안 할 일]

  • 로봇워 예선 프로그램 개발 (6월 20일까지)
  • 국가근로장학생 프로그램 개발 완료 (7월초)
  • 토익 LC/RC 공부 (7월 토익 응시)
  • oPIC 공부 및 응시 (7월 12일)

역시 대학교 4학년 여름방학은 방학이 아닌 것 같다. 학교 다닐 때랑 다름없이 바쁘게 공부하고 돌아다녀야한다. 놀지도 못하겠다. 이번 여름에는 바다에서 수영도 해보고 싶었는데-_-;

그래도 잠깐이라도 시간나면 놀아야겠다. 길게 살지도 못하는 – 살아봤자 80년? – 인생… 공부만 하면서 1년을 보낸다는 것은 너무 슬프다. 잠깐이라도 쉴 때 폭팔적으로 놀아줘야된다!

My Life is Bunning!!!