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이 아니라면 그에 대응되는 지점의 값을 복사한다.


+ Recent posts