본문 바로가기

Project/증강현실을 이용한 사천성

RGB->YCbCr->이진화


우선 설 전날, 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
}