void emboss(Mat& f)
{
Mat mask(3, 3, CV_32F, Scalar(0)), res;
mask.at<float>(0, 0) = -1.0;
mask.at<float>(2, 2) = 1.0;
filter2D(f, res, CV_16S, mask);
res.convertTo(res, CV_8U, 1, 128);
namedWindow("엠보싱"); imshow("엠보싱", res);
}
void waterColor(Mat& f)
{
#define dsize 7
#define sigma 32
int iterate = 20;
Mat t1 = f.clone(), t2;
for (int i = 0; i<iterate; i++)
if (i % 2 == 0) bilateralFilter(t1, t2, dsize, sigma, sigma);
else bilateralFilter(t2, t1, dsize, sigma, sigma);
namedWindow("수채화");
if (iterate % 2 == 0) imshow("수채화", t1);
else imshow("수채화", t2);
}
void sketch(Mat& f)
{
Mat gray, edge, display;
int thres = 5;
cvtColor(f, gray, CV_BGR2GRAY);
blur(gray, gray, Size(3, 3));
Canny(gray, edge, thres, thres*2.5, 3);
display.create(f.size(), f.type());
display = Scalar::all(128);
f.copyTo(display, edge);
namedWindow("스케치"); imshow("스케치", display);
}
void onTrackbar(int thres, void* gray)
{
Mat* image = (Mat*)gray;
Mat edge, display;
Canny(*image, edge, thres, thres*3, 3);
display.create(input.size(), input.type());
display = Scalar::all(128);
input.copyTo(display, edge);
imshow("스케치 농도", display);
}
void sketchByTrackbar(Mat& input)
{
int pos = 0;
Mat gray;
cvtColor(input, gray, CV_BGR2GRAY);
blur(gray, gray, Size(3, 3));
namedWindow("스케치 농도");
createTrackbar("임계값", "스케치 농도", &pos, 200, onTrackbar, &gray);
setTrackbarPos("임계값", "스케치 농도", pos);
waitKey(1);
}
Track Bar Call Back 사용하기
createTrackbar("임계값", "스케치 농도", &pos, 200, onTrackbar, &gray);
TrackBar CallBack은 (void *)&Mat 을 넘겨주어야한다.
void Mat::copyTo( OutputArray m, InputArray mask ) const
기존에 사용한 단순 복사에서 마스크에 해당하는 파라미터를 추가해주어 복사해온다. 마스크의 특정 픽셀의 값을 확인하여 해당 지점의 값이 0이 아니라면 그에 대응되는 지점의 값을 복사한다.
'Programming > openCV' 카테고리의 다른 글
iterator의 개념 (0) | 2017.04.04 |
---|---|
12. Templet Matching (0) | 2017.04.04 |
10. 마우스로 영역을 지정한 부분만 엣지 검출 (0) | 2017.04.04 |
9. sobel Filter / Canny Edge (0) | 2017.04.04 |
8. 영상을 Canny Edge Detection 후 저장하기 / 영상 정보 출력하기 (0) | 2017.04.04 |