OpenCV 모자이크 루틴을 만들어보다 (2)
OpenCV 모자이크 루틴을 만들어보다 (1)
필요한 루틴을 만들지 않고, 엉뚱한(?) 루틴을 만들어서 필요한 루틴을 다시 만들어 봤습니다. 내일 할려고 했는데, 이런거 바로바로 안해주면 밤에 잠이 안와서 말이죠. ^^
필요한 루틴은 영상 부분 모자이크 처리 루틴이었습니다. 부분은 사각(Rectangle) 이 아니라 원(Round) 이라서 영상에서 원영역을 선택해서 해당 영역을 모자이크 처리하는 루틴 입니다. 이전에 만들었던 코드에 그대로 추가해서 만들어 봤습니다.
[영상 부분 모자이크(원)]
void mosaicRound(
IplImage * img,
int mosaic_width,
int mosaic_height,
int center_x,
int center_y,
int radius
)
{
int x, y, xx, yy, xx_width, yy_height, mosaic;
int b_sum, g_sum, r_sum;
int start_x, start_y, end_x, end_y;
CvScalar value;
start_x = (center_x-radius)>0 ? center_x-radius : 0;
start_y = (center_y-radius)>0 ? center_y-radius : 0;
end_x = (center_x+radius)>img->width-1 ? img->width-1 : center_x+radius;
end_y = (center_y+radius)>img->height-1 ? img->height-1 : center_y+radius;
for(y=start_y; y<=end_y; y+=yy_height){
for(x=start_x; x<=end_x; x+=xx_width){
if( (x+mosaic_width)<=img->width )
xx_width = mosaic_width;
else
xx_width = img->width % mosaic_width;
if( (y+mosaic_height)<=img->height )
yy_height = mosaic_height;
else
yy_height = img->height % mosaic_height;
mosaic = xx_width * yy_height;
b_sum = 0;
g_sum = 0;
r_sum = 0;
for(yy=0; yy<yy_height; yy++){
for(xx=0; xx<xx_width; xx++){
value = cvGet2D(img,y+yy,x+xx);
b_sum += value.val[0];
g_sum += value.val[1];
r_sum += value.val[2];
}
}
value.val[0] = b_sum / mosaic;
value.val[1] = g_sum / mosaic;
value.val[2] = r_sum / mosaic;
for(yy=0; yy<yy_height; yy++){
for(xx=0; xx<xx_width; xx++){
if( sqrt((x+xx-center_x)*(x+xx-center_x)+(y+yy-center_y)*(y+yy-center_y))<=radius ){
cvSet2D(img,y+yy,x+xx,value);
}
}
}
}
}
}

함수의 사용 방법은 다음과 같습니다.
mosaicRound(
OpenCV이미지포인터,
모자이크가로크기,
모자이크세로크기,
모자이크적용원의중점x좌표,
모자이크적용원의중점y좌표,
모자이크적용원의반지름
);
다음과 같이 사용하면 되겠습니다
mosaicRound( img, 10, 10, 400, 100, 70 );
[후기]
영상 부분(원) 모자이크 루틴은 좀더 세밀하게 만들자면 코드를 조금 더 복잡해지긴 합니다. 하지만 굳이 그럴필요가 없기에 무시할건 무시하고 코드를 작성하게 되었네요. 테스트도 해보고 했는데, 이정도면 충분한듯 하네요.
Trackback URL : http://rainless.ipocs.com/blog/trackback/202
관리자만 볼 수 있는 댓글입니다.