Альфа градиент в opencv (обертка для единства) - PullRequest
0 голосов
/ 01 декабря 2018

Я использую opencv для Unity в c #, но я думаю, что это очень похоже на opencv для Java

Я думаю, что моя проблема проста, но я новичок в opencv, и есть многовещи, которые я не знаю ...

Это моя ситуация: на картинке мне нужно вырезать лицо и применить эффект эскиза.

ФОТО: enter image description here

ОБРЕЗАННОЕ ИЗОБРАЖЕНИЕ С НЕКОТОРЫМИ ЭФФЕКТАМИ:

enter image description here

Мне нужна градиентная альфа-граница эллипса в финалеобраз.Что-то вроде следующего изображения, но с градиентом на границе эллипса

enter image description here

Это мой код:

Mat mask = new Mat(rgbaMat.rows(), rgbaMat.cols(), CvType.CV_8UC4, new Scalar(0, 0, 0, 0));
Mat face = new Mat(rgbaMat.rows(), rgbaMat.cols(), CvType.CV_8UC4, new Scalar(0, 0, 0, 0));
OpenCVForUnity.Rect rectCrop = new OpenCVForUnity.Rect((int)x, (int)y, (int)width, (int)height);
RotatedRect rRect = new RotatedRect(new Point(centerX, centerY), new Size(width, height), 0);
Imgproc.ellipse(mask, rRect, new Scalar(255, 255, 255, 255), -1);
Imgcodecs.imwrite(Application.dataPath + "/mask.png", mask);


Mat abs_grad_x = new Mat(rgbaMat.rows(), rgbaMat.cols(), CvType.CV_16SC4, new Scalar(0, 0, 0, 0));
Mat abs_grad_y = new Mat(rgbaMat.rows(), rgbaMat.cols(), CvType.CV_16SC4, new Scalar(0, 0, 0, 0));
Mat grad_x = new Mat(rgbaMat.rows(), rgbaMat.cols(), CvType.CV_16SC4, new Scalar(0, 0, 0, 0));
Mat grad_y = new Mat(rgbaMat.rows(), rgbaMat.cols(), CvType.CV_16SC4, new Scalar(0, 0, 0, 0));
int delta = 0;
int scale = 1;
int ddepth = CvType.CV_16S;

Mat final = new Mat(rgbaMat.rows(), rgbaMat.cols(), CvType.CV_16SC4, new 
Scalar(0, 0, 0, 0));
Imgproc.GaussianBlur(mask, mask, new Size(42, 42), 0);
rgbaMat.copyTo(face, mask);
face = face.submat(rectCrop);
Imgproc.GaussianBlur(face, face, new Size(21, 21), 0);
Imgproc.cvtColor(face, face, Imgproc.COLOR_RGBA2GRAY);
Imgproc.Scharr(face, grad_x, ddepth, 1,0,scale, delta, 0);
Core.convertScaleAbs(grad_x, abs_grad_x);

Imgproc.Scharr(face, grad_y, ddepth,0, 1, scale, delta, 0);
Core.convertScaleAbs(grad_y, abs_grad_y);
Core.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, final);
Core.bitwise_not(final, final);
Imgproc.threshold(final, final, 230,255, Imgproc.THRESH_BINARY);
...