/******************************************************************************************
* 美颜相机活动
******************************************************************************************/
package com.example.drimage;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.Button;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import static com.example.drimage.R.id.image;
import static org.opencv.core.Core.flip;
import static org.opencv.core.Core.transform;
import static org.opencv.core.Core.transpose;
public class beautyCameraActivity extends AppCompatActivity {
Mat cameraImage;
private int camera_flag;
private CameraBridgeViewBase openCvCameraView; //摄像头
private CascadeClassifier cascadeClassifier; //级联分类器
private static final String TAG = "OCVSample::Activity";
private int absoluteFaceSize; //人脸检测区域
private int camera_width; //获取摄像头控件视图宽度
private int camera_height; //获取摄像头控件视图高度
//将opencv实例化
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
try{
InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
// File mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
File mCascadeFile = new File(cascadeDir, "haarcascade_frontalface_alt.xml");
FileOutputStream os = new FileOutputStream(mCascadeFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
is.close();
os.close();
// Load the cascade classifier
cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath());
} catch (Exception e) {
Log.e("OpenCVActivity", "Error loading cascade", e);
}
openCvCameraView.enableView(); //打开摄像头
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
//回调函数,作用是检查opencv管理器是否安装好,由于opencv管理器定义了所有的opencv函数,所以需要在设备上安装opencv管理器应用,假如不想使用
//opencv管理器,也可以在本地包含函数,只是apk的大小会增大很多。
protected void onResume(){
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, this, mLoaderCallback);
} else {
Log.d("OpenCV", "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.beauty_camera_layout);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
openCvCameraView = (CameraBridgeViewBase) findViewById(R.id.java_surface_view);
openCvCameraView.setVisibility(SurfaceView.VISIBLE);
/*****************
* 获取摄像头视图控件大小
*/
//建立控件监听器,获取控件大小
ViewTreeObserver vto = openCvCameraView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
openCvCameraView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
camera_height = openCvCameraView.getHeight();
camera_width = openCvCameraView.getWidth();
}
});
/////////////////////////////////////////////////////////////////////////
/********
* 摄像头图像
*/
openCvCameraView.setCvCameraViewListener(new CameraBridgeViewBase.CvCameraViewListener(){
@Override
public void onCameraViewStarted(int width, int height) {
cameraImage = new Mat(height,width,CvType.CV_8UC4);
absoluteFaceSize = (int) (height * 0.1); //定义人脸检测区域
}
@Override
public void onCameraViewStopped() {
}
/***************************
* 图像处理部分都写在这里
* @param inputFrame
* @return
*/
@Override
public Mat onCameraFrame(Mat inputFrame) {
if(camera_flag != 0) //判断是否是前置摄像头,前置摄像头需要翻转
flip(inputFrame, inputFrame, 1);
Imgproc.cvtColor(inputFrame,cameraImage,Imgproc.COLOR_BGRA2BGR); //四通道转三通道
Mat mGray = inputFrame;
Imgproc.cvtColor(inputFrame,mGray,Imgproc.COLOR_BGRA2GRAY);
MatOfRect faces = new MatOfRect(); //定义人脸区域
if (cascadeClassifier != null) {
cascadeClassifier.detectMultiScale(mGray, faces, 1.1, 2, 2,
new Size(absoluteFaceSize, absoluteFaceSize), new Size());
}
Rect[] facesArray = faces.toArray();
for (int i = 0; i <facesArray.length; i++)
Core.rectangle(cameraImage, facesArray[i].tl(), facesArray[i].br(), new Scalar(255, 255, 255), 3); //将人脸区域画出
// Imgproc.cvtColor(cameraImage,cameraImage,Imgproc.COLOR_RGBA2GRAY);
// angleChange(cameraImage);
//旋转图像90度
Point center = new Point(cameraImage.rows()/2, cameraImage.cols()/2); //创建中心点
double angle = -90;
Mat rotMat; //旋转矩阵
rotMat = Imgproc.getRotationMatrix2D(