ndkJNI和【NDK】Android OpenCV

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);

案例源码

案例源码

上一篇下一篇

猜你喜欢

热点阅读