우선 붉은 색 검출에 성공을 하긴 했는데
속도가 느리다.
한눈에 '느리다' 라는 느낌이 든다.
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
}
'Project > 증강현실을 이용한 사천성' 카테고리의 다른 글
| 빨강 추적 (1) | 2010.02.19 |
|---|---|
| 영상 속도가 느린 이유 (0) | 2010.02.18 |
| AR을 이용한 사천성 알 출력 (0) | 2010.02.17 |
| RGB->YCbCr->이진화 (2) | 2010.02.15 |
| OpenCV로 영상 출력 성공, 하지만.. (0) | 2010.02.10 |