증강현실을 MFC로 이식 성공증강현실을 MFC로 이식 성공

Posted at 2010.02.23 01:14 | Posted in Project/증강현실을 이용한 사천성

무한 삽질 끝에 AR을 우리 소스에 이식하는데 성공하였다.
하지만 불안사항이 있다.

일시 정지 버튼을 누르면 불규칙적인 확률로 다운되는 현상이 있고,
AR을 합치고나서부터 게임 시작을 했다가, 창을 닫고 다시 시작을 누르면 검은 화면이 나온다.

랭킹 구현도 다 했고...

이제 OpenGL을 사용해서 Picking하는 작업이 남았는데
제일 만만찮은 작업이 될것 같다.


ARToolKit 관련 소스들도 클래스화 시켜야 되고...

그런데 ARToolKit 정말 너무 까다롭다-_-

다시는 증강현실에 발을 들여놓기가 싫다.
설정하다가 진땀 다 뺄듯
저작자 표시 비영리 변경 금지
신고
  1. 김범식
    저도 지금 ARToolkit을 MFC에 붙이는 작업을 하는데요. OpenGL 자체를 잘 몰라서인지.. 막막하네요.
    혹시 괜찮은 link나 어떤 부분들에 대해 작업하셨는지 공유해주실 수 있을까요 ㅠ.ㅠ
    • 2010.03.12 18:59 신고 [Edit/Del]
      김범식 님의 CPP수준이 어느정도인지는 잘 모릅니다만,
      클래스의 개념을 확실히 알고 계시고
      ARToolKit함수의 용도를 알고 계신다면
      금방 구현 가능하실꺼라 생각합니다.

      http://www.cyworld.com/cooc2003/2955949
      여기서 함수들의 기능에 대해서 공부해보세요^^

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

MFC Dialog 에서 Enter 와 ESC Key 종료 방지MFC Dialog 에서 Enter 와 ESC Key 종료 방지

Posted at 2010.02.20 14:54 | Posted in About Programing/03. Tip
BOOL PlayGameForm::PreTranslateMessage(MSG* pMsg)
{
	if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
	{
		return TRUE;
	}

	return CDialog::PreTranslateMessage(pMsg);
}
저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

경과 시간 계산 및 일정시간이상 일정 범위 안의 좌표에 있으면 클릭경과 시간 계산 및 일정시간이상 일정 범위 안의 좌표에 있으면 클릭

Posted at 2010.02.20 02:52 | Posted in Project/증강현실을 이용한 사천성


경과 시간 계산은 크게 어렵지 않았다.

void PlayGameForm::OnBnClickedButtonStart()
{
	this->tStartTime = CTime::GetCurrentTime();	// 현재 시간을 얻어온다.
	SetTimer(TIMER, 1000, NULL);				// 1초마다 호출한다.
	this->cameraManager->Create(ComparePoint, this->cameraManager);
	this->cameraManager->threadState = true;
}

void PlayGameForm::OnTimer(UINT_PTR nIDEvent)
{
	if (nIDEvent == CAMERA)
	{
		this->cameraManager->GetCamera().cvQueryFrame_ipl_OriginalImage();
		this->cameraManager->FindRedColor ();
	}

	if (nIDEvent == TIMER)
	{
		this->Timer();
	}

	CDialog::OnTimer(nIDEvent);
}

void PlayGameForm::Timer ()
{
	this->tCurrentTime = CTime::GetCurrentTime();						// 현재 시간을 얻어온다.
	this->tViewTime = this->tCurrentTime - this->tStartTime;			// 차를 구한다.

	this->cHours.Format("%d : ", this->tViewTime.GetHours());			// 시간 추출
	this->cMinutes.Format("%d : ", this->tViewTime.GetMinutes());		// 분 추출
	this->cSeconds.Format("%d", this->tViewTime.GetSeconds());			// 초 추출

	this->cViewTime = this->cHours + this->cMinutes + this->cSeconds;	// 추출한 시, 분, 초 합치기

	this->m_timer.SetWindowTextA((LPCTSTR)(this->cViewTime));			// 출력
}

문제는 화면에서 붉은색이 일정 시간 멈춰 있을때 이벤트를 발생 시키는 것인데,
Thread를 사용해서 이진화된 영상 자체에 접근했다가
동기화 문제로 고생고생 하다가
결국은 이진화 할때마다 사진으로 저장하고, 그 사진 파일을 이용해서
비교하는 방법을 선택하였다.

DWORD ComparePoint(LPVOID param)
{
	CameraManager *cameraManager = (CameraManager*) param;
	int i = 0;
	int j = 0;
	int counter = 0;
	CString directory, fileName;
	IplImage *ipl_gray_Image;
	IplImage *temp_ipl_gray_Image;

	directory.Format("Image\\");
	fileName.Format("grayImage.jpg");

	while (TRUE)
	{
		ipl_gray_Image = cvLoadImage(directory+fileName, CV_LOAD_IMAGE_UNCHANGED);

		if (ipl_gray_Image != NULL)
		{
			// Before Point중심 구하기 Start
			cameraManager->beforePoint = cvPoint (0, 0);
			counter = 0;

			for (i = 0 ; i < ipl_gray_Image->height ; i++)
			{
				for (j = 0 ; j < ipl_gray_Image->widthStep ; j++)
				{
					if ((ipl_gray_Image->imageData[i * ipl_gray_Image->widthStep + j]) != 0)
					{
						cameraManager->beforePoint.x += j;
						cameraManager->beforePoint.y += i;
						counter++;
					}
				}
			}	

			if (counter != 0)
			{
				cameraManager->beforePoint.x = cameraManager->beforePoint.x / counter;
				cameraManager->beforePoint.y = cameraManager->beforePoint.y / counter;
			}
			// Before Point중심 구하기 End

			temp_ipl_gray_Image = cvLoadImage(directory+fileName, CV_LOAD_IMAGE_UNCHANGED);

			if (temp_ipl_gray_Image != NULL)
			{
				// After Point중심 구하기 Start
				cameraManager->afterPoint = cvPoint (0, 0);
				counter = 0;

				for (i = 0 ; i < temp_ipl_gray_Image->height ; i++)
				{
					for (j = 0 ; j < temp_ipl_gray_Image->widthStep ; j++)
					{
						if ((temp_ipl_gray_Image->imageData[i * temp_ipl_gray_Image->widthStep + j]) != 0)
						{
							cameraManager->afterPoint.x += j;
							cameraManager->afterPoint.y += i;
							counter++;
						}
					}
				}

				if (counter != 0)
				{
					cameraManager->afterPoint.x = cameraManager->afterPoint.x / counter;
					cameraManager->afterPoint.y = cameraManager->afterPoint.y / counter;
				}
				// After Point중심 구하기 End

				// Befor Point와 After Point 차이 구하기 Start
				cameraManager->comparePoint = cvPoint(0, 0);
				counter = 0;

				cameraManager->comparePoint.x = abs(cameraManager->afterPoint.x - cameraManager->beforePoint.x);
				cameraManager->comparePoint.y = abs(cameraManager->afterPoint.y - cameraManager->beforePoint.y);
				// Befor Point와 After Point 차이 구하기 End

				// 비교해서 Event 발생
				if (cameraManager->comparePoint.x < CLICK_X || cameraManager->comparePoint.y < CLICK_Y)
				{
					if (cameraManager->frameCounter > FRAMECOUNTER)
					{
						AfxMessageBox("클릭");
						cameraManager->frameCounter = 0;
					}
				}
				else
				{
					cameraManager->frameCounter = 0;				
				}
			}

			cvReleaseImage( &(ipl_gray_Image) );
			cvReleaseImage( &(temp_ipl_gray_Image) );
		}
	}

	cameraManager->threadState = false;

	return FALSE;
}

저작자 표시 비영리 변경 금지
신고
  1. 이준재
    안녕하세요. 숙신님.
    저는 현재 대학교에서 재학중인 컴퓨터공학과 학생입니다.
    다름이 아니라 현재 제가 간단한 웹브라우저를 MFC로 만들고 있습니다.
    여기서 구현하려고 하는게 현재 시간과 브라우저를 시작하고 난뒤
    경과시간 2가지를 상태바에다가 구현하려고 하는데요.
    지금 현재시간은 구현을 하였는데요.
    경과시간은 아직 구현을 못하였습니다.
    죄송하지만 어떻게 해야될지 조금 알려주시면 안되겠습니까?

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

MFC에서 Client 중복 실행 방지하는 방법MFC에서 Client 중복 실행 방지하는 방법

Posted at 2010.02.19 15:52 | Posted in About Programing/03. Tip

BOOL CARPuzzleApp::InitInstance()
{
	CheckOverlapRun ();

	return FALSE;
}

void CARPuzzleApp::CheckOverlapRun ()
{
	CWnd* pWnd = NULL;
	pWnd = CWnd::FindWindow(NULL, _T("사천성 ver 0.5 - Title"));

	if(pWnd) // 중복 실행이 되었을 경우
	{
		// 중복 실행 중인 프로그램 화면에 표시
		pWnd->ShowWindow(SW_SHOW);
		pWnd->SetForegroundWindow();
	}
	else
	{
		// 레지스트리 등록
		::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wc);
		wc.lpszClassName = "사천성 ver 0.5 - Title";
		AfxRegisterClass(&wc);

		INITCOMMONCONTROLSEX InitCtrls;
		InitCtrls.dwSize = sizeof(InitCtrls);
		InitCtrls.dwICC = ICC_WIN95_CLASSES;
		InitCommonControlsEx(&InitCtrls);

		CWinAppEx::InitInstance();

		AfxEnableControlContainer();

		SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));

		CARPuzzleDlg dlg;
		m_pMainWnd = &dlg;
		INT_PTR nResponse = dlg.DoModal();

		if (nResponse == IDOK)
		{

		}
		else if (nResponse == IDCANCEL)
		{

		}
	}
}
int CARPuzzleApp::ExitInstance()
{
	// 레지스터리 해제
	UnregisterClass("사천성 ver 0.5 - Title", wc.hInstance);

	return CWinAppEx::ExitInstance();
}
저작자 표시 비영리 변경 금지
신고
  1. 크리티컬 섹션을 이용해서도 구현할 수도 있지 않을까?
    내가 MFC는 잘모르겠지만 위의 코드를 보면 타이틀바의 이름을 갖고 CWnd객체를 얻어 오는 것 같은데,
    혹시 너네 프로그램 말고 다른 프로그램이 이름이 사천성 ver 0.5 - Title 면 어떻하지?
    그리고 너네 프로그램이 사천성 ver 0.5 - Title에서 다른 것으로 바뀌면?

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

영상 속도가 느린 이유영상 속도가 느린 이유

Posted at 2010.02.18 23:59 | Posted in Project/증강현실을 이용한 사천성

이틀동안 영상 속도가 느려서 고민했는데, 정말 뜻밖의 곳에서 해결책을 찾았다.

필터링을 하면서 많이 느려졌고,
Thread 보다는 OnTimer로 호출하는게 더 빨랐다.

그리고 이진화 할때 YCbCr값 중에서 Y값은 설정을 안했는데,
같이 설정해주니까 (당연히) 색깔 검출이 잘 되었다.



지금 화면이 팽창->침식->팽창 연산만 하고
라벨링 이라던지 열림 연산이라던지 다 뺐다.

어차피 마커가 인쇄된 흰 종이를 수직으로 비추면서 시연할테니까,
이런 필터링들이 없어도 깨끗하게 잘 추출하더라.

이제 좌표값 얻어와서 포인트 잡아주는 일 남았구나.

void CameraManager::AddEffect ()
{
	IplConvKernel *element = cvCreateStructuringElementEx(2, 2, 1, 1, CV_SHAPE_ELLIPSE, NULL);

	cvDilate(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(), element, 1); // 팽창 (배경을 축소시키고 객체의 크기를 확장)
	cvErode(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(), element, 2); // 침식 (배경을 확장시키고 객체의 크기를 축소)
	cvDilate(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(), element, 1); // 팽창

	cvCvtColor(this->camera.Get_ipl_bin_Image(), this->camera.Get_RGB_Image(), CV_YCrCb2BGR); // YCrCb -> RGB
	cvCvtColor(this->camera.Get_RGB_Image(), this->camera.Get_ipl_gray_Image(), CV_RGB2GRAY); // RGB -> Gray
	
	// 이진화
	cvThreshold(this->camera.Get_ipl_gray_Image(), this->camera.Get_ipl_gray_Image(),
		THRESHOLD, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
}
저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

영상처리를 이용한 붉은색 검출영상처리를 이용한 붉은색 검출

Posted at 2010.02.17 23:29 | Posted in Project/증강현실을 이용한 사천성


우선 붉은 색 검출에 성공을 하긴 했는데
속도가 느리다.
한눈에 '느리다' 라는 느낌이 든다.

OnPaint 함수를 사용해서 OpenCV관련 처리들을 해주는데,
OnPaint함수 특성상 계~속 호출이 되기 때문에 발생하는 현상같다.

이제 코드를 모두 Thread화 시키는 작업을 하고, 색 추적 구현을 해야겠다.

void CameraManager::FindRedColor (CDC** pDC_YCbCr, CStatic *yCbCrCam)
{
	CRect	rect;
	int x, y;

	this->camera.Create_ipl_YCbCr_Image();
	this->camera.Create_ipl_bin_Image();
	this->camera.Create_RGB_Image();
	this->camera.Create_Y_Image();
	this->camera.Create_Cb_Image();
	this->camera.Create_Cr_Image();
	this->camera.Create_ipl_gray_Image();

	*pDC_YCbCr = yCbCrCam->GetDC();
	yCbCrCam->GetClientRect(&rect);
	x = rect.top;
	y = rect.left;
	rect.SetRect(x, y, x + CAM_WIDTH, y + CAM_HEIGHT);
	
	//RGB -> YCbCr로 변환
	cvCvtColor(this->camera.Get_ipl_OriginalImage(), this->camera.Get_ipl_YCbCr_Image(), CV_RGB2YCrCb);

	//YCbCr 3개의 채널을 각 각 채널로 분리
	cvCvtPixToPlane(this->camera.Get_ipl_YCbCr_Image(), this->camera.Get_Y_Image(),
		this->camera.Get_Cr_Image(), this->camera.Get_Cb_Image(), 0);

	ChangeRedColor ();
	AddEffect ();

	// 이진화 Image View
	this->camera.Get_cvv_bin_Image().CopyOf ( this->camera.Get_ipl_gray_Image() );
	this->camera.Get_cvv_bin_Image().DrawToHDC( (*pDC_YCbCr)->m_hDC, rect );

	//이미지 해제
	this->camera.Release_ipl_YCbCr_Image();
	this->camera.Release_Y_Image();
	this->camera.Release_Cb_Image();
	this->camera.Release_Cr_Image();
	this->camera.Release_RGB_Image();
	this->camera.Release_ipl_gray_Image();
	this->camera.Release_ipl_bin_Image();
}

void CameraManager::ChangeRedColor ()
{
	unsigned char temp_Y = 0;
	unsigned char temp_Cb = 0;
	unsigned char temp_Cr = 0;

	for(int i = 0 ; i < (this->camera.Get_ipl_YCbCr_Image())->height ; i++)
	{
		for(int j = 0 ; j < this->camera.Get_ipl_YCbCr_Image()->width ; j++)
		{
			temp_Cr = this->camera.Get_Cr_Image()->imageData[i * this->camera.Get_Cr_Image()->widthStep + j];
			temp_Cb = this->camera.Get_Cb_Image()->imageData[i * this->camera.Get_Cb_Image()->widthStep + j];

			// 붉은색이 있으면 흰색,아니면 검은색으로
			if( (MIN_RED_CR < temp_Cr) && (temp_Cr < MAX_RED_CR) )
			{
				if( (MIN_RED_CB < temp_Cb) && (temp_Cb < MAX_RED_CB) )
				{
					//검출 영역이면 흰색
					this->camera.Get_ipl_bin_Image()->
						imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 0] = WHITE;
					this->camera.Get_ipl_bin_Image()->
						imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 1] = WHITE;
					this->camera.Get_ipl_bin_Image()->
						imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 2] = WHITE;
				}
				else
				{
					//검출 영역이 아니면 0
					this->camera.Get_ipl_bin_Image()->
						imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 0] = BLACK;
					this->camera.Get_ipl_bin_Image()->
						imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 1] = BLACK;
					this->camera.Get_ipl_bin_Image()->
						imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 2] = BLACK;
				}
			}
			else
			{
				//검출 영역이 아니면 0
				this->camera.Get_ipl_bin_Image()->
					imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 0] = BLACK;
				this->camera.Get_ipl_bin_Image()->
					imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 1] = BLACK;
				this->camera.Get_ipl_bin_Image()->
					imageData[i * this->camera.Get_ipl_bin_Image()->widthStep + j * 3 + 2] = BLACK;
			}
		}
	}
}

void CameraManager::AddEffect ()
{
	// 구조화 요소 Create
	IplConvKernel *element = cvCreateStructuringElementEx(2, 2, 1, 1, CV_SHAPE_ELLIPSE, NULL);

	// 닫힘 연산
	cvDilate(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(), element, 1); // 팽창 (배경을 축소시키고 객체의 크기를 확장)
	cvErode(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(), element, 2); // 침식 (배경을 확장시키고 객체의 크기를 축소)
	cvDilate(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(), element, 1); // 팽창

	cvMorphologyEx(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(),
		this->camera.Get_ipl_YCbCr_Image(), element, CV_MOP_OPEN, 5);
	cvSmooth(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(), CV_MEDIAN, 3, 1);
	cvSmooth(this->camera.Get_ipl_bin_Image(), this->camera.Get_ipl_bin_Image(), CV_GAUSSIAN, 3, 1);

	cvCvtColor(this->camera.Get_ipl_bin_Image(), this->camera.Get_RGB_Image(), CV_YCrCb2BGR); // YCrCb -> RGB
	cvCvtColor(this->camera.Get_RGB_Image(), this->camera.Get_ipl_gray_Image(), CV_RGB2GRAY); // RGB -> Gray
	
	// 이진화
	cvThreshold(this->camera.Get_ipl_gray_Image(), this->camera.Get_ipl_gray_Image(),
		THRESHOLD, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

	cvReleaseStructuringElement(&element); // 구조화 요소 Release
}
저작자 표시 비영리 변경 금지
신고
  1. KimJaebo
    이거 MFC기반으로 만드신건가요??? 혹시 가능하시다면 제 메일로 풀소스좀 주실수 있으신지요??
    부탁드립니다.
    chimera01@naver.com
    • 2010.05.11 19:16 신고 [Edit/Del]
      MFC로 만든 소스 맞습니다.
      저 부분은 제가 구현한거지만,
      3인 프로젝트라서 풀소스를 보내드리기엔
      무리가 있네요. 죄송합니다^^
  2. 비밀댓글입니다
    • 2010.12.21 23:24 신고 [Edit/Del]
      CameraManager에는 증강현실 관련 처리가 없습니다^^
      그리고 증강현실과 Picking부분은 팀원이 한거라서 답변을 드릴수가없네요^^ 제가 한 부분은, 전체적인 UI와 Class diagram 설계, 색추적 입니다^^
  3. 삽질백만년
    소스 중간쯤에 빨간색 검출하는 부분에서 MIN_RED_CR, MAX_RED_CR , MIN_RED_CB , MAX_RED_CB 값이 어떻게 되죠??
    그리고 어떻게 구하셨는지,, 지금 저는 파란색 검출하려고하는데 Cr, Cb 값을 몰라서 삽질중,, ㅜㅜ
  4. 행인
    왜 영상을 YCrCB로 변환하고 RGB로 변환하는지에 대해서 알려주실 수 있나요???
    • 2012.06.03 16:10 신고 [Edit/Del]
      보다 정확한 색 검출을 위해 YCbCr로 변환시키고,
      색 검출 로직이 끝나면
      화면에 출력해주기 위해 RGB로 다시 변환시켜 주는겁니다.

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

RGB->YCbCr->이진화RGB->YCbCr->이진화

Posted at 2010.02.15 21:23 | Posted in Project/증강현실을 이용한 사천성

우선 설 전날, PlayGameForm에 OpenCV 변수들을 다 때려 박아 넣었던 걸레같은 소스를 수정했다.
다시 차근차근 Class화를 시도한 결과, 성공ㅋ
그렇게 삽질할땐 안되더니ㅠ

설 당일은 좀 쉬고, 오늘 다시 YCbCr로 변환하고 이진화를 시키려고했더니, 역시 만만치 않았다.

OpenCV고수들은 걍 뚝딱 하겠지?ㅠ

우선 YCbCr로 변환하는건 확실히 성공했는데,
이진화가 된 영상이 [YCbCr->이진화] 로 된건지, 바로 그냥 [RGB->이진화] 가 된건지 헛갈린다-_-


그리고 영상이 살짝 뚝뚝 끊기는 느낌도 들고,
메모리 체크를 해 봤더니, 들쑥날쑥한다.
계~~속 오르기만 하면 메모리 누수가 확실하지만,
이렇게 들쑥날쑥 하는 경우는 당췌 뭔지-_-a

void PlayGameForm::OnPaint()
{
	CPaintDC dc(this);

	// OpenCV Start
	if (!IsIconic())
	{		
		if( this->cameraManager->GetCamera().Get_ipl_OriginalImage() )
		{
			CDC*	pDC;
			CDC*	pDC_YCbCr;
			CRect	rect;
			int x, y;

			// Original Image Start
			pDC = originalCam.GetDC();
			originalCam.GetClientRect(&rect);
			x = rect.top;
			y = rect.left;
			rect.SetRect(x, y, x + CAM_WIDTH, y + CAM_HEIGHT);

			cvGrabFrame( *(this->cameraManager->GetCamera().Get_m_pCapture()) );	// Camera로 부터 Frame을 받아 옴
			this->cameraManager->GetCamera().cvRetrieveFrame_OriginalImage();		// Camera로 부터 Frame을 받아 옴

			this->cameraManager->GetCamera().Get_cvv_OriginalImage().CopyOf
				( this->cameraManager->GetCamera().Get_ipl_OriginalImage() );

			this->cameraManager->GetCamera().Get_cvv_OriginalImage().DrawToHDC(pDC->m_hDC, rect);
			// Original Image End

			// YCbCr Change Start
			this->cameraManager->GetCamera().Create_ipl_YCbCr_Image ();
			cvCvtColor( this->cameraManager->GetCamera().Get_ipl_OriginalImage(),
				this->cameraManager->GetCamera().Get_ipl_YCbCr_Image(),CV_BGR2YCrCb );
			// YCbCr Change End

			// 이진화 Start
			pDC_YCbCr = yCbCrCam.GetDC();
			yCbCrCam.GetClientRect(&rect);
			x = rect.top;
			y = rect.left;
			rect.SetRect(x, y, x + CAM_WIDTH, y + CAM_HEIGHT);

			this->cameraManager->GetCamera().Create_ipl_gray_Image();

			cvCvtColor(this->cameraManager->GetCamera().Get_ipl_YCbCr_Image(),
				this->cameraManager->GetCamera().Get_ipl_gray_Image(), CV_RGB2GRAY); // gray Image를 흑백으로 치환

			cvThreshold(this->cameraManager->GetCamera().Get_ipl_gray_Image(),
				this->cameraManager->GetCamera().Get_ipl_gray_Image(), this->cameraManager->GetCamera().GetThreshold(),
				255, CV_THRESH_BINARY); // gray Image를 이진화

			this->cameraManager->GetCamera().Get_cvv_bin_Image().CopyOf
				( this->cameraManager->GetCamera().Get_ipl_gray_Image() );

			this->cameraManager->GetCamera().Get_cvv_bin_Image().DrawToHDC(pDC_YCbCr->m_hDC, rect);
			// 이진화 End

			// 할당 해제
			originalCam.ReleaseDC(pDC);
			yCbCrCam.ReleaseDC(pDC_YCbCr);

			this->cameraManager->GetCamera().Get_cvv_OriginalImage().Destroy();
			this->cameraManager->GetCamera().Get_cvv_bin_Image().Destroy();
			
			this->cameraManager->GetCamera().Release_ipl_YCbCr_Image();
			this->cameraManager->GetCamera().Release_ipl_gray_Image();
			
			ReleaseDC(pDC_YCbCr);
			ReleaseDC(pDC);
		}
	}
	// OpenCV End
}
저작자 표시 비영리 변경 금지
신고
  1. 몰라
    헤헤헤헿;;;ㅋㅋㅋㅋㅋㅋ

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

티스토리 툴바