Android NDK开发:利用OpenCV实现美颜
2019-08-05 本文已影响2人
itfitness
目录
效果演示
实现原理
首先使用中值滤波进行模糊操作,目的在于除去图像的噪点(包括一些小的色斑),然后利用双边滤波进行保留图像边缘的模糊(可以理解为磨皮),最后再通过锐化图像让模糊的边缘清晰。
相关API
●medianBlur(中值滤波操作)
●bilateralFilter(双边滤波操作)
●filter2D(卷积操作)
核心代码
本来想通过C++代码来实现的,奈何将图像的类型转换为CV_8UC3后对图像的操作无效,所以采用了OpenCV配套的JNI函数库。
Mat src = new Mat();
Mat dst = new Mat();
//将Bitmap转换为Mat
Utils.bitmapToMat(mBitmap,src);
//将图像转换为三通道(CV_8UC3),因为双边滤波的操作不支持原图像的4通道(CV_8UC4)
Imgproc.cvtColor(src,src,Imgproc.COLOR_RGBA2RGB);
//中值滤波,去除图像的噪点(或是脸部小斑点)
Imgproc.medianBlur(src,src,3);
//双边滤波,保留图像边缘
Imgproc.bilateralFilter(src,dst,40,50,30);
//========锐化图像,让边缘更加明显========
Mat kx = new Mat(3, 3, CvType.CV_32FC1);
float[] robert_x = new float[]{0, -1, 0, -1, 5, -1, 0, -1, 0};
kx.put(0, 0, robert_x);
Imgproc.filter2D(dst,dst,-1,kx );
//=========================================
//将Mat转换为Bitmap
Utils.matToBitmap(dst,mBitmap);