OpenGL을 이용한 Picking 성공OpenGL을 이용한 Picking 성공

Posted at 2010.02.24 15:48 | Posted in Project/증강현실을 이용한 사천성
크리에이티브 커먼즈 라이선스
Creative Commons License

일단 방금 기능구현이 막 끝난 참이라
부가기능 구현도 안되어있고
여러가지 자잘한 버그도 수정이 안되어있다.

게임 실행창을 닫아서 메인 창으로 갔다가,
다시 게임 실행창을 켰을때 화면이 검게 나오는 이유는,

ARToolKit에서 제공해주는 프레임을 얻어오는 함수를 거치면서 화면이 검게되는것을 확인하였다.

어디서부터 손을 대야할지 막막하다-_-a

이걸 어떻게 고치지....ㅠ
저작자 표시 비영리 변경 금지
신고
  1. 이것 저것 신경써야 할 것이 많은 와중에도 열심히 하니까 보기 좋은것 같네.ㅋ
  2. gloria
    안녕하세요~ 저는 증강현실을 졸업작품으로 준비하고 있는 학생입니다. 현재 open gl에서 picking을 하려고 하는데 이 부분을 어떻게 어디서 부터 해야할 지 막막해서 이것 저것 찾는 도중의 숙신님의 홈페이지를 보게 되었습니다.
    숙신님께서 올려놓은 월풍도원에 들어가 봤는데.. ㅠ 실은 이게 무슨 말인지 잘 모르겠어요ㅠㅠ 일단 open gl책으로 공부를 하고 있긴 한데요..ㅠ
    그래서 pinking에 대해 조언을 구할 수 있을까요? ㅠㅠㅠㅠㅠ 일단 menu를 띄우고 거기서 숙신님이 하신 것 처럼 선택을 하고 싶은데요. 이렇게 하려면 어떻게 해야 하나요 ㅠ 제발 부탁드립니다. ㅠ

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

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

Posted at 2010.02.20 02:52 | Posted in Project/증강현실을 이용한 사천성
크리에이티브 커먼즈 라이선스
Creative Commons License


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

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 | 비밀글로 남기기

빨강 추적빨강 추적

Posted at 2010.02.19 00:51 | Posted in Project/증강현실을 이용한 사천성
크리에이티브 커먼즈 라이선스
Creative Commons License


분명 중심도 구하고
cvCircle 함수도 썼는데 왜 안되나 했었더니,
원본 영상 이미지를 다시 출력해주는걸 깜박했다ㅋㅋ

이런 어이없는 실수를 ㅋㅋ

void CameraManager::DrawCircle ()
{
	int i = 0;
	int j = 0;
	int counter = 0;
	CvPoint m_ptRed = cvPoint(0, 0);

	CRect rect;
	int x, y;

	this->pDC = this->originalCam->GetDC(); //Picture Box의 영역을 구함
	this->originalCam->GetClientRect(&rect);
	x = rect.top;
	y = rect.left;
	rect.SetRect(x, y, x + CAM_WIDTH, y + CAM_HEIGHT);

	// 중심 구하기
	for (i = 0 ; i < this->camera.Get_ipl_gray_Image()->height ; i++)
	{
		for (j = 0 ; j < this->camera.Get_ipl_gray_Image()->widthStep ; j++)
		{
			if ((this->camera.Get_ipl_gray_Image()->
				imageData[i * this->camera.Get_ipl_gray_Image()->widthStep + j])!=0)
			{
				m_ptRed.x += j;
				m_ptRed.y += i;
				counter++;
			}
		}
	}

	// 원그리기
	if(counter != 0)
	{
		m_ptRed.x = m_ptRed.x / counter;
		m_ptRed.y = m_ptRed.y / counter;
		cvCircle(this->camera.Get_ipl_OriginalImage(), m_ptRed, 20, CV_RGB(255,0,0), 3);
	}

	// Original Image View
	this->camera.Get_cvv_OriginalImage().CopyOf ( this->camera.Get_ipl_OriginalImage() );
	this->camera.Get_cvv_OriginalImage().DrawToHDC(this->pDC->m_hDC, rect);

	this->originalCam->ReleaseDC(this->pDC);
}
저작자 표시 비영리 변경 금지
신고
  1. 비밀댓글입니다

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

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

Posted at 2010.02.18 23:59 | Posted in Project/증강현실을 이용한 사천성
크리에이티브 커먼즈 라이선스
Creative Commons License

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

필터링을 하면서 많이 느려졌고,
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/증강현실을 이용한 사천성
크리에이티브 커먼즈 라이선스
Creative Commons License


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

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/증강현실을 이용한 사천성
크리에이티브 커먼즈 라이선스
Creative Commons License

우선 설 전날, 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 | 비밀글로 남기기

OpenCV로 영상 출력 성공, 하지만..OpenCV로 영상 출력 성공, 하지만..

Posted at 2010.02.10 13:07 | Posted in Project/증강현실을 이용한 사천성
크리에이티브 커먼즈 라이선스
Creative Commons License

앞에 설계에서 나타냈듯이, OpenCV로 화면출력하는데 필요한 함수나 변수들을
Camera 라는 Class에 넣고, 가져다 사용하는 식으로 구현을 하려고했다.

하지만 뭐가 문제인지, 로직상에는 문제가 없는데, 영상을 받아오자마자


이런 에러 메시지가 출력되면서 스택 오버플로우가 발생하였다.
하루 꼴딱 이 에러녀석과 싸우다가, 그냥 인터넷에 올라와있는 수많은 예제들 처럼
Form Class에 public으로 변수선언 해버리고 그냥 사용을 했더니


성공-_-;;;;;;;;;

아.......어이없어.......
어디가 잘못된 것일까....

일단 마감일에 압박 때문에, Class화는 기능 구현이 다 된 후에 다시 하기로 하고
일단 Class diagram을 수정하였다.


아...그런데 이렇게 해버리니,
설계에 의한 구현이 아니라
구현에 의한 설계
가 되어버린것같아서 너무 찝찝하다....
저작자 표시 비영리 변경 금지
신고

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

VS2008에서 OpenCV 1.1 설정 방법VS2008에서 OpenCV 1.1 설정 방법

Posted at 2010.02.02 01:21 | Posted in Project/증강현실을 이용한 사천성
크리에이티브 커먼즈 라이선스
Creative Commons License

1)DownLoad..
http://sourceforge.net/projects/opencvlibrary/

2)Build
C:\Program Files\OpenCV\_make\opencv.vs2005.sln

빌드 >> 일괄빌드 에서 플랫폼은 Wind32로 Debug,Release모두 선택을하여 빌드시켜줘야한다.

3)Debug Error수정

위에서와같이 빌드를 해주면 에러가 발생할것이다.
cvaux.h Line : 1167에서 보면.(줄 찾기는 Ctrl+G)



주석을 열어놓고 제대로 닫지 않은 코드를 볼수 있다.
이것을 제대로 고치고 다시 디버그하면 OpenCV설치의 1단계는 단락된것이다.




4)Visual Studio와 연동시키기
빌드까지 마친상태라면 visualstudio에 빌드한 include,Library file을 등록 시켜야한다.
등록 시키는 방법으로서는 도구 >> 옵셥 >> 프로젝트 및 솔루션 >> VC++디렉터리에서
포함파일과 라이브러리 파일에서 각 각 등록시켜주면 된다.



4-1)Include File
C:\PROGRAM FILES\OPENCV\OTHERLIBS\HIGHGUI
C:\PROGRAM FILES\OPENCV\CV\INCLUDE
C:\PROGRAM FILES\OPENCV\CXCORE\INCLUDE

C:\PROGRAM FILES\OPENCV\_make
C:\PROGRAM FILES\OPENCV\_ml\INCLUDE

4-2)Libary File
C:\PROGRAM FILES\OPENCV\LIB
C:\PROGRAM FILES\OPENCV\otherlibs\_graphics\lib
C:\PROGRAM FILES\OPENCV\otherlibs\ffopencv

모두 다등록시켜줘도 상관은 없지만, 나는 필요한 파일만 등록시켜 사용했다.


5) 확인 예제
저작자 표시 비영리 변경 금지
신고
  1. 김선화
    vs 2008 에 opencv 1.0도 똑같이 설정해주면 되는건가요?

    빠른답변 부탁드려요 ^^:
    • 2010.05.23 14:35 신고 [Edit/Del]
      1.0은 해보지 않아서 확답은 드릴수 없지만, 아마 될꺼에요^^ 가장 좋은 방법은 직접 해보시는거겠죠?ㅎ 네이버 카페 OpenCV 코리아 참고하세요^^
  2. 뱀틴
    정리가 잘되어있네요. 좋은 정보 감사합니다

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

티스토리 툴바