1 实验内容
1.1 项目介绍
本项目是来源于我的大学生创业项目——AI摄影导师,我是项目的主要负责人。
这个项目主要是一款智能拍摄指导软件。这个APP具有拍照的指导功能,能够提供美学得分和美学属性的评价。使用美学仪表盘,新手可以简单地根据分数调整他们的拍照角度;业余用户或专业用户可以参考模板匹配分数,以获得所需的光、颜色和构图模式。
1.2 项目原理
本系统借助PyTorch Mobile框架在移动设备上部署ONNX模型,该框架可以有效简化模型的开发部署流程,提高AI应用效率。借助PyTorch Mobile的API 接口,我们对训练好的美学模型进行了转换、保存和优化,成功将模型部署至安卓端移动应用程序中。
技术原理图
为构建在图像美学质量评价和图像美学属性评价中都有合理分布的数据集,我们收集整理了目前主流的图像美学数据集,重新构建了混合多属性美学数据集(AMD-A)。该数据集由16924 张图片组成,分为美学质量评价数据集(11166张)和美学属性评价数据集(16924 张),分别用于美学质量分类和美学属性回归训练;而对于人像美学数据集,我们实验室自建了PCCD、AADB等四个数据集中的人像部分(5077张)。数据集的每张图片,都有总分标签和光照、色彩、构图三个属性分标签,标签的分数是连续的,取值范围是0-1,4种标签的数据分布相似。
下图为数据集美学标签的数值分布,可以看出四种标签(总分、光照分、色彩分、构图分)具有相似的数值分布。
训练策略。先训练分类子网络,分类任务根据美学得分高低将图像分为十类;再按照光照、色彩和构图的顺序对三个子网络进行训练,训练标签是图像的属性标签;最后训练美学总分任务,使用图像的总分标签。损失函数使用分类子网络输出的10个特征来指导回归子网络的10个特征,通过计算两个特征序列之间的相对熵,加权后与美学分数回归的MSE损失进行梯度调整。设置分类训练批次大小为32,回归训练批次大小为64,学习率初始值为0.0001,使用Adam作为优化器,beta设置为(0.98,0.999),权重衰减设置为0.0001,如果连续两轮分类的准确率没有提高,或者连续两轮回归的损失值没有减少,学习率将乘以0.5。
2 实现过程
2.1 结构分析
本系统所包含到的有关技术有:Android平台、OpenCV技术、Pytorch模型训练、模型小型化技术、Java语言等等。
项目是通过MainActivity.java实现软件的主要功能,通过MainActivity2.java实现姿态推荐功能。通过Color_Board.java和Light_Board.java导入部署在安卓端的模型,这两个模型都是在电脑Python环境下,经过ONNX跟Pytorch-mobile小型化之后得到的。
此外在asset文件中存放了使用到的模型和OpenCV算法库。
我们使用教师--学生知识蒸馏技术,先将可部署至安卓端的ONNX模型作为教师网络,通过大量的参数调节达到相对优秀的评分预测结果。然后使用一个小的相对简单的学生网络对教师网络的特征进行预测,要求学生网络的特征提取层提取的特征尽可能接近教师网络的特征提取层结果。知识蒸馏的好处就是化繁为简,同时保留了大网络的能力,整个学生网络的总大小仅为15.53MB。
2.2 主要界面的实现
开启手机相机,获取当前相机的预览界面,逐帧输入端侧AI模型,得到推理结果。推理结果中包括美学总分、色彩分、光照分和构图分。
总分以条状显示在预览界面中,并标注出分数值。色彩分、光照分和构图分共同构成美学雷达图,以雷达图的形式直观显示给用户,并标注出分数值。
代码如下:
package org.pytorch.helloworld;
import static android.hardware.camera2.CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES;
import static android.hardware.camera2.CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
import static android.hardware.camera2.CameraMetadata.CONTROL_EFFECT_MODE_AQUA;
import static android.hardware.camera2.CameraMetadata.CONTROL_EFFECT_MODE_NEGATIVE;
import static android.hardware.camera2.CameraMetadata.CONTROL_EFFECT_MODE_WHITEBOARD;
import static android.hardware.camera2.CameraMetadata.CONTROL_SCENE_MODE_ACTION;
import static android.hardware.camera2.CameraMetadata.CONTROL_SCENE_MODE_HDR;
import static android.hardware.camera2.CameraMetadata.CONTROL_SCENE_MODE_NIGHT;
import static android.hardware.camera2.CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_OFF;
import static android.hardware.camera2.CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON;
import static android.hardware.camera2.CameraMetadata.NOISE_REDUCTION_MODE_FAST;
import static android.hardware.camera2.CameraMetadata.NOISE_REDUCTION_MODE_HIGH_QUALITY;
//import android.graphics.Point;
import static org.pytorch.helloworld.Light_Board.softmax;
import static org.pytorch.helloworld.MainActivity2.pq;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.hardware.SensorManager;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.YuvImage;
import android.media.Image;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.util.Log;
import android.util.Range;
import android.view.Display;
import android.view.FocusFinder;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.OrientationEventListener;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.camera2.interop.Camera2Interop;
import androidx.camera.core.AspectRatio;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraControl;
import androidx.camera.core.CameraInfo;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.CameraX;
import androidx.camera.core.ExperimentalGetImage;
import androidx.camera.core.FocusMeteringAction;
import androidx.camera.core.FocusMeteringResult;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCaptureException;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.MeteringPoint;
import androidx.camera.core.MeteringPointFactory;
import androidx.camera.core.Preview;
import androidx.camera.core.ZoomState;
import androidx.camera.extensions.ExtensionsManager;
import androidx.camera.extensions.ExtensionMode;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.android.JavaCamera2View;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LiveData;
import com.github.mikephil.charting.charts.HorizontalBarChart;
import com.github.mikephil.charting.charts.RadarChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.RadarData;
import com.github.mikephil.charting.data.RadarDataSet;
import com.github.mikephil.charting.data.RadarEntry;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.mlkit.vision.common.InputImage;
import com.google.mlkit.vision.face.Face;
import com.google.mlkit.vision.face.FaceContour;
import com.google.mlkit.vision.face.FaceDetection;
import com.google.mlkit.vision.face.FaceDetector;
import com.google.mlkit.vision.face.FaceDetectorOptions;
import com.google.mlkit.vision.face.FaceLandmark;
//import com.gyf.immersionbar.ImmersionBar;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Point;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.pytorch.IValue;
import org.pytorch.LiteModuleLoader;
import org.pytorch.MemoryFormat;
import org.pytorch.Module;
import org.pytorch.Tensor;
import org.pytorch.torchvision.TensorImageUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
//import androidx.camera.camera2.interop.CaptureRequestOptions;
import android.content.Intent;
import android.os.Bundle;
import android.view.GestureDetector;
//import android.view.MotionEvent;
import android.widget.TextView;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.WindowManager;
import android.content.res.Configuration;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.*;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
//import com.tbruyelle.rxpermissions2.RxPermissions;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
private ImageCapture imageCapture;
private File outputDirectory;
private ExecutorService cameraExecutor;
private RadarChart rc;
private CameraSelector cameraSelector;
//这个特性是安卓5.0以后才支持的所以需要对系统版本号做判断
private Boolean radar_status = true;
private long mExitTime;
public String S = "123";
public Boolean camera_len = true;
public Boolean camera_torch = false;
public Boolean camera_flash = false;
public int camera_white_balance = 0;
public int camera_noise = 2;
public int camera_focus = 2;
public int camera_scene = 18;
public Boolean camera_exposure = true;
public CameraInfo CameraInfo;
public CameraControl CameraControl;
private CameraManager mCameraManager;
private CameraCharacteristics mCameraCharacteristics;
public Camera camera;
public PreviewView viewFinder;
//final ListenableFuture cameraProviderFuture=ProcessCameraProvider.getInstance(getApplicationContext());
//public ProcessCameraProvider cameraProvider;
public boolean camera_face = true;
public Drawable[] images_light = new Drawable[50];
public Drawable[] images_color = new Drawable[50];
public Drawable[] images_composition = new Drawable[50];
private ImageView image_colors;
private ImageView image_lights;
private ImageView image_compositions;
private int t;
private int temp;
LiveData<ZoomState> zoomState;
public float maxZoomRatio;
public float minZoomRatio;
Preview preview;
public GestureDetector mGesture;
public String desc = "";
final Handler handler = new Handler();
final Handler handler2 = new Handler();
final Handler handler0 = new Handler();
FocusFinder focusFinder;
private Toast toast = null;
public FaceDetectorOptions realTimeOpts;
public ProcessCameraProvider processCameraProvider;
ImageAnalysis imageAnalysis;
private static final String TAG = "OCVSample::Activity";
private CameraBridgeViewBase mOpenCvCameraView;
private Mat mIntermediateMat;
private CascadeClassifier classifier;
private Mat mGray;
private Mat mRgba;
private int mAbsoluteFaceSize = 0;
private int mCameraIndexCount=0;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
getPermission();
// mOpenCvCameraView.enableView();
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
setContentView(R.layout.mainp);//竖
else setContentView(R.layout.mainl);//横
if (getActionBar()!=null)
getSupportActionBar().hide();
//touming
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
Toast.makeText(this, "欢迎使用AI摄影导师1.0版!", Toast.LENGTH_SHORT).show();
Window window = getWindow();
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|View.SYSTEM_UI_FLAG_LAYOUT_STABLE
);
window.setStatusBarColor(Color.TRANSPARENT);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
// window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
// window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// window.setNavigationBarColor(Color.TRANSPARENT);
// window.setStatusBarColor(Color.TRANSPARENT);
images_color[1] = getDrawable(R.drawable.plt_color_1);
images_color[2] = getDrawable(R.drawable.plt_color_2);
images_color[3] = getDrawable(R.drawable.plt_color_3);
images_color[4] = getDrawable(R.drawable.plt_color_4);
images_color[5] = getDrawable(R.drawable.plt_color_5);
images_color[6] = getDrawable(R.drawable.plt_color_6);
images_color[7] = getDrawable(R.drawable.plt_color_7);
images_color[8] = getDrawable(R.drawable.plt_color_8);
images_color[9] = getDrawable(R.drawable.plt_color_9);
images_color[10] = getDrawable(R.drawable.plt_color_10);
images_color[11] = getDrawable(R.drawable.plt_color_11);
images_color[12] = getDrawable(R.drawable.plt_color_12);
images_color[13] = getDrawable(R.drawable.plt_color_13);
images_color[14] = getDrawable(R.drawable.plt_color_14);
images_color[15] = getDrawable(R.drawable.plt_color_15);
images_color[16] = getDrawable(R.drawable.plt_color_16);
images_color[17] = getDrawable(R.drawable.plt_color_17);
images_color[18] = getDrawable(R.drawable.plt_color_18);
images_color[19] = getDrawable(R.drawable.plt_color_19);
images_color[20] = getDrawable(R.drawable.plt_color_44);
images_color[21] = getDrawable(R.drawable.plt_color_21);
images_color[22] = getDrawable(R.drawable.plt_color_22);
images_color[23] = getDrawable(R.drawable.plt_color_23);
images_color[24] = getDrawable(R.drawable.plt_color_24);
images_color[25] = getDrawable(R.drawable.plt_color_25);
images_color[26] = getDrawable(R.drawable.plt_color_26);
images_color[27] = getDrawable(R.drawable.plt_color_27);
images_color[28] = getDrawable(R.drawable.plt_color_28);
images_color[29] = getDrawable(R.drawable.plt_color_29);
images_color[30] = getDrawable(R.drawable.plt_color_30);
images_color[31] = getDrawable(R.drawable.plt_color_31);
images_color[32] = getDrawable(R.drawable.plt_color_32);
images_color[33] = getDrawable(R.drawable.plt_color_33);
images_color[34] = getDrawable(R.drawable.plt_color_34);
images_color[35] = getDrawable(R.drawable.plt_color_35);
images_color[36] = getDrawable(R.drawable.plt_color_36);
images_color[37] = getDrawable(R.drawable.plt_color_37);
images_color[38] = getDrawable(R.drawable.plt_color_38);
images_color[39] = getDrawable(R.drawable.plt_color_39);
images_color[40] = getDrawable(R.drawable.plt_color_40);
images_color[41] = getDrawable(R.drawable.plt_color_41);
images_color[42] = getDrawable(R.drawable.plt_color_42);
images_color[43] = getDrawable(R.drawable.plt_color_43);
images_color[44] = getDrawable(R.drawable.plt_color_44);
images_color[45] = getDrawable(R.drawable.plt_color_45);
images_color[46] = getDrawable(R.drawable.plt_color_45);
images_composition[1] = getDrawable(R.drawable.plt_composition_1);
images_composition[2] = getDrawable(R.drawable.plt_composition_2);
images_composition[3] = getDrawable(R.drawable.plt_composition_3);
images_composition[4] = getDrawable(R.drawable.plt_composition_4);
images_composition[5] = getDrawable(R.drawable.plt_composition_5);
images_composition[6] = getDrawable(R.drawable.plt_composition_6);
images_composition[7] = getDrawable(R.drawable.plt_composition_7);
images_composition[8] = getDrawable(R.drawable.plt_composition_8);
images_composition[9] = getDrawable(R.drawable.plt_composition_9);
images_composition[10] = getDrawable(R.drawable.plt_composition_10);
/*
images_composition[11] = getDrawable(R.drawable.plt_composition_11);
images_composition[12] = getDrawable(R.drawable.plt_composition_12);
images_composition[13] = getDrawable(R.drawable.plt_composition_13);
images_composition[14] = getDrawable(R.drawable.plt_composition_14);
images_composition[15] = getDrawable(R.drawable.plt_composition_15);
images_composition[16] = getDrawable(R.drawable.plt_composition_16);
images_composition[17] = getDrawable(R.drawable.plt_composition_17);
images_composition[18] = getDrawable(R.drawable.plt_composition_18);
images_composition[19] = getDrawable(R.drawable.plt_composition_19);
images_composition[20] = getDrawable(R.drawable.plt_composition_20);
images_composition[21] = getDrawable(R.drawable.plt_composition_21);
images_composition[22] = getDrawable(R.drawable.plt_composition_22);
images_composition[23] = getDrawable(R.drawable.plt_composition_23);
images_composition[24] = getDrawable(R.drawable.plt_composition_24);
images_composition[25] = getDrawable(R.drawable.plt_composition_25);
images_composition[26] = getDrawable(R.drawable.plt_composition_26);
images_composition[27] = getDrawable(R.drawable.plt_composition_27);
images_composition[28] = getDrawable(R.drawable.plt_composition_28);
images_composition[29] = getDrawable(R.drawable.plt_composition_29);
images_composition[30] = getDrawable(R.drawable.plt_composition_30);
images_composition[31] = getDrawable(R.drawable.plt_composition_31);
images_composition[32] = getDrawable(R.drawable.plt_composition_32);
images_composition[33] = getDrawable(R.drawable.plt_composition_33);
images_composition[34] = getDrawable(R.drawable.plt_composition_34);
images_composition[35] = getDrawable(R.drawable.plt_composition_35);
images_composition[36] = getDrawable(R.drawable.plt_composition_36);
images_composition[37] = getDrawable(R.drawable.plt_composition_37);
images_composition[38] = getDrawable(R.drawable.plt_composition_38);
images_composition[39] = getDrawable(R.drawable.plt_composition_39);
images_composition[40] = getDrawable(R.drawable.plt_composition_40);
images_composition[41] = getDrawable(R.drawable.plt_composition_41);
images_composition[42] = getDrawable(R.drawable.plt_composition_42);
images_composition[43] = getDrawable(R.drawable.plt_composition_43);
images_composition[44] = getDrawable(R.drawable.plt_composition_44);
images_composition[45] = getDrawable(R.drawable.plt_composition_45);
images_composition[46] = getDrawable(R.drawable.plt_composition_46);
*/
images_light[1] = getDrawable(R.drawable.plt_light_1);
images_light[2] = getDrawable(R.drawable.plt_light_2);
images_light[3] = getDrawable(R.drawable.plt_light_3);
images_light[4] = getDrawable(R.drawable.plt_light_4);
images_light[5] = getDrawable(R.drawable.plt_light_5);
images_light[6] = getDrawable(R.drawable.plt_light_6);
images_light[7] = getDrawable(R.drawable.plt_light_7);
images_light[8] = getDrawable(R.drawable.plt_light_8);
images_light[9] = getDrawable(R.drawable.plt_light_9);
images_light[10] = getDrawable(R.drawable.plt_light_10);
images_light[11] = getDrawable(R.drawable.plt_light_11);
images_light[12] = getDrawable(R.drawable.plt_light_12);
images_light[13] = getDrawable(R.drawable.plt_light_13);
images_light[14] = getDrawable(R.drawable.plt_light_14);
images_light[15] = getDrawable(R.drawable.plt_light_15);
images_light[16] = getDrawable(R.drawable.plt_light_16);
images_light[17] = getDrawable(R.drawable.plt_light_17);
images_light[18] = getDrawable(R.drawable.plt_light_18);
images_light[19] = getDrawable(R.drawable.plt_light_19);
images_light[20] = getDrawable(R.drawable.plt_light_20);
images_light[21] = getDrawable(R.drawable.plt_light_21);
images_light[22] = getDrawable(R.drawable.plt_light_22);
images_light[23] = getDrawable(R.drawable.plt_light_23);
images_light[24] = getDrawable(R.drawable.plt_light_24);
images_light[25] = getDrawable(R.drawable.plt_light_25);
images_light[26] = getDrawable(R.drawable.plt_light_26);
images_light[27] = getDrawable(R.drawable.plt_light_27);
images_light[28] = getDrawable(R.drawable.plt_light_28);
images_light[29] = getDrawable(R.drawable.plt_light_29);
images_light[30] = getDrawable(R.drawable.plt_light_30);
images_light[31] = getDrawable(R.drawable.plt_light_31);
images_light[32] = getDrawable(R.drawable.plt_light_32);
images_light[33] = getDrawable(R.drawable.plt_light_33);
images_light[34] = getDrawable(R.drawable.plt_light_34);
images_light[35] = getDrawable(R.drawable.plt_light_35);
images_light[36] = getDrawable(R.drawable.plt_light_36);
images_light[37] = getDrawable(R.drawable.plt_light_37);
images_light[38] = getDrawable(R.drawable.plt_light_38);
images_light[39] = getDrawable(R.drawable.plt_light_39);
images_light[40] = getDrawable(R.drawable.plt_light_40);
images_light[41] = getDrawable(R.drawable.plt_light_41);
images_light[42] = getDrawable(R.drawable.plt_light_42);
images_light[43] = getDrawable(R.drawable.plt_light_43);
images_light[44] = getDrawable(R.drawable.plt_light_44);
images_light[45] = getDrawable(R.drawable.plt_light_45);
images_light[46] = getDrawable(R.drawable.plt_light_45);
// getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//取消横屏
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //强制手机竖屏
}
viewFinder = findViewById(R.id.viewFinder);
// Toast.makeText(this, "软著权归AI导师主创团队所有", Toast.LENGTH_SHORT).show();
// 请求相机权限
if (allPermissionsGranted()) {
startCamera();
} else {
ActivityCompat.requestPermissions(this, Configurations.REQUIRED_PERMISSIONS,
Configurations.REQUEST_CODE_PERMISSIONS);
}
// 设置拍照按钮监听
Button camera_capture_button = findViewById(R.id.camera_capture_button);
camera_capture_button.setOnClickListener(v -> takePhoto());
// 设置照片等保存的位置
outputDirectory = getOutputDirectory();
cameraExecutor = Executors.newSingleThreadExecutor();
/*
Bitmap bitmap = null;
Module module = null;
try {
// creating bitmap from packaged into app android asset 'image.jpg',
// app/src/main/assets/image.jpg
bitmap = BitmapFactory.decodeStream(getAssets().open("image.jpg"));
//bitmap = zoomImg(bitmap,380,380);
// loading serialized torchscript module from packaged into app android asset model.pt,
// app/src/model/assets/model.pt
module = LiteModuleLoader.load(assetFilePath(this, "model-b4.pt"));
} catch (IOException e) {
Log.e("PytorchHelloWorld", "Error reading assets", e);
finish();
}
// showing image on UI
//ImageView imageView = findViewById(R.id.image);
//imageView.setImageBitmap(bitmap);
// preparing input tensor
final Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap,
TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB, MemoryFormat.CHANNELS_LAST);
// running the model
final IValue[] output = module.forward(IValue.from(inputTensor)).toTuple() ;
Tensor output0 = output[0].toTensor();
Tensor output1 = output[1].toTensor();
Tensor output2 = output[2].toTensor();
Tensor output3 = output[3].toTensor();
Tensor output4 = output[4].toTensor();
Tensor output5 = output[5].toTensor();
float[] scores2 = output2.getDataAsFloatArray();
float[] scores3 = output3.getDataAsFloatArray();
float[] scores4 = output4.getDataAsFloatArray();
float[] scores5 = output5.getDataAsFloatArray();
float score = scores5[0];
float light = scores2[0];
float color= scores3[0];
float composition= scores4[0];
//double a = output0.toDouble();
// getting tensor content as java array of floats
//final float[] scores = outputTensor.getDataAsFloatArray();
// searching for the index with maximum score
float maxScore = -Float.MAX_VALUE;
int maxScoreIdx = -1;
//double a = output0[0].toDouble();
// showing className on UI
TextView textView = findViewById(R.id.text);
//textView.setText(output.toString());
textView.setText("light:"+Float.toString(light)+"\ncolor:"+Float.toString(color)+"\ncomposition:"+Float.toString(composition)+"\nscore:"+Float.toString(score));
*/
/*
RadarChart rc = findViewById(R.id.chart1);
ArrayList list = new ArrayList<>();
list.add(new RadarEntry(light));
list.add(new RadarEntry(color));
list.add(new RadarEntry(composition));
RadarDataSet radarDataSet=new RadarDataSet(list,"Aesthetic_Dashboard");
RadarData radarData=new RadarData(radarDataSet);
rc.setData(radarData);
//设置X轴
XAxis xAxis = rc.getXAxis();
xAxis.setLabelCount(3);
xAxis.setTextSize(9f);
xAxis.setYOffset(0f);
xAxis.setXOffset(0f);
xAxis.setTextColor(Color.WHITE);
//Y轴最小值不设置会导致数据中最小值默认成为Y轴最小值
rc.getYAxis().setAxisMinimum(0);
*/
changePreviewLayoutParams(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
}
private void changePreviewLayoutParams(boolean isVertical) {
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) viewFinder.getLayoutParams();
if (isVertical) {
layoutParams.height = (int) (getScreenWidth() * 4 / 3f);
} else {
layoutParams.width = (int) (getScreenHeight() * 4 / 3f);
Log.d("tyson", "width == " + layoutParams.width);
}
viewFinder.setLayoutParams(layoutParams);
}
private int getScreenWidth() {
// 获取屏幕宽度
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int screenWidth = displayMetrics.widthPixels;
return screenWidth;
}
private int getScreenHeight() {
// 获取屏幕宽度
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int screenHeight = displayMetrics.heightPixels;
return screenHeight;
}
@Override
public void onPause() {
super.onPause();
}
//缩放函数
/*
public Bitmap zoomImg(Bitmap bm, int newWidth, int newHeight) {
// 获得图片的宽高
int width = bm.getWidth();
int height = bm.getHeight();
// 计算缩放比例
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 取得想要缩放的matrix参数
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
return newbm;
}
*/
private void takePhoto() {
// 确保imageCapture 已经被实例化, 否则程序将可能崩溃
if (imageCapture != null) {
// 创建带时间戳的输出文件以保存图片,带时间戳是为了保证文件名唯一
// String imageName = new SimpleDateFormat(Configurations.FILENAME_FORMAT, Locale.SIMPLIFIED_CHINESE)
// .format(System.currentTimeMillis()) + ".jpg";
//
// File photoFile = new File(outputDirectory, imageName);
String imageName = System.currentTimeMillis() + ".png";
File photoFile = new File(outputDirectory,
new SimpleDateFormat(Configurations.FILENAME_FORMAT,
Locale.SIMPLIFIED_CHINESE).format(System.currentTimeMillis())
+ ".jpg");
// 创建 output option 对象,用以指定照片的输出方式
ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions
.Builder(photoFile)
.build();
// 执行takePicture(拍照)方法
imageCapture.takePicture(outputFileOptions,
ContextCompat.getMainExecutor(this),
new ImageCapture.OnImageSavedCallback() {// 保存照片时的回调
@Override
public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
//Uri savedUri = Uri.fromFile(photoFile);
//String msg = "照片捕获成功! " + savedUri;
//Toast.makeText(getBaseContext(), msg, Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "照片已保存", Toast.LENGTH_SHORT).show();
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(new File(photoFile.getPath()))));
}
@Override
public void onError(@NonNull ImageCaptureException exception) {
Log.e(Configurations.TAG, "Photo capture failed: " + exception.getMessage());
}
});
}
}
private void startCamera() {
// 将Camera的生命周期和Activity绑定在一起(设定生命周期所有者),这样就不用手动控制相机的启动和关闭。
ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
realTimeOpts =
new FaceDetectorOptions.Builder()
.setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL)
.build();
cameraProviderFuture.addListener(() -> {
try {
// 将你的相机和当前生命周期的所有者绑定所需的对象
processCameraProvider = cameraProviderFuture.get();
//ProcessCameraProvider cameraProvider =(ProcessCameraProvider) cameraProviderFuture.get();
final ListenableFuture extensionsManagerFuture =
ExtensionsManager.getInstanceAsync(getApplicationContext(), processCameraProvider);
//ListenableFuture extensionsManagerFuture=ExtensionsManager.getInstance();
extensionsManagerFuture.addListener(() -> {
try {
ExtensionsManager extensionsManager=ExtensionsManager.getInstanceAsync(getApplicationContext(), processCameraProvider).get();
cameraSelector = (camera_len == true) ? CameraSelector.DEFAULT_BACK_CAMERA : CameraSelector.DEFAULT_FRONT_CAMERA;
//if (!extensionsManager.isExtensionAvailable(cameraSelector, ExtensionMode.HDR)) {
// Toast.makeText(this,"123", Toast.LENGTH_SHORT).show();
//}
//CameraSelector nightCameraselector=extensionsManager.getExtensionEnabledCameraSelector(cameraSelector, ExtensionMode.NIGHT);
// 创建一个Preview 实例,并设置该实例的 surface 提供者(provider)
preview = new Preview.Builder().setTargetAspectRatio(AspectRatio.RATIO_4_3).build();
preview.setSurfaceProvider(viewFinder.getSurfaceProvider());
imageCapture = new ImageCapture.Builder().setTargetAspectRatio(AspectRatio.RATIO_4_3).setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY).build();
// 创建拍照所需的实例
ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
//mCameraCharacteristics = mCameraManager.getCameraCharacteristics(viewFinder.toString());
@SuppressLint("UnsafeOptInUsageError")
@androidx.camera.camera2.interop.ExperimentalCamera2Interop
Camera2Interop.Extender ext = new Camera2Interop.Extender<>(builder);
//
// if (camera_flash==true){
// ext.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// ext.setCaptureRequestOption(CaptureRequest.FLASH_MODE,CaptureRequest.FLASH_MODE_OFF);
// }
//
// if (camera_exposure == false) {
// ext.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
// ext.setCaptureRequestOption(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_OFF);
// }
// //ext.setCaptureRequestOption(CaptureRequest.SENSOR_EXPOSURE_TIME,5000000);
// //Range<Long>range =mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE);
// //long maxmax=range.getUpper(),minmin=range.getLower();
// //Log.d("fuck",String.valueOf(maxmax));
// //Toast.makeText(this,String.valueOf(maxmax), Toast.LENGTH_SHORT).show();
// //Range<Long>range =CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE
//
// //ON为自动曝光,OFF为手动设定曝光度,可以修改ISO、光圈、快门
// ext.setCaptureRequestOption(CaptureRequest.CONTROL_AWB_MODE,camera_white_balance);//修改白平衡
//
// ext.setCaptureRequestOption(CaptureRequest.NOISE_REDUCTION_MODE,camera_noise);//修改降噪模式
//
// ext.setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE,camera_focus);
// //Range<Long>range =CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE;
// //long maxmax=range.getUpper(),minmin=range.getLower();
// //String maxmax=CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE.toString();
// //Toast.makeText(this, maxmax, Toast.LENGTH_SHORT).show();
// //if (camera_exposure==false) ext.setCaptureRequestOption(CaptureRequest.LENS_APERTURE,null);//修改光圈大小
// //LENS_INFO_AVAILABLE_APERTURES设置光圈
//
//
// //ext.setCaptureRequestOption(CaptureRequest.SENSOR_SENSITIVITY,100);
// //ext.setCaptureRequestOption(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION,-10);//修改曝光补偿
//
// //ext.setCaptureRequestOption(CaptureRequest.NOISE_REDUCTION_MODE,CaptureRequest.NOISE_REDUCTION_MODE_FAST);
//
//
// ext.setCaptureRequestOption(CaptureRequest.CONTROL_EFFECT_MODE,CONTROL_EFFECT_MODE_WHITEBOARD);
//
// //ext.setCaptureRequestOption(CaptureRequest.CONTROL_EFFECT_MODE,CameraMetadata.CONTROL_EFFECT_MODE_SEPIA);
// ext.setCaptureRequestOption(CaptureRequest.CONTROL_SCENE_MODE,camera_scene);
//
//
// ext.setCaptureRequestOption(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE,LENS_OPTICAL_STABILIZATION_MODE_ON);
//
//
//
// //ext.setCaptureRequestOption(CaptureRequest.SENSOR_EXPOSURE_TIME,Long.valueOf("100000"));//设置快门
//
// //ext.setCaptureRequestOption(CaptureRequest.SENSOR_SENSITIVITY,Long.valueOf("100000"));//设置感光度
//
// ext.setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<Integer>(25, 25));
ImageView radarview = findViewById(R.id.radar);
Bitmap newb = Bitmap.createBitmap(250, 250, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(newb);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth((float) 0.5);
canvas.drawCircle(125, 125, 12, paint);
canvas.drawCircle(125, 125, 24, paint);
canvas.drawCircle(125, 125, 36, paint);
canvas.drawCircle(125, 125, 48, paint);
radarview.setImageBitmap(newb);
imageAnalysis = builder.build();
// 设置预览帧分析
//ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();
imageAnalysis.setAnalyzer(cameraExecutor, new MyAnalyzer());
// 重新绑定用例前先解绑
processCameraProvider.unbindAll();
// 绑定用例至相机
camera = processCameraProvider.bindToLifecycle(MainActivity.this, cameraSelector,
preview,
imageCapture,
imageAnalysis);
camera.getCameraControl().setLinearZoom(0f);
CameraInfo = camera.getCameraInfo();
//camera.getCameraControl().enableTorch(camera_torch);
CameraControl = camera.getCameraControl();
zoomState = CameraInfo.getZoomState();
maxZoomRatio = zoomState.getValue().getMaxZoomRatio();
minZoomRatio = zoomState.getValue().getMinZoomRatio();
viewFinder.setOnTouchListener(new View.OnTouchListener() {
float lastdistance = -1.0f;
public void click(float x, float y) {
Toast.makeText(MainActivity.this, "点击", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onTouch(View view, MotionEvent event) {
//绑定控件
Canvas canvas = new Canvas();//canvas画画的画布(bitmap)要求可修改,不可以直接在原图上画,要做一个复制,在复制上画好了再加载进去
Paint paint = new Paint();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (event.getPointerCount() == 1) {
if (toast == null) {
toast = Toast.makeText(getApplicationContext(), "已对焦",
Toast.LENGTH_SHORT);
} else {
toast.setText("已对焦");
}
toast.setGravity(Gravity.BOTTOM, -100, -200);
toast.show();
float x = event.getX(), y = event.getY();
// 1.0.0-beta08 createMeteringPointFactory()方法已删除,Demo改为使用getMeteringPointFactory()
MeteringPointFactory factory = viewFinder.getMeteringPointFactory();//viewFinder.createMeteringPointFactory(CameraSelector);
MeteringPoint point = factory.createPoint(x, y);
FocusMeteringAction action = new FocusMeteringAction.Builder(point, FocusMeteringAction.FLAG_AF)
// auto calling cancelFocusAndMetering in 3 seconds
.setAutoCancelDuration(3, TimeUnit.SECONDS)
.build();
camera.getCameraControl().startFocusAndMetering(action);
}
break;
case MotionEvent.ACTION_UP:
//Toast.makeText(MainActivity.this, "抬起", Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_MOVE:
//Toast.makeText(MainActivity.this, "移动", Toast.LENGTH_SHORT).show();
if (event.getPointerCount() >= 2) {
toast.setGravity(Gravity.BOTTOM, -100, -200);
toast.show();
float offsetX = event.getX(0) - event.getX(1);//监听手机的PointerCount数量大于2时,获得两个点的坐标
float offsetY = event.getY(0) - event.getY(1);
float currentdistance = (float) Math.sqrt(offsetX * offsetX + offsetY * offsetY);
if (lastdistance < 0) {
lastdistance = currentdistance;
} else {
if (currentdistance - lastdistance > 5) {//像素改变大于5是为了容错的存在
float zoomRatio = zoomState.getValue().getZoomRatio();
int t = (int) (zoomRatio * 100);
if (toast == null) {
toast = Toast.makeText(getApplicationContext(), String.format("%d", t) + "%界面",
Toast.LENGTH_SHORT);
} else {
toast.setText(String.format("%d", t) + "%界面");
}
if (zoomRatio < maxZoomRatio) {
CameraControl.setZoomRatio((float) (zoomRatio + 0.2));
}
} else if (lastdistance - currentdistance > 5) {
float zoomRatio = zoomState.getValue().getZoomRatio();
if (zoomRatio > minZoomRatio) {
CameraControl.setZoomRatio((float) (zoomRatio - 0.2));
}
}
}
lastdistance = currentdistance;
}
break;
}
return true;
}
});
//}
}catch (ExecutionException|InterruptedException e){
throw new RuntimeException(e);
}
}, ContextCompat.getMainExecutor(this));
} catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
}, ContextCompat.getMainExecutor(this));
}
public void button_bar(View view){
if (findViewById(R.id.textView1).getVisibility()==View.INVISIBLE){
findViewById(R.id.textView1).setVisibility(View.VISIBLE);
findViewById(R.id.bar_hor).setVisibility(View.VISIBLE);
findViewById(R.id.imageView1).setVisibility(View.VISIBLE);
}
else{
findViewById(R.id.textView1).setVisibility(View.INVISIBLE);
findViewById(R.id.bar_hor).setVisibility(View.INVISIBLE);
findViewById(R.id.imageView1).setVisibility(View.INVISIBLE);
}
}
public void button_radar(View view){
if (findViewById(R.id.radar).getVisibility()==View.INVISIBLE){
findViewById(R.id.rc).setVisibility(View.VISIBLE);
findViewById(R.id.radar).setVisibility(View.VISIBLE);
}
else{
findViewById(R.id.rc).setVisibility(View.INVISIBLE);
findViewById(R.id.radar).setVisibility(View.INVISIBLE);
}
}
public void button_finish(View view) {
if ((System.currentTimeMillis() - mExitTime) > 2000) {
Toast.makeText(this, "再按一次退出AI导师", Toast.LENGTH_SHORT).show();
mExitTime = System.currentTimeMillis();
} else {
finish();
}
}
public void button_light(View view) {
if (findViewById(R.id.text_light1).getVisibility()==View.INVISIBLE){
findViewById(R.id.text_light1).setVisibility(View.VISIBLE);
findViewById(R.id.text_light2).setVisibility(View.VISIBLE);
findViewById(R.id.image_light).setVisibility(View.VISIBLE);
}
else{
findViewById(R.id.text_light1).setVisibility(View.INVISIBLE);
findViewById(R.id.text_light2).setVisibility(View.INVISIBLE);
findViewById(R.id.image_light).setVisibility(View.INVISIBLE);
}
}
public void button_camera(View view) {
camera_len=!camera_len;
startCamera();
}
public void button_album(View view) {
handler.post(new Runnable() {
@Override
public void run() {
//onPause();
//Intent intent = new Intent(Intent.ACTION_PICK, null);
//intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
//startActivityForResult(intent, 2);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("vnd.android.cursor.dir/image");
startActivity(intent);
}
});
}
public void button_color(View view) {
if (findViewById(R.id.text_color1).getVisibility()==View.INVISIBLE){
findViewById(R.id.text_color1).setVisibility(View.VISIBLE);
findViewById(R.id.text_color2).setVisibility(View.VISIBLE);
findViewById(R.id.image_color).setVisibility(View.VISIBLE);
}
else{
findViewById(R.id.text_color1).setVisibility(View.INVISIBLE);
findViewById(R.id.text_color2).setVisibility(View.INVISIBLE);
findViewById(R.id.image_color).setVisibility(View.INVISIBLE);
}
}
public void button_composition(View view) {
if (findViewById(R.id.image_composition).getVisibility()==View.INVISIBLE){
findViewById(R.id.image_composition).setVisibility(View.VISIBLE);
}
else{
findViewById(R.id.image_composition).setVisibility(View.INVISIBLE);
}
}
public void btn_recommend(View view) {
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
startActivity(intent);
}
public void btn_torch(View view) {
camera_torch=!camera_torch;
if (camera_torch==false)
Toast.makeText(this, "关闭补光", Toast.LENGTH_SHORT).show();
else Toast.makeText(this, "打开补光", Toast.LENGTH_SHORT).show();
camera.getCameraControl().enableTorch(camera_torch);
findViewById(R.id.frame6).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
}
public void btn_flash(View view) {
camera_flash=!camera_flash;
if (camera_flash==false) {
Toast.makeText(this, "关闭闪光", Toast.LENGTH_SHORT).show();
imageCapture.setFlashMode(ImageCapture.FLASH_MODE_OFF);
}
else{
Toast.makeText(this, "打开闪光", Toast.LENGTH_SHORT).show();
imageCapture.setFlashMode(ImageCapture.FLASH_MODE_ON);
}
findViewById(R.id.frame6).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
//if (camera_flash==true)
}
public void btn_white_balance(View view) {
Toast.makeText(this, "请选择白平衡模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame6).setVisibility(View.INVISIBLE);
findViewById(R.id.frame2).setVisibility(View.VISIBLE);
//startCamera();
}
public void btn_aperture(View view) {
Toast.makeText(this, "开通VIP会员,体验光圈功能!", Toast.LENGTH_SHORT).show();
}
public void btn_exposure(View view) {
camera_exposure=!camera_exposure;
if (camera_exposure==false) {
Toast.makeText(this, "手动曝光", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(this, "自动曝光", Toast.LENGTH_SHORT).show();
}
startCamera();
findViewById(R.id.frame6).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
}
public void btn_noise(View view) {
Toast.makeText(this, "请选择降噪模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame5).setVisibility(View.INVISIBLE);
findViewById(R.id.frame3).setVisibility(View.VISIBLE);
}
public void btn_ISO(View view) {
Toast.makeText(this, "开通VIP会员,体验感光度功能!", Toast.LENGTH_SHORT).show();
}
public void btn_exposure_compensation(View view) {
Toast.makeText(this, "开通VIP会员,体验快门功能!", Toast.LENGTH_SHORT).show();
}
public void btn_anti_scintillation(View view) {
Toast.makeText(this, "开通VIP会员,体验抗闪烁功能!", Toast.LENGTH_SHORT).show();
}
public void btn_setting(View view) {
findViewById(R.id.frame1).setVisibility(View.INVISIBLE);
findViewById(R.id.frame7).setVisibility(View.VISIBLE);
}
public void btn_balance_off(View view) {
Toast.makeText(this, "关闭白平衡", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_white_balance!=0){
camera_white_balance=0;
startCamera();
}
}
public void btn_balance_fluorescent(View view) {
Toast.makeText(this, "打开荧光灯模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_white_balance!=2){
camera_white_balance=2;
startCamera();
}
}
public void btn_balance_warm_fluorescent(View view) {
Toast.makeText(this, "打开暖荧光模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_white_balance!=3){
camera_white_balance=3;
startCamera();
}
}
public void btn_balance_daylight(View view) {
Toast.makeText(this, "打开日光灯模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_white_balance!=4){
camera_white_balance=4;
startCamera();
}
}
public void btn_balance_cloudy_daylight(View view) {
Toast.makeText(this, "打开多云天气模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_white_balance!=5){
camera_white_balance=5;
startCamera();
}
}
public void btn_balance_twilight(View view) {
Toast.makeText(this, "打开黄昏模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_white_balance!=6){
camera_white_balance=6;
startCamera();
}
}
public void btn_balance_return(View view) {
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame6).setVisibility(View.VISIBLE);
}
public void btn_balance_diy(View view) {
Toast.makeText(this, "请先开通VIP会员", Toast.LENGTH_SHORT).show();
}
public void btn_balance_shade(View view) {
Toast.makeText(this, "打开阴影光模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_white_balance!=7){
camera_white_balance=7;
startCamera();
}
}
public void btn_balance_auto(View view) {
Toast.makeText(this, "打开自动化白平衡模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame2).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_white_balance!=1){
camera_white_balance=1;
startCamera();
}
}
public void btn_face(View view) {
camera_face=!camera_face;
if (camera_face==false) {
Toast.makeText(this, "关闭人脸识别", Toast.LENGTH_SHORT).show();
findViewById(R.id.viewFinder).setVisibility(View.INVISIBLE);
}
else{
Toast.makeText(this, "打开人脸识别", Toast.LENGTH_SHORT).show();
findViewById(R.id.viewFinder).setVisibility(View.VISIBLE);
}
}
public void btn_noise_off(View view) {
Toast.makeText(this, "关闭降噪", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame3).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_noise!=0){
camera_noise=0;
startCamera();
}
}
public void btn_noise_fast(View view) {
Toast.makeText(this, "打开快速降噪", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame3).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_noise!=1){
camera_noise=1;
startCamera();
}
}
public void btn_noise_quality(View view) {
Toast.makeText(this, "打开高质降噪", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame3).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_noise!=2){
camera_noise=2;
startCamera();
}
}
public void btn_noise_minimal(View view) {
Toast.makeText(this, "打开最小降噪", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame3).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_noise!=3){
camera_noise=3;
startCamera();
}
}
public void btn_noise_return(View view) {
findViewById(R.id.frame3).setVisibility(View.INVISIBLE);
findViewById(R.id.frame5).setVisibility(View.VISIBLE);
}
public void btn_focus(View view) {
Toast.makeText(this, "请选择对焦模式", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame6).setVisibility(View.INVISIBLE);
findViewById(R.id.frame4).setVisibility(View.VISIBLE);
}
public void btn_focus_off(View view) {
Toast.makeText(this, "关闭对焦", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame4).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_focus!=0){
camera_focus=0;
startCamera();
}
}
public void btn_focus_auto(View view) {
Toast.makeText(this, "自动对焦", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame4).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_focus!=1){
camera_focus=1;
startCamera();
}
}
public void btn_focus_macro(View view) {
Toast.makeText(this, "微距对焦", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame4).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_focus!=2){
camera_focus=2;
startCamera();
}
}
public void btn_focus_continuous(View view) {
Toast.makeText(this, "连续对焦", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame4).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_focus!=4){
camera_focus=4;
startCamera();
}
}
public void btn_focus_EDOF(View view) {
Toast.makeText(this, "数字对焦", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame4).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_focus!=5){
camera_focus=5;
startCamera();
}
}
public void btn_focus_return(View view) {
findViewById(R.id.frame4).setVisibility(View.INVISIBLE);
findViewById(R.id.frame6).setVisibility(View.VISIBLE);
}
public void btn_professional(View view) {
findViewById(R.id.frame1).setVisibility(View.INVISIBLE);
findViewById(R.id.frame5).setVisibility(View.VISIBLE);
}
public void btn_professional_return(View view) {
findViewById(R.id.frame5).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
}
public void btn_light_return(View view) {
findViewById(R.id.frame6).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
}
public void btn_light(View view) {
findViewById(R.id.frame1).setVisibility(View.INVISIBLE);
findViewById(R.id.frame6).setVisibility(View.VISIBLE);
}
public void btn_scene_return(View view) {
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
}
public void btn_scene_action(View view) {
Toast.makeText(this, "启用快速移动优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=2){
camera_scene=2;
startCamera();
}
}
public void btn_scene_close(View view) {
Toast.makeText(this, "关闭AI智能优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=0){
camera_scene=0;
startCamera();
}
}
public void btn_scene_beach(View view) {
Toast.makeText(this, "启用户外海滩优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=8){
camera_scene=8;
startCamera();
}
}
public void btn_scene_candlelight(View view) {
Toast.makeText(this, "启用昏暗焰光优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=15){
camera_scene=15;
startCamera();
}
}
public void btn_scene_face(View view) {
Toast.makeText(this, "启用面部优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=1){
camera_scene=1;
startCamera();
}
}
public void btn_scene_firework(View view) {
Toast.makeText(this, "启用夜晚焰火优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=12){
camera_scene=12;
startCamera();
}
}
public void btn_scene_HDR(View view) {
Toast.makeText(this, "启用HDR优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=18){
camera_scene=18;
startCamera();
}
}
public void btn_scene_landscape(View view) {
Toast.makeText(this, "启用远处景物优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=4){
camera_scene=4;
startCamera();
}
}
public void btn_scene_night(View view) {
Toast.makeText(this, "启用夜拍景物优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=5){
camera_scene=5;
startCamera();
}
}
public void btn_scene_night_portrait(View view) {
Toast.makeText(this, "启用夜拍人物优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=6){
camera_scene=6;
startCamera();
}
}
public void btn_scene_snow(View view) {
Toast.makeText(this, "启用明亮雪景优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=9){
camera_scene=9;
startCamera();
}
}
public void btn_scene_sport(View view) {
Toast.makeText(this, "启用运动抓拍优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=13){
camera_scene=13;
startCamera();
}
}
public void btn_scene_stead(View view) {
Toast.makeText(this, "启用抗扰动优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=11){
camera_scene=11;
startCamera();
}
}
public void btn_scene_sunset(View view) {
Toast.makeText(this, "启用落日场景优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=10){
camera_scene=10;
startCamera();
}
}
public void btn_scene_theatre(View view) {
Toast.makeText(this, "启用昏暗室内场景优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=7){
camera_scene=7;
startCamera();
}
}
public void btn_scene_party(View view) {
Toast.makeText(this, "启用低光移动优化", Toast.LENGTH_SHORT).show();
findViewById(R.id.frame7).setVisibility(View.INVISIBLE);
findViewById(R.id.frame1).setVisibility(View.VISIBLE);
if (camera_scene!=14){
camera_scene=14;
startCamera();
}
}
public void pq_show(){
}
@Override
public void onResume() {
super.onResume();
//findViewById(R.id.q).setVisibility(View.INVISIBLE);
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
if (pq==0) return;
Toast toastCenter = Toast.makeText(getApplicationContext(),"智能分析中...",Toast.LENGTH_SHORT); //屏幕居中的弹窗
toastCenter.setGravity(Gravity.CENTER,0,0);
toastCenter.show();
timer=new CountDownTimer(3000, 3000){
public void onTick(long millisUntilFinished)
{
toastCenter.show();
}
public void onFinish()
{
toastCenter.cancel();
}
}.start();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int ID = getResources().getIdentifier("q"+String.valueOf(pq),"drawable",getPackageName());
ImageView q=findViewById(R.id.q);
q.setImageResource(ID); //延时执行的代码
findViewById(R.id.q).setVisibility(View.VISIBLE);
}
},3000);// 延时2秒
//findViewById(R.id.q7).setVisibility(View.VISIBLE);
}
static CountDownTimer timer =null;
/**
* 自定义Analyzer类, 实现ImageAnalysis.Analyzer接口
* anylyze()是每一帧画面的回调函数
*/
private class MyThread2 extends Thread {
private int ticket = 100;//一个窗口有100张票
private String name; //窗口名, 也即是线程的名字
public MyThread2(String name) {
this.name = name;
}
}
private class MyAnalyzer implements ImageAnalysis.Analyzer{
public static final String INTENT_MODULE_ASSET_NAME = "INTENT_MODULE_ASSET_NAME";
public static final String INTENT_INFO_VIEW_TYPE = "INTENT_INFO_VIEW_TYPE";
private static final int INPUT_TENSOR_WIDTH = 380;
private static final int INPUT_TENSOR_HEIGHT = 380;
private static final int TOP_K = 3;
private static final int MOVING_AVG_PERIOD = 10;
private static final String FORMAT_MS = "%dms";
private static final String FORMAT_AVG_MS = "avg:%.0fms";
private static final String FORMAT_FPS = "%.1fFPS";
public static final String SCORES_FORMAT = "%.2f";
private boolean mAnalyzeImageErrorState;
private TextView mFpsText;
private TextView mMsText;
private TextView mMsAvgText;
private Module mModule;
private String mModuleAssetName;
private FloatBuffer mInputTensorBuffer;
private Tensor mInputTensor;
private HorizontalBarChart barHor;
private int rotationDegrees;
private TextView scoreview=findViewById(R.id.textView1);
private TextView textView_light1 = findViewById(R.id.text_light1);
private TextView textView_light2 = findViewById(R.id.text_light2);
private TextView textView_color1 = findViewById(R.id.text_color1);
private TextView textView_color2 = findViewById(R.id.text_color2);
@RequiresApi(Build.VERSION_CODES.KITKAT)
private ByteBuffer yuv420ThreePlanesToNV21(
Image.Plane[] yuv420888planes, int width, int height) {
int imageSize = width * height;
byte[] out = new byte[imageSize + 2 * (imageSize / 4)];
if (areUVPlanesNV21(yuv420888planes, width, height)) {
// 复制 Y 的值
yuv420888planes[0].getBuffer().get(out, 0, imageSize);
// 从 V 缓冲区获取第一个 V 值,因为 U 缓冲区不包含它。
yuv420888planes[2].getBuffer().get(out, imageSize, 1);
// 从 U 缓冲区复制第一个 U 值和剩余的 VU 值。
yuv420888planes[1].getBuffer().get(out, imageSize + 1, 2 * imageSize / 4 - 1);
} else {
// 回退到一个一个地复制 UV 值,这更慢但也有效。
// 取 Y.
unpackPlane(yuv420888planes[0], width, height, out, 0, 1);
// 取 U.
unpackPlane(yuv420888planes[1], width, height, out, imageSize + 1, 2);
// 取 V.
unpackPlane(yuv420888planes[2], width, height, out, imageSize, 2);
}
return ByteBuffer.wrap(out);
}
/**
* 检查 YUV_420_888 图像的 UV 平面缓冲区是否为 NV21 格式。
*/
@RequiresApi(Build.VERSION_CODES.KITKAT)
private boolean areUVPlanesNV21(Image.Plane[] planes, int width, int height) {
int imageSize = width * height;
ByteBuffer uBuffer = planes[1].getBuffer();
ByteBuffer vBuffer = planes[2].getBuffer();
// 备份缓冲区属性。
int vBufferPosition = vBuffer.position();
int uBufferLimit = uBuffer.limit();
// 将 V 缓冲区推进 1 个字节,因为 U 缓冲区将不包含第一个 V 值。
vBuffer.position(vBufferPosition + 1);
// 切掉 U 缓冲区的最后一个字节,因为 V 缓冲区将不包含最后一个 U 值。
uBuffer.limit(uBufferLimit - 1);
// 检查缓冲区是否相等并具有预期的元素数量。
boolean areNV21 = (vBuffer.remaining() == (2 * imageSize / 4 - 2)) && (vBuffer.compareTo(uBuffer) == 0);
// 将缓冲区恢复到初始状态。
vBuffer.position(vBufferPosition);
uBuffer.limit(uBufferLimit);
return areNV21;
}
/**
* 将图像平面解压缩为字节数组。
*
* 输入平面数据将被复制到“out”中,从“offset”开始,每个像素将被“pixelStride”隔开。 请注意,输出上没有行填充。
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
private void unpackPlane(Image.Plane plane, int width, int height, byte[] out, int offset, int pixelStride) {
ByteBuffer buffer = plane.getBuffer();
buffer.rewind();
// 计算当前平面的大小。假设它的纵横比与原始图像相同。
int numRow = (buffer.limit() + plane.getRowStride() - 1) / plane.getRowStride();
if (numRow == 0) {
return;
}
int scaleFactor = height / numRow;
int numCol = width / scaleFactor;
// 提取输出缓冲区中的数据。
int outputPos = offset;
int rowStart = 0;
for (int row = 0; row < numRow; row++) {
int inputPos = rowStart;
for (int col = 0; col < numCol; col++) {
out[outputPos] = buffer.get(inputPos);
outputPos += pixelStride;
inputPos += plane.getPixelStride();
}
rowStart += plane.getRowStride();
}
}
@SuppressLint("UnsafeOptInUsageError")
@Override
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
@Nullable
@ExperimentalGetImage
public void analyze(@NonNull ImageProxy image) {
if (camera_face==true){
Image mediaImage = image.getImage();
if (mediaImage != null) {
InputImage image0=InputImage.fromMediaImage(mediaImage, image.getImageInfo().getRotationDegrees());
// Pass image to an ML Kit Vision API
// ...
FaceDetector detector = FaceDetection.getClient();
Task<List<Face>> result =
detector.process(image0)
.addOnSuccessListener(
new OnSuccessListener<List<Face>>() {
@Override
public void onSuccess(List<Face> faces) {
// Task completed successfully
// ...
handler2.post(new Runnable() {
@Override
public void run() {
ImageView radarview = (ImageView) findViewById(R.id.radar2);
Bitmap newb = Bitmap.createBitmap(891, 411, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(newb);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.rgb(0,255,0));
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth((float) 1);
DisplayMetrics metrics = new DisplayMetrics();
MainActivity.this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int mWidth = metrics.widthPixels;//2280
int mHeight = metrics.heightPixels;//1080
for (Face face : faces) {
android.graphics.Rect bounds = face.getBoundingBox();
int left=bounds.left * bounds.width() / mHeight+20;
int top=bounds.top * bounds.width() / mHeight+40;
int right=bounds.right * bounds.height() / mWidth+30;
int bottom=bounds.bottom * bounds.height() / mWidth+75;
canvas.drawRect((int)(600+(bounds.left-600)*1.2+190),(int)(bounds.top-40),(int)(600+(bounds.right-600)*1.2+190),(int)(bounds.bottom-40),paint);
Toast.makeText(MainActivity.this, String.valueOf(bounds.left), Toast.LENGTH_SHORT).show();
}
radarview.setImageBitmap(newb);
}
});
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
}
}
handler.post(new Runnable() {
@Override
public void run() {
// Toast.makeText(MainActivity.this, "123", Toast.LENGTH_SHORT).show();
image_colors=findViewById(R.id.image_color);
image_colors.setImageDrawable(images_color[1+new Random().nextInt(46)]);
image_lights=findViewById(R.id.image_light);
image_lights.setImageDrawable(images_light[1+new Random().nextInt(46)]);
//if (new Random().nextInt(100)>50) return;
image_compositions=findViewById(R.id.image_composition);
image_compositions.setImageDrawable(images_composition[1+new Random().nextInt(10)]);
}
});
rotationDegrees=image.getImageInfo().getRotationDegrees();
// 在这里对每一帧画面进行处理
try {
if (mModule == null) {
mModule = LiteModuleLoader.load(assetFilePath(MainActivity.this, "model-b4.pt"));
mInputTensorBuffer =
Tensor.allocateFloatBuffer(3 * INPUT_TENSOR_WIDTH * INPUT_TENSOR_HEIGHT);
mInputTensor = Tensor.fromBlob(mInputTensorBuffer, new long[]{1, 3, INPUT_TENSOR_HEIGHT, INPUT_TENSOR_WIDTH});
}
TensorImageUtils.imageYUV420CenterCropToFloatBuffer(
image.getImage(), rotationDegrees,
INPUT_TENSOR_WIDTH, INPUT_TENSOR_HEIGHT,
TensorImageUtils.TORCHVISION_NORM_MEAN_RGB,
TensorImageUtils.TORCHVISION_NORM_STD_RGB,
mInputTensorBuffer, 0);
IValue[] output = mModule.forward(IValue.from(mInputTensor)).toTuple() ;
float[] scores2 = output[2].toTensor().getDataAsFloatArray();
float[] scores3 = output[3].toTensor().getDataAsFloatArray();
float[] scores4 = output[4].toTensor().getDataAsFloatArray();
float[] scores5 = output[5].toTensor().getDataAsFloatArray();
float score = Float.parseFloat(String.format("%.2f",(0.5*(10f*scores2[0]+10f*scores3[0]+10f*scores4[0])+0.5*10f*scores5[0])/2));
float light = Float.parseFloat(String.format("%.2f", 10f*scores2[0]));
float color= Float.parseFloat(String.format("%.2f", 10f*scores3[0]));
float composition= Float.parseFloat(String.format("%.2f", 10f*scores4[0]));
//Bitmap bmp = BitmapUtils.getBitmap(image);
ByteBuffer nv21Buffer = yuv420ThreePlanesToNV21(image.getImage().getPlanes(), image.getWidth(), image.getHeight());
int width=image.getWidth(),height=image.getHeight(),rotation=image.getImageInfo().getRotationDegrees();
nv21Buffer.rewind();
byte[] imageInBuffer = new byte[nv21Buffer.limit()];
nv21Buffer.get(imageInBuffer, 0, imageInBuffer.length);
YuvImage image2 = new YuvImage(imageInBuffer, ImageFormat.NV21, width, height, null);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image2.compressToJpeg(new android.graphics.Rect(0, 0, width, height), 80, stream);
Bitmap bmp0 = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
stream.close();
//return rotateBitmap(bmp, rotation, true, false);
Matrix matrix = new Matrix();
matrix.postRotate(rotationDegrees);
matrix.postScale(-1.0f,1.0f);
Bitmap bmp1 = Bitmap.createBitmap(bmp0, 0, 0, bmp0.getWidth(), bmp0.getHeight(), matrix, true);
// 如果旧bitmap已更改,则回收。
bmp0.recycle();
width = bmp1.getWidth();
height = bmp1.getHeight();
// 计算缩放比例
float scaleWidth = ((float) 240) / width;
float scaleHeight = ((float) 320) / height;
// 取得想要缩放的matrix参数
matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap bmp = Bitmap.createBitmap(bmp1, 0, 0, width, height, matrix, true);
bmp1.recycle();
handler0.post(new Runnable() {
@Override
public void run() {
// Mat src =new Mat();//("img_1.jpg");
// Utils.bitmapToMat(bmp,src);
// Mat canny = new Mat();
// Imgproc.Canny(src, canny, 80, 160, 3);
//Imgproc.cvtColor(canny, canny, Imgproc.COLOR_RGB2GRAY);
// Mat lines = new Mat();
// Imgproc.HoughLinesP(canny, lines, 1, Math.PI / 180, 75, 5, 5);
// temp=lines.rows();
// //Toast.makeText(MainActivity.this, String.format("%d",temp), Toast.LENGTH_LONG).show();
// Bitmap newb = Bitmap.createBitmap(891, 411, Bitmap.Config.ARGB_8888);
// Mat src2=new Mat();
// Utils.bitmapToMat(newb,src2);
// //Toast.makeText(MainActivity.this, String.format("%d",temp), Toast.LENGTH_LONG).show();
// for (int i = 0; i < lines.rows(); i++) {
// Point p1 = new Point(691-891/240*lines.get(i, 0)[0],411/320*lines.get(i, 0)[1]);
// Point p2 = new Point(691-891/240*lines.get(i, 0)[2], 411/320*lines.get(i, 0)[3]);
// Imgproc.line(src2, p1, p2, new Scalar(0, 0, 255), 1);
// //canvas.drawLine((float)p1.x,(float)p1.y,(float)p2.x,(float)p2.y,paint);
// }
// Utils.matToBitmap(src2,newb);
// ImageView view0=findViewById(R.id.viewfinder);
// view0.setImageBitmap(newb);
}
});
//Canvas canvas = new Canvas(newb);
//Paint paint = new Paint();
//paint.setAntiAlias(true);
//paint.setColor(Color.rgb(0,255,0));
//paint.setStyle(Paint.Style.STROKE);
//paint.setStrokeWidth((float) 1);
//Utils.bitmapToMat(newb,src);
//for (int i = 0; i < lines.rows(); i++) {
// Point p1 = new Point(lines.get(i, 0)[0], lines.get(i, 0)[1]);
// Point p2 = new Point(lines.get(i, 0)[2], lines.get(i, 0)[3]);
//Imgproc.line(src, p1, p2, new Scalar(0, 0, 255), 1);
//canvas.drawLine((float)p1.x,(float)p1.y,(float)p2.x,(float)p2.y,paint);
//}
// handler.post(new Runnable() {
// @Override
// public void run() {
// image_colors=findViewById(R.id.image_color);
// image_colors.setImageDrawable(images_color[1+new Random().nextInt(46)]);
// image_lights=findViewById(R.id.image_light);
// image_lights.setImageDrawable(images_light[1+new Random().nextInt(46)]);
// //if (new Random().nextInt(100)>90) return;
// image_compositions=findViewById(R.id.image_composition);
// image_compositions.setImageDrawable(images_composition[1+new Random().nextInt(10)]);
//
//
//
// }
// });
Module module_light = LiteModuleLoader.load(assetFilePath(MainActivity.this, "model-light-flat.pt"));
final Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bmp,
TensorImageUtils.TORCHVISION_NORM_MEAN_RGB,
TensorImageUtils.TORCHVISION_NORM_STD_RGB, MemoryFormat.CHANNELS_LAST);
//
// // running the model
// //Tensor outputTensor = module.forward(IValue.from(inputTensor)).toTensor();
//
// output = module_light.forward(IValue.from(inputTensor)).toTuple();
// handler.post(new Runnable() {
// @Override
// public void run() {
// Toast.makeText(getApplicationContext(), "欢迎使用AI摄影!", Toast.LENGTH_SHORT).show();
//
textView.setText("light:"+Float.toString(light)+"\ncolor:"+Float.toString(color)+"\ncomposition:"+Float.toString(composition)+"\nscore:"+Float.toString(score));
// }
// });
//Tensor output1 = output[1].toTensor();
float[] scores0 = output[0].toTensor().getDataAsFloatArray();
// float[] scores1 = output1.getDataAsFloatArray();
/*
double[] scores = new double[]{-11.0719, -11.1189, -11.3195, -11.3013, -11.3739, -11.3477, -11.1063,
-11.2752, -11.4292, -11.3919, -10.4640, -10.6779, -10.0874, -10.9944,
-11.3196, -12.1741, -11.7732, -11.3862, -11.9843, -11.5000, -11.9574,
-11.3781, -11.8460, -11.5066, -11.4355, -11.3588, -10.8882, -9.9159,
-10.2574, -11.0375, -11.1817, -10.8212, -5.0974, -5.0993, -6.9693,
-7.0123, -8.6633, -8.6549, -7.8736, -9.5857, -10.7915, -7.6602,
-7.4269, -7.8701, -10.2764, -11.1976, -11.4933, -10.5246, -9.6152,
-10.5873, -12.4171, -11.8966, -11.3708, -10.3052, -9.4131, -10.1402,
-11.1046, -10.6657, -8.1319, -6.7781, -4.3571, -5.6284, -6.9215,
-6.2050, -3.9226, -4.9130, -5.2680, -4.8228, -6.2568, -6.4092,
-6.7105, -7.6671, -7.9709, -6.3323, -7.7240, -10.6483, -10.0799,
-9.7120, -10.2654, -9.1362, -8.4451, -9.5688, -11.9479, -13.4401,
-12.6758, -10.6457, -9.6104, -8.1155, -7.3400, -6.7143, -6.7566,
-6.4274, -5.1998, -4.6225, -5.2435, -4.3328, -4.0069, -3.9902,
-3.8930, -4.0217, -4.5079, -4.8071, -4.5199, -4.6872, -4.5246,
-4.7108, -7.7065, -9.8734, -8.9101, -8.4669, -9.0343, -9.1596,
-9.3846, -9.8965, -11.3163, -12.3513, -10.6687, -9.6671, -9.3204,
-8.6154, -7.1223, -5.5563, -5.3744, -5.2166, -4.3728, -4.0534,
-4.3344, -4.3358, -3.6981, -3.3363, -3.2129, -3.1790, -3.5371,
-4.2226, -4.9925, -5.0901, -5.0881, -4.6670, -6.5122, -8.9621,
-9.6845, -9.7936, -9.7932, -9.4878, -9.5033, -9.5831, -10.0957,
-10.5798, -9.7645, -9.8511, -8.9865, -7.3661, -7.1320, -6.1173,
-5.6016, -5.0678, -5.0013, -4.6955, -4.5465, -4.3627, -4.1343,
-3.5581, -3.2847, -3.2733, -3.5636, -4.4953, -5.7664, -5.8988,
-5.9221, -6.0038, -7.0475, -8.2369, -9.1799, -9.7701, -9.7268,
-9.3515, -9.1697, -9.3432, -9.9920, -10.1261, -9.9264, -9.8319,
-9.1323, -8.5401, -7.9099, -7.5294, -6.7043, -6.1415, -5.9025,
-5.8545, -5.5058, -4.8483, -4.8162, -4.3774, -4.1573, -4.3085,
-4.6502, -5.1748, -5.5486, -5.7446, -5.6394, -5.7582, -6.3333,
-6.6053, -7.1469, -7.5038, -7.6212, -7.8041, -7.9028, -8.3094,
-8.7928, -9.2359, -9.4521, -9.3069, -8.9801, -8.5398, -8.0603,
-7.5302, -7.1517, -6.5516, -6.1840, -5.9355, -5.7370, -5.2722,
-5.3210, -5.2466, -5.1608, -5.0781, -5.1625, -5.2110, -5.1582,
-5.3372, -5.2135, -5.3521, -5.4215, -5.5325, -5.6895, -5.8215,
-5.9834, -6.1297, -6.2730, -6.5273, -6.6942, -6.8179, -6.9207,
-7.0642, -7.0021, -6.9548, -6.8321, -6.7086, -6.4698, -6.2120,
-6.0224, -5.8097, -5.5337, -5.4719};
*/
// String out_s = Light_Board.test(scores0);
// float[] out = softmax(scores0);
// textView_light1.setText(Light_Board.S);
// textView_light2.setText(out_s);
//
// Mat mat=new Mat();
// Utils.bitmapToMat(bmp,mat);
// String out_s2 = Color_Board.test(mat);
// textView_color1.setText(out_s2);
// textView_color2.setText(Color_Board.S);
if(bmp != null && !bmp.isRecycled()) {
bmp.recycle();
}
//TextView textView = findViewById(R.id.text);
// final TextView textView = (TextView) findViewById(R.id.text);
// handler.post(new Runnable() {
// @Override
// public void run() {
// Toast.makeText(getApplicationContext(), "欢迎使用AI摄影!", Toast.LENGTH_SHORT).show();
//
textView.setText("light:"+Float.toString(light)+"\ncolor:"+Float.toString(color)+"\ncomposition:"+Float.toString(composition)+"\nscore:"+Float.toString(score));
// }
// });
/**
* 设置图表数据
*/
//radar
rc = findViewById(R.id.rc);
//rc.clearAnimation();
//rc.setVisibility(View.VISIBLE);
ArrayList list = new ArrayList<>();
if (MainActivity.this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
list.add((new RadarEntry(light * 2f)));
list.add(new RadarEntry(color * 2f));
list.add(new RadarEntry(composition * 2f));
}
else{
list.add((new RadarEntry(light )));
list.add(new RadarEntry(color ));
list.add(new RadarEntry(composition ));
}
//xVals.add(new RadarEntry("a"));
//xVals.add("b");
//xVals.add("c");
//list[1]=1;
RadarDataSet radarDataSet=new RadarDataSet(list,"ett");
radarDataSet.setDrawFilled(true); // 绘制填充,默认为false
radarDataSet.setColor(0x000000);//线条设置为透明的
radarDataSet.setFillColor(0x00FFFF);//雷达图颜色为红色
radarDataSet.setFillAlpha(1001);//雷达图透明度
// radarDataSet.
RadarData radarData=new RadarData(radarDataSet);//(IRadarDataSet) xVals,
// 数据字体大小
radarData.setValueTextSize(10f);
// 是否绘制Y值到图表
radarData.setValueTextColor(Color.WHITE);
radarData.setDrawValues(false);
//radarData.setColor();
rc.setData(radarData);
//每一帧刷新数据
//radarData.notifyDataChanged();// let the data know a dataSet changed
rc.notifyDataSetChanged();// let the chart know it's data changed
rc.invalidate();//refresh
// 绘制线条宽度,圆形向外辐射的线条
rc.setWebLineWidth(0f);
// 内部线条宽度,外面的环状线条
rc.setWebLineWidthInner(4f);
//颜色
//rc.setWebColor(Color.BLUE);
//rc.setWebColorInner(Color.rgb(8,46,84));
rc.setWebColorInner(Color.rgb(127,255,212));
// 所有线条WebLine透明度
//rc.setWebAlpha(100);
rc.setWebAlpha(0);//所有线条设置为透明
//设置X轴
XAxis xAxis = rc.getXAxis();
xAxis.setDrawLabels(true);//不显示图表顶点的标签(label)
xAxis.setLabelCount(3);
//.setValueFormatter();
xAxis.setYOffset(-10f);
xAxis.setXOffset(-10f);
xAxis.setTextColor(Color.WHITE);//X轴字体颜色
xAxis.setValueFormatter(new ValueFormatter() {
@Override
public String getAxisLabel(float v, AxisBase axisBase) {
if (v==0){
return "Light:"+light;
}
if (v==1){
return "Color:"+color;
}
if (v==2){
return "Composition:"+composition;
}
return "";
}
});
xAxis.setTextSize(10);//X轴字体大小
//设置Y轴
YAxis yAxis = rc.getYAxis();
yAxis.setDrawLabels(false);
yAxis.setAxisMinimum(0);//Y轴最小值不设置会导致数据中最小值默认成为Y轴最小值
yAxis.setAxisMaximum(8f); //设置Y最大值,要达到1需要把该值设为0.8
yAxis.setTextColor(Color.RED);//Y轴字体颜色
yAxis.setTextSize(10); //Y轴字体大小
rc.getDescription().setEnabled(false);//不显示右下角描述
rc.getLegend().setEnabled(false);//不显示图例
//barhor
barHor = findViewById(R.id.bar_hor);
XAxis xAxis2 = barHor.getXAxis();
//取消x轴横线
xAxis2.setDrawAxisLine(false);
//取消x轴竖线
xAxis2.setDrawGridLines(false);
//设置x轴位于底部
xAxis2.setPosition(XAxis.XAxisPosition.BOTTOM);
//显示3个标签 (不一定准确,如果要准确显示,请带上true)
xAxis2.setLabelCount(1);
// x轴最大长度3f (注意自定义标签时,它与BarEntry(x,y),与x的关系)
xAxis2.setAxisMaximum(5f);
// x轴标签字体大小
xAxis2.setTextColor(Color.WHITE);
//自定义X轴
xAxis2.setValueFormatter(new ValueFormatter() {
@Override
public String getAxisLabel(float vv, AxisBase axisBase) {
if (vv==0){
return "score";
}
return "";
}
});
xAxis2.setTextSize(15);
xAxis2.setEnabled(false);
//在定义y轴的时候,需要两边都进行设置,而不是直接setEnabled禁用。否则将产生数据偶尔不显示的问题
YAxis left = barHor.getAxisLeft();
left.setAxisMinimum(0);
left.setAxisMaximum(10);
left.setDrawGridLines(false);
left.setDrawAxisLine(false);
left.setDrawLabels(false);
YAxis right = barHor.getAxisRight();
right.setDrawGridLines(false);
right.setDrawAxisLine(false);
//right.setTextSize(20f);
//right.setLabelCount(11);
right.setAxisMinimum(0);
// y轴最大长度10f (注意自定义标签时,它与BarEntry(x,y),与y的关系)
right.setAxisMaximum(15);
right.setDrawLabels(false);
//将图表底部向上偏移10f
barHor.setExtraBottomOffset(30);
//将图表右边靠左偏移10f
barHor.setExtraRightOffset(6);
//禁用描述
barHor.getDescription().setEnabled(false);
//禁用图例
barHor.getLegend().setEnabled(false);
List list3 = new ArrayList<>();
if (MainActivity.this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
list3.add(new BarEntry(0, (float) (score)));
}
else
list3.add(new BarEntry(0, (float) (score)));
scoreview.setText(" Score:"+Float.parseFloat(String.format("%.2f", score)));
BarDataSet set = new BarDataSet(list3, "");
//取消显示标签
set.setDrawValues(false);
set.setValueTextSize(15);
set.setValueTextColor(Color.WHITE);
//设置多种颜色,如果x长度大于颜色个数,将随机赋予颜色
set.setColors(Color.rgb(26,115,230));
BarData data = new BarData(set);
//设置轴的宽度
data.setBarWidth(1.5f);
barHor.setData(data);
barHor.notifyDataSetChanged();
barHor.invalidate();
// handler.post(new Runnable() {
// @Override
// public void run() {
// Toast.makeText(getApplicationContext(), "欢迎使用AI摄影导师1.0版!", Toast.LENGTH_SHORT).show();
// image_colors=findViewById(R.id.image_color);
// image_colors.setImageDrawable(images_color[1+new Random().nextInt(46)]);
// image_lights=findViewById(R.id.image_light);
// image_lights.setImageDrawable(images_light[1+new Random().nextInt(46)]);
// //if (new Random().nextInt(100)>90) return;
// image_compositions=findViewById(R.id.image_composition);
// image_compositions.setImageDrawable(images_composition[1+new Random().nextInt(10)]);
// }
// });
//image_color.setImageDrawable(images[ThreadLocalRandom.current().nextInt(4)]);
//image_light.setImageDrawable(images_light[1+new Random().nextInt(46)]);
//image_color.setImageDrawable(images_color[1+new Random().nextInt(46)]);
//image_composition.setImageDrawable(images_composition[1+new Random().nextInt(46)]);
Log.d(Configurations.TAG, "Image's stamp is " + Objects.requireNonNull(image.getImage()).getTimestamp());
image.close();
} catch (IOException e) {
Log.e("PytorchHelloWorld", "Error reading assets", e);
finish();
}
}
}
/**
* Copies specified asset to the file in /files app directory and returns this file absolute path.
*
* @return absolute file path
*/
public static String assetFilePath(Context context, String assetName) throws IOException {
File file = new File(context.getFilesDir(), assetName);
if (file.exists() && file.length() > 0) {
return file.getAbsolutePath();
}
try (InputStream is = context.getAssets().open(assetName)) {
try (OutputStream os = new FileOutputStream(file)) {
byte[] buffer = new byte[4 * 1720];
int read;
while ((read = is.read(buffer)) != -1) {
os.write(buffer, 0, read);
}
os.flush();
}
return file.getAbsolutePath();
}
}
private boolean allPermissionsGranted() {
for (String permission : Configurations.REQUIRED_PERMISSIONS) {
if (ContextCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
private File getOutputDirectory() {
File mediaDir = new File(getExternalMediaDirs()[0], getString(R.string.app_name));
boolean isExist = mediaDir.exists() || mediaDir.mkdir();
return isExist ? mediaDir : null;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == Configurations.REQUEST_CODE_PERMISSIONS) {
if (allPermissionsGranted()) {// 申请权限通过
startCamera();
} else {// 申请权限失败
Toast.makeText(this, "用户拒绝授予权限!", Toast.LENGTH_LONG).show();
finish();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
cameraExecutor.shutdown();
}
static class Configurations {
public static final String TAG = "CameraxBasic";
public static final String FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS";
public static final int REQUEST_CODE_PERMISSIONS = 10;
public static final String[] REQUIRED_PERMISSIONS = new String[]{Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
}
@Override
public void onConfigurationChanged(Configuration Config) {
super.onConfigurationChanged(Config);
// requestWindowFeature(Window.FEATURE_NO_TITLE);
Toast.makeText(getBaseContext(),"竖屏模式",Toast.LENGTH_SHORT).show();
int mCurrentOrientation = getResources().getConfiguration().orientation;
if (mCurrentOrientation == Configuration.ORIENTATION_PORTRAIT) {
//横屏时要处理的代码,
//这里的代码是当屏幕横屏时当成竖屏显示
Toast.makeText(getBaseContext(),"竖屏模式",Toast.LENGTH_SHORT).show();
setContentView(R.layout.mainp);
} else if (mCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
setContentView(R.layout.mainl);
Toast.makeText(getBaseContext(),"横屏模式",Toast.LENGTH_SHORT).show();
//竖屏时要处理的代码
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
startCamera();
// 设置拍照按钮监听
Button camera_capture_button = findViewById(R.id.camera_capture_button);
camera_capture_button.setOnClickListener(v -> takePhoto());
// 设置照片等保存的位置
outputDirectory = getOutputDirectory();
cameraExecutor = Executors.newSingleThreadExecutor();
// if (pq==0) return;
//Toast toastCenter = Toast.makeText(getApplicationContext(),"智能分析中...",Toast.LENGTH_SHORT); //屏幕居中的弹窗
//toastCenter.setGravity(Gravity.CENTER,0,0);
//toastCenter.show();
//timer=new CountDownTimer(3000, 3000){
// public void onTick(long millisUntilFinished)
//{
// toastCenter.show();
//}
// public void onFinish()
// {
// toastCenter.cancel();
//}
//}.start();
handler.post(new Runnable() {
@Override
public void run() {
int ID = getResources().getIdentifier("q"+String.valueOf(pq),"drawable",getPackageName());
ImageView q=findViewById(R.id.q);
q.setImageResource(ID); //延时执行的代码
findViewById(R.id.q).setVisibility(View.VISIBLE);
}
});
}
public void onCameraViewStarted(int width, int height) {
mGray = new Mat();
mRgba = new Mat();
}
public void onCameraViewStopped() {
// Explicitly deallocate Mats
if (mIntermediateMat != null)
mIntermediateMat.release();
mIntermediateMat = null;
mGray.release();
mRgba.release();
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
mGray = inputFrame.gray();
float mRelativeFaceSize = 0.2f;
if (mAbsoluteFaceSize == 0) {
int height = mGray.rows();
if (Math.round(height * mRelativeFaceSize) > 0) {
mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
}
}
MatOfRect faces = new MatOfRect();
if (classifier != null)
classifier.detectMultiScale(mGray, faces, 1.1, 2, 2,
new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());
Rect[] facesArray = faces.toArray();
Scalar faceRectColor = new Scalar(0, 255, 0, 255);
for (Rect faceRect : facesArray)
Imgproc.rectangle(mRgba, faceRect.tl(), faceRect.br(), faceRectColor, 1);
return mRgba;
}
// 初始化人脸级联分类器,必须先初始化
private void initClassifier() {
try {
InputStream is = getResources()
.openRawResource(R.raw.lbpcascade_frontalface);
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
File cascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
FileOutputStream os = new FileOutputStream(cascadeFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
is.close();
os.close();
classifier = new CascadeClassifier(cascadeFile.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressLint("CheckResult")
private void getPermission(){
// Toast.makeText(this,"12345",Toast.LENGTH_SHORT).show();
//RxPermissions rxPermissions = new RxPermissions(OpenCVActivity.this);
//rxPermissions.request(Manifest.permission.CAMERA).subscribe(aBoolean -> {
// if (aBoolean) {
initClassifier();
//} else {
// Toast.makeText(OpenCVActivity.this, "您还没有开启相机权限,请前往设置->应用管理->开启", Toast.LENGTH_SHORT).show();
//}
//});
}
//mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.jcv);
// 这里的cjv也是我的项目中JavaCameraView的id,自己改一下
//CvCameraView.setCvCameraViewListener(MainActivity.this);
}
2.3 界面XML文件
竖版
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#000000" tools:context=".MainActivity">
<!-- <org.opencv.android.JavaCameraView -->
<!-- android:id="@+id/jcv" -->
<!-- android:visibility="visible" -->
<!-- android:layout_width="match_parent" -->
<!-- android:layout_height="match_parent" -->
<!-- android:scaleType="fitXY" -->
<!-- /> -->
<!-- <ImageView -->
<!-- android:id="@+id/image" -->
<!-- android:layout_width="match_parent" -->
<!-- android:layout_gravity="top" -->
<!-- android:layout_height="500dp" -->
<!-- android:scaleType="fitCenter" /> -->
<androidx.camera.view.PreviewView android:id="@+id/viewFinder" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="top" android:visibility="visible" android:scaleType="fitXY"/>
<!-- <ImageView -->
<!-- android:layout_width="324dp" -->
<!-- android:layout_height="451dp" -->
<!-- android:scaleType="fitXY" -->
<!-- android:layout_marginTop="-60dp" -->
<!-- android:layout_marginLeft="220dp" -->
<!-- app:srcCompat="@drawable/logo" -->
<!-- android:visibility="invisible" -->
<!-- /> -->
<!-- <ImageView -->
<!-- android:layout_width="891dp" -->
<!-- android:layout_height="411dp" -->
<!-- android:scaleType="fitXY" -->
<!-- android:id="@+id/viewfinder" -->
<!-- android:visibility="invisible" -->
<!-- /> -->
<ImageView android:id="@+id/radar2" android:layout_width="match_parent" android:layout_gravity="center" android:layout_height="match_parent"/>
<FrameLayout android:id="@+id/frame1" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_marginBottom="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="visible" android:orientation="horizontal">
<HorizontalScrollView android:id="@+id/scroll1" android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:orientation="horizontal">
<Button android:id="@+id/btn1" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:layout_marginLeft="120dp" android:onClick="button_radar" android:text="AARC" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn2" android:layout_marginLeft="40dp" android:onClick="button_bar" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:textColor="#ffffff" android:alpha="0.8" android:text="OAS"/>
<!-- <Button
android:id="@+id/btn3"
android:textColor="#ffffff"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:alpha="0.8"
android:onClick="button_color"
android:textSize="11dp"
android:text="配色模板"
/>
<Button
android:id="@+id/btn4"
android:textColor="#ffffff"
android:onClick="button_light"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:alpha="0.8"
android:textSize="11dp"
android:text="光照模板"
/>
<Button
android:id="@+id/btn5"
android:textColor="#ffffff"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:alpha="0.8"
android:onClick="button_composition"
android:textSize="11dp"
android:text="构图模板"
/>
<Button
android:id="@+id/btn6"
android:textColor="#ffffff"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:alpha="0.8"
android:onClick="btn_recommend"
android:textSize="11dp"
android:text="姿势推荐"
/>
<Button
android:id="@+id/btn18"
android:textColor="#ffffff"
android:onClick="btn_setting"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:textSize="11dp"
android:alpha="0.8"
android:text="智能优化"
/>
<Button
android:id="@+id/btn9"
android:textColor="#ffffff"
android:textSize="11dp"
android:onClick="btn_face"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:alpha="0.8"
android:text="人像模式"
/>
<Button
android:textColor="#ffffff"
android:onClick="btn_light"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:textSize="11dp"
android:alpha="0.8"
android:text="光感"
/>
<Button
android:id="@+id/btn41"
android:textColor="#ffffff"
android:onClick="btn_professional"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:textSize="11dp"
android:alpha="0.8"
android:text="专业"
/>
<Button
android:id="@+id/btn19"
android:textColor="#ffffff"
android:onClick="button_finish"
android:background="@android:color/transparent"
android:layout_width="60dp"
android:layout_height="30dp"
android:textSize="11dp"
android:layout_marginRight="10dp"
android:alpha="0.8"
android:text="退出"
/> -->
</LinearLayout>
</HorizontalScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame2" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_marginBottom="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<HorizontalScrollView android:id="@+id/scroll2" android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:orientation="horizontal">
<Button android:id="@+id/btn20" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_off" android:text="关闭平衡" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn21" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_auto" android:text="自动平衡" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn22" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_fluorescent" android:text="荧光灯" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn23" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_warm_fluorescent" android:text="暖荧光" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn24" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_daylight" android:text="日光灯" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn25" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_cloudy_daylight" android:text="多云天气" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn26" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_twilight" android:text="黄昏" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn27" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_shade" android:text="阴影光" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn28" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_diy" android:text="自定义" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn29" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_return" android:text="返回" android:textColor="#ffffff" android:textSize="11dp"/>
</LinearLayout>
</HorizontalScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame3" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_marginBottom="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<HorizontalScrollView android:id="@+id/scroll3" android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:orientation="horizontal">
<Button android:id="@+id/btn30" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_off" android:text="关闭降噪" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn31" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_fast" android:text="快速降噪" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn32" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_quality" android:text="高质降噪" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn33" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_minimal" android:text="最小降噪" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn34" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_return" android:text="返回" android:textColor="#ffffff" android:textSize="11dp"/>
</LinearLayout>
</HorizontalScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame4" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_marginBottom="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<HorizontalScrollView android:id="@+id/scroll4" android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:orientation="horizontal">
<Button android:id="@+id/btn35" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_off" android:text="关闭对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn36" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_auto" android:text="自动对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn37" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_macro" android:text="微距对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn38" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_continuous" android:text="连续对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn39" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_EDOF" android:text="数字对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn40" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_return" android:text="返回" android:textColor="#ffffff" android:textSize="11dp"/>
</LinearLayout>
</HorizontalScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame5" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_marginBottom="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<HorizontalScrollView android:id="@+id/scroll5" android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:orientation="horizontal">
<Button android:id="@+id/btn43" android:textColor="#ffffff" android:onClick="btn_aperture" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="光圈"/>
<Button android:id="@+id/btn14" android:textColor="#ffffff" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:onClick="btn_exposure_compensation" android:alpha="0.8" android:text="快门"/>
<Button android:id="@+id/btn15" android:textColor="#ffffff" android:onClick="btn_ISO" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="感光度"/>
<Button android:id="@+id/btn16" android:textColor="#ffffff" android:onClick="btn_anti_scintillation" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="抗闪烁"/>
<Button android:id="@+id/btn17" android:textColor="#ffffff" android:onClick="btn_exposure_compensation" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="曝光补偿"/>
<Button android:id="@+id/btn11" android:textColor="#ffffff" android:onClick="btn_noise" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="降噪模式"/>
<Button android:id="@+id/btn42" android:textColor="#ffffff" android:onClick="btn_professional_return" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="返回"/>
</LinearLayout>
</HorizontalScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame6" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_marginBottom="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<HorizontalScrollView android:id="@+id/scroll6" android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:orientation="horizontal">
<Button android:id="@+id/btn7" android:textColor="#ffffff" android:onClick="btn_torch" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="补光"/>
<Button android:id="@+id/btn8" android:textColor="#ffffff" android:onClick="btn_flash" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="闪光"/>
<Button android:id="@+id/btn10" android:textColor="#ffffff" android:onClick="btn_white_balance" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="白平衡"/>
<Button android:id="@+id/btn12" android:textColor="#ffffff" android:onClick="btn_exposure" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="自动曝光"/>
<Button android:id="@+id/btn13" android:textColor="#ffffff" android:onClick="btn_focus" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="对焦模式"/>
<Button android:id="@+id/btn44" android:textColor="#ffffff" android:onClick="btn_light_return" android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="返回"/>
</LinearLayout>
</HorizontalScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame7" android:layout_width="match_parent" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_marginBottom="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="gone" android:orientation="horizontal">
<HorizontalScrollView android:id="@+id/scroll7" android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="30dp" android:background="@android:color/transparent" android:orientation="horizontal">
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_close" android:text="关闭优化" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_action" android:text="快速移动" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_beach" android:text="户外海滩" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_candlelight" android:text="昏暗焰光" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_face" android:text="面部优化" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_firework" android:text="夜晚焰火" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_HDR" android:text="HDR" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_landscape" android:text="远处景物" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_night" android:text="夜拍景物" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_night_portrait" android:text="夜拍人物" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_party" android:text="低光移动" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_snow" android:text="明亮雪景" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_sport" android:text="运动抓拍" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_stead" android:text="抗扰动" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_sunset" android:text="落日场景" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_theatre" android:text="昏暗室内" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:background="@android:color/transparent" android:layout_width="60dp" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_return" android:text="返回" android:textColor="#ffffff" android:textSize="11dp"/>
</LinearLayout>
</HorizontalScrollView>
</FrameLayout>
<FrameLayout android:layout_width="match_parent" android:layout_height="100dp" android:layout_gravity="bottom" android:layout_marginBottom="0dp" android:background="@android:color/transparent">
<Button android:id="@+id/camera_capture_button" android:layout_width="80dp" android:layout_height="80dp" android:layout_gravity="center_horizontal" android:layout_marginTop="10dp" android:background="@drawable/button_shape1"/>
<Button android:id="@+id/button_reverse_camera" android:layout_width="52dp" android:layout_height="52dp" android:onClick="button_camera" android:layout_gravity="center_horizontal" android:layout_marginTop="25dp" android:layout_marginLeft="100dp" android:background="@drawable/button_shape2"/>
<Button android:id="@+id/camera_album" android:layout_width="55dp" android:layout_height="55dp" android:onClick="button_album" android:layout_gravity="center_horizontal" android:layout_marginTop="25dp" android:layout_marginRight="100dp" android:background="@drawable/button_shape0"/>
</FrameLayout>
<!--
<TextView
android:id="@+id/text"
android:singleLine="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="#80000000"
android:textColor="@android:color/white"
android:textSize="20sp" />
-->
<!--
<com.github.mikephil.charting.charts.RadarChart
android:id="@+id/chart1"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginTop="400dp"
android:layout_marginLeft="0dp"/>
-->
<!-- view -->
<ImageView android:id="@+id/image_color" android:scaleType="fitXY" android:layout_marginLeft="10dp" android:layout_gravity="left" android:visibility="invisible" android:layout_marginTop="580dp" android:layout_width="92dp" app:srcCompat="@drawable/plt_color_1" android:layout_height="92dp" android:layout_marginRight="170dp"/>
<TextView android:id="@+id/text_color1" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_gravity="left|center_vertical" android:layout_marginLeft="-16dp" android:layout_marginTop="165dp" android:textColor="#f0f0f0" android:gravity="center_horizontal" android:textSize="12dp"/>
<TextView android:id="@+id/text_color2" android:layout_width="140dp" android:gravity="left" android:layout_height="wrap_content" android:layout_gravity="left|center_vertical" android:layout_marginLeft="34dp" android:visibility="invisible" android:layout_marginTop="180dp" android:textColor="#f0f0f0" android:textSize="13dp"/>
<ImageView android:id="@+id/image_light" android:layout_marginTop="580dp" android:layout_width="121.5dp" android:visibility="invisible" app:srcCompat="@drawable/plt_light_4" android:scaleType="fitCenter" android:layout_gravity="center_horizontal" android:layout_height="90dp"/>
<TextView android:id="@+id/text_light1" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_gravity="center" android:visibility="invisible" android:layout_marginTop="165dp" android:textColor="#f0f0f0" android:gravity="center" android:textSize="12dp"/>
<TextView android:id="@+id/text_light2" android:gravity="center" android:layout_width="140dp" android:visibility="invisible" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="180dp" android:textColor="#f0f0f0" android:textSize="13dp"/>
<ImageView android:configChanges="orientation|screenSize" android:id="@+id/image_composition" android:layout_gravity="right" android:visibility="invisible" android:layout_marginTop="595dp" android:layout_width="100dp" app:srcCompat="@drawable/plt_composition_3" android:layout_height="62dp" android:layout_marginRight="15dp"/>
<TextView android:id="@+id/textView1" android:layout_width="101dp" android:layout_height="50dp" android:layout_gravity="left" android:gravity="left" android:layout_marginRight="0dp" android:layout_marginTop="55dp" android:textColor="@android:color/white" android:textSize="12dp"/>
<ImageView android:id="@+id/imageView1" android:visibility="invisible" android:scaleType="fitXY" android:alpha="0" android:layout_gravity="left|bottom" android:layout_marginBottom="22dp" android:layout_width="150dp" android:layout_height="14dp" android:layout_marginLeft="15dp"/>
<com.github.mikephil.charting.charts.HorizontalBarChart android:id="@+id/bar_hor" android:layout_width="104dp" android:layout_height="106dp" android:layout_gravity="left" android:layout_marginTop="15dp"/>
<ImageView android:id="@+id/radar" android:layout_width="250dp" android:layout_gravity="right" android:layout_height="200dp" android:layout_marginBottom="60dp" android:layout_marginRight="-40dp"/>
<com.github.mikephil.charting.charts.RadarChart android:id="@+id/rc" android:layout_width="250dp" android:layout_height="200dp" android:layout_gravity="right" android:clickable="false" android:layout_marginBottom="60dp" android:layout_marginRight="-40dp"/>
<ImageView android:id="@+id/q" android:layout_width="411dp" android:layout_height="411dp" android:layout_gravity="center" android:visibility="visible"/>
</FrameLayout>
横版:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:background="#000000" tools:context=".MainActivity">
<!--
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_gravity="top"
android:layout_height="500dp"
android:scaleType="fitCenter" />
-->
<androidx.camera.view.PreviewView android:id="@+id/viewFinder" android:visibility="visible" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="top" android:scaleType="fitXY"/>
<!--
<org.opencv.android.JavaCameraView
android:id="@+id/jcv"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
/>
-->
<!-- <ImageView -->
<!-- android:layout_width="324dp" -->
<!-- android:layout_height="451dp" -->
<!-- android:scaleType="fitXY" -->
<!-- android:layout_marginTop="-60dp" -->
<!-- android:layout_marginLeft="220dp" -->
<!-- app:srcCompat="@drawable/logo" -->
<!-- android:visibility="invisible" -->
<!-- /> -->
<ImageView android:layout_width="891dp" android:layout_height="411dp" android:scaleType="fitXY" android:id="@+id/viewfinder" android:visibility="invisible"/>
<ImageView android:id="@+id/radar2" android:layout_width="891dp" android:layout_gravity="center" android:layout_height="411dp"/>
<FrameLayout android:id="@+id/frame1" android:layout_width="70dp" android:layout_height="match_parent" android:layout_gravity="right" android:layout_marginRight="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="visible" android:orientation="horizontal">
<ScrollView android:id="@+id/scroll1" android:layout_width="70dp" android:layout_height="match_parent" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical">
<Button android:id="@+id/btn1" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="button_radar" android:text="AARC" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn2" android:layout_marginTop="8dp" android:onClick="button_bar" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:textColor="#ffffff" android:alpha="0.8" android:text="OAS"/>
<!-- <Button
android:id="@+id/btn3"
android:textColor="#ffffff"
android:layout_marginTop="8dp"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:alpha="0.8"
android:onClick="button_color"
android:textSize="11dp"
android:text="配色模板"
/>
<Button
android:id="@+id/btn4"
android:layout_marginTop="8dp"
android:textColor="#ffffff"
android:onClick="button_light"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:alpha="0.8"
android:textSize="11dp"
android:text="光照模板"
/>
<Button
android:id="@+id/btn5"
android:textColor="#ffffff"
android:layout_marginTop="8dp"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:alpha="0.8"
android:onClick="button_composition"
android:textSize="11dp"
android:text="构图模板"
/>
<Button
android:id="@+id/btn6"
android:textColor="#ffffff"
android:layout_marginTop="8dp"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:alpha="0.8"
android:onClick="btn_recommend"
android:textSize="11dp"
android:text="姿势推荐"
/>
<Button
android:id="@+id/btn18"
android:textColor="#ffffff"
android:layout_marginTop="8dp"
android:onClick="btn_setting"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:textSize="11dp"
android:alpha="0.8"
android:text="智能优化"
/>
<Button
android:id="@+id/btn9"
android:textColor="#ffffff"
android:layout_marginTop="8dp"
android:textSize="11dp"
android:onClick="btn_face"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:alpha="0.8"
android:text="人像模式"
/>
<Button
android:textColor="#ffffff"
android:layout_marginTop="8dp"
android:onClick="btn_light"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:textSize="11dp"
android:alpha="0.8"
android:text="光感"
/>
<Button
android:id="@+id/btn41"
android:textColor="#ffffff"
android:layout_marginTop="8dp"
android:onClick="btn_professional"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:textSize="11dp"
android:alpha="0.8"
android:text="专业"
/>
<Button
android:id="@+id/btn19"
android:textColor="#ffffff"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:onClick="button_finish"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="30dp"
android:textSize="11dp"
android:alpha="0.8"
android:text="退出"
/> -->
</LinearLayout>
</ScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame2" android:layout_width="70dp" android:layout_height="fill_parent" android:layout_gravity="right" android:layout_marginRight="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<ScrollView android:id="@+id/scroll2" android:layout_width="70dp" android:layout_height="match_parent" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical">
<Button android:id="@+id/btn20" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_off" android:text="关闭平衡" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn21" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_auto" android:text="自动平衡" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn22" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_fluorescent" android:text="荧光灯" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn23" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_warm_fluorescent" android:text="暖荧光" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn24" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_daylight" android:text="日光灯" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn25" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_cloudy_daylight" android:text="多云天气" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn26" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_twilight" android:text="黄昏" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn27" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_shade" android:text="阴影光" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn28" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_balance_diy" android:text="自定义" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn29" android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:layout_marginBottom="16dp" android:onClick="btn_balance_return" android:text="返回" android:textColor="#ffffff" android:textSize="11dp"/>
</LinearLayout>
</ScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame3" android:layout_width="70dp" android:layout_height="fill_parent" android:layout_gravity="right" android:layout_marginRight="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<ScrollView android:id="@+id/scroll3" android:layout_width="70dp" android:layout_height="match_parent" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical">
<Button android:id="@+id/btn30" android:layout_marginTop="31dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_off" android:text="关闭降噪" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn31" android:layout_marginTop="36dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_fast" android:text="快速降噪" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn32" android:layout_marginTop="36dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_quality" android:text="高质降噪" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn33" android:layout_marginTop="36dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_minimal" android:text="最小降噪" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn34" android:layout_marginTop="36dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_noise_return" android:text="返回" android:textColor="#ffffff" android:textSize="11dp"/>
</LinearLayout>
</ScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame4" android:layout_width="70dp" android:layout_height="fill_parent" android:layout_gravity="right" android:layout_marginRight="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<ScrollView android:layout_width="70dp" android:layout_height="match_parent" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical">
<Button android:id="@+id/btn35" android:layout_marginTop="26dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_off" android:text="关闭对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn36" android:layout_marginTop="26dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_auto" android:text="自动对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn37" android:layout_marginTop="26dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_macro" android:text="微距对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn38" android:layout_marginTop="26dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_continuous" android:text="连续对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn39" android:layout_marginTop="26dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_EDOF" android:text="数字对焦" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:id="@+id/btn40" android:layout_marginTop="26dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_focus_return" android:text="返回" android:textColor="#ffffff" android:textSize="11dp"/>
</LinearLayout>
</ScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame5" android:layout_width="70dp" android:layout_height="fill_parent" android:layout_gravity="right" android:layout_marginRight="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<ScrollView android:layout_width="70dp" android:layout_height="match_parent" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical">
<Button android:id="@+id/btn43" android:textColor="#ffffff" android:layout_marginTop="20dp" android:onClick="btn_aperture" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="光圈"/>
<Button android:id="@+id/btn14" android:textColor="#ffffff" android:layout_marginTop="20dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:onClick="btn_exposure_compensation" android:alpha="0.8" android:text="快门"/>
<Button android:id="@+id/btn15" android:textColor="#ffffff" android:layout_marginTop="20dp" android:onClick="btn_ISO" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="感光度"/>
<Button android:id="@+id/btn16" android:textColor="#ffffff" android:layout_marginTop="20dp" android:onClick="btn_anti_scintillation" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="抗闪烁"/>
<Button android:id="@+id/btn17" android:textColor="#ffffff" android:layout_marginTop="20dp" android:onClick="btn_exposure_compensation" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="曝光补偿"/>
<Button android:id="@+id/btn11" android:textColor="#ffffff" android:layout_marginTop="20dp" android:onClick="btn_noise" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="降噪模式"/>
<Button android:id="@+id/btn42" android:textColor="#ffffff" android:layout_marginTop="20dp" android:onClick="btn_professional_return" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="返回"/>
</LinearLayout>
</ScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame6" android:layout_width="70dp" android:layout_height="fill_parent" android:layout_gravity="right" android:layout_marginRight="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="invisible" android:orientation="horizontal">
<ScrollView android:layout_width="70dp" android:layout_height="match_parent" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical">
<Button android:id="@+id/btn7" android:textColor="#ffffff" android:layout_marginTop="26dp" android:onClick="btn_torch" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="补光"/>
<Button android:id="@+id/btn8" android:textColor="#ffffff" android:layout_marginTop="26dp" android:onClick="btn_flash" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="闪光"/>
<Button android:id="@+id/btn10" android:textColor="#ffffff" android:layout_marginTop="26dp" android:onClick="btn_white_balance" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="白平衡"/>
<Button android:id="@+id/btn12" android:textColor="#ffffff" android:layout_marginTop="26dp" android:onClick="btn_exposure" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="自动曝光"/>
<Button android:id="@+id/btn13" android:textColor="#ffffff" android:layout_marginTop="26dp" android:onClick="btn_focus" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="对焦模式"/>
<Button android:id="@+id/btn44" android:textColor="#ffffff" android:layout_marginTop="26dp" android:onClick="btn_light_return" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:textSize="11dp" android:alpha="0.8" android:text="返回"/>
</LinearLayout>
</ScrollView>
</FrameLayout>
<FrameLayout android:id="@+id/frame7" android:layout_width="70dp" android:layout_height="fill_parent" android:layout_gravity="right" android:layout_marginRight="100dp" android:background="@android:color/transparent" android:alpha="100" android:visibility="gone" android:orientation="horizontal">
<ScrollView android:layout_width="70dp" android:layout_height="match_parent" android:background="@android:color/transparent" android:layout_gravity="center_vertical|left">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical">
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_close" android:text="关闭优化" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_action" android:text="快速移动" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_beach" android:text="户外海滩" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_candlelight" android:text="昏暗焰光" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_face" android:text="面部优化" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_firework" android:text="夜晚焰火" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_HDR" android:text="HDR" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_landscape" android:text="远处景物" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_night" android:text="夜拍景物" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_night_portrait" android:text="夜拍人物" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_party" android:text="低光移动" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_snow" android:text="明亮雪景" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_sport" android:text="运动抓拍" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_stead" android:text="抗扰动" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_sunset" android:text="落日场景" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_theatre" android:text="昏暗室内" android:textColor="#ffffff" android:textSize="11dp"/>
<Button android:layout_marginTop="16dp" android:background="@android:color/transparent" android:layout_width="match_parent" android:layout_height="30dp" android:alpha="0.8" android:onClick="btn_scene_return" android:text="返回" android:layout_marginBottom="16dp" android:textColor="#ffffff" android:textSize="11dp"/>
</LinearLayout>
</ScrollView>
</FrameLayout>
<FrameLayout android:layout_width="100dp" android:layout_height="match_parent" android:layout_gravity="right|bottom" android:background="@android:color/transparent">
<Button android:id="@+id/camera_capture_button" android:layout_width="80dp" android:layout_height="80dp" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:background="@drawable/button_shape1"/>
<Button android:id="@+id/button_reverse_camera" android:layout_width="52dp" android:layout_height="52dp" android:onClick="button_camera" android:layout_gravity="center_vertical" android:layout_marginBottom="90dp" android:layout_marginLeft="22dp" android:background="@drawable/button_shape2"/>
<Button android:id="@+id/camera_album" android:layout_width="55dp" android:layout_height="55dp" android:onClick="button_album" android:layout_gravity="center_vertical" android:layout_marginTop="90dp" android:layout_marginLeft="22dp" android:background="@drawable/button_shape0"/>
</FrameLayout>
<!--
<TextView
android:id="@+id/text"
android:singleLine="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="#80000000"
android:textColor="@android:color/white"
android:textSize="20sp" />
-->
<!--
<com.github.mikephil.charting.charts.RadarChart
android:id="@+id/chart1"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginTop="400dp"
android:layout_marginLeft="0dp"/>
-->
<!-- view -->
<ImageView android:id="@+id/image_color" android:scaleType="fitXY" android:layout_marginLeft="157dp" android:layout_gravity="center_horizontal" android:layout_marginTop="9dp" android:layout_width="92dp" app:srcCompat="@drawable/plt_color_1" android:layout_height="92dp"/>
<TextView android:id="@+id/text_color1" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginLeft="157dp" android:layout_marginTop="92dp" android:textColor="#f0f0f0" android:gravity="center_horizontal" android:textSize="12dp"/>
<TextView android:id="@+id/text_color2" android:layout_width="140dp" android:gravity="left" android:layout_height="wrap_content" android:layout_marginTop="107dp" android:layout_gravity="center_horizontal" android:layout_marginLeft="202dp" android:textColor="#f0f0f0" android:textSize="13dp"/>
<ImageView android:id="@+id/image_light" android:layout_marginTop="135dp" android:layout_width="121.5dp" app:srcCompat="@drawable/plt_light_4" android:scaleType="fitCenter" android:layout_marginLeft="155dp" android:layout_gravity="center_horizontal" android:layout_height="90dp"/>
<TextView android:id="@+id/text_light1" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|top" android:layout_marginTop="222dp" android:layout_marginLeft="155dp" android:textColor="#f0f0f0" android:gravity="center" android:textSize="12dp"/>
<TextView android:id="@+id/text_light2" android:gravity="center_horizontal" android:layout_width="140dp" android:layout_height="wrap_content" android:layout_marginLeft="155dp" android:layout_gravity="center_horizontal|top" android:layout_marginTop="237dp" android:textColor="#f0f0f0" android:textSize="13dp"/>
<ImageView android:configChanges="orientation|screenSize" android:id="@+id/image_composition" android:layout_gravity="center_horizontal|bottom" android:layout_marginBottom="25dp" android:layout_marginLeft="168dp" android:layout_width="100dp" app:srcCompat="@drawable/plt_composition_3" android:layout_height="62dp" android:layout_marginRight="15dp"/>
<TextView android:id="@+id/textView1" android:layout_width="151dp" android:layout_height="50dp" android:layout_gravity="left|bottom" android:layout_marginLeft="10dp" android:layout_marginBottom="10dp" android:textColor="@android:color/white" android:textSize="16dp"/>
<ImageView android:id="@+id/imageView1" android:visibility="invisible" android:scaleType="fitXY" android:alpha="0" android:layout_gravity="left|bottom" android:layout_marginBottom="22dp" android:layout_width="150dp" android:layout_height="14dp" android:layout_marginLeft="15dp"/>
<com.github.mikephil.charting.charts.HorizontalBarChart android:id="@+id/bar_hor" android:layout_width="154dp" android:layout_height="106dp" android:layout_marginLeft="7dp" android:layout_gravity="left|bottom" android:layout_marginBottom="-10dp"/>
<ImageView android:id="@+id/radar" android:layout_width="250dp" android:layout_gravity="left" android:layout_height="250dp" android:layout_marginBottom="110dp" android:layout_marginLeft="-40dp"/>
<com.github.mikephil.charting.charts.RadarChart android:id="@+id/rc" android:layout_width="250dp" android:layout_height="250dp" android:layout_gravity="left" android:layout_marginBottom="60dp" android:layout_marginLeft="-40dp"/>
<ImageView android:id="@+id/q" android:layout_width="411dp" android:layout_height="411dp" android:layout_gravity="center" android:visibility="visible"/>
</FrameLayout>
2.4 项目截图
以下的截图都来自于虚拟机实际截图效果。
以下两张是风景指导的功能效果。
以下是人像拍摄指导的实际效果。
3 项目展示
123
c509f08739cf8e9abbc80ad3b2
这两个视频展示了APP的主要指导功能,左下角得分条展示当前画面的总分,左上角的雷达图展示光照、构图和颜色的分别评分。
APP可以调节侧边栏,调用曝光度、白平衡、快门、闪光、滤镜等等,部分功能没有演示。
4 实践中遇到的问题及解决
在实践中,我遇到了语义线难以识别的问题。它识别的效果总是不理想,我调用了谷歌mlkit的一个小模型,又实验了OpenCV的语义线模型。
解决方案:参考mmcheng.net/wp-content/uploads/2021/09/21pami_dht.pdf,用他预训练的模型自制了一个,效果尚可。
5 学习感悟与思考
这次的综合实践我提交了一个之前的项目,做了一些基础的改变,加入了人脸识别等一些小功能。还记得我当时做出这个项目,花费了半个月的时间。其中遇到的难题极多,有时候bitmap空间奔溃了,有时候layout定义的变量又发生了空指针报错,困难之多,无法言说。这次实践也是对我过去所学的应用与总结。希望以后我能克服困难,设计出更优秀的APP来。
6 课程总结
随着移动互联网的飞速发展,安卓移动平台开发已成为IT领域的重要分支。本学期,我有幸选修了安卓移动平台开发课程,通过系统的学习和实践,我对安卓开发有了更深入的了解。在课程中我们学习了了安卓开发的基础知识、四大组件、界面设计、数据存储等多个方面。这门课没有停留在课本阶段,在课堂之外,丰富的实验帮助我巩固加深了所学的知识,对我开发项目带来了许多启发。
课程初期,我们学习了安卓开发的基础:安卓系统的架构,并且自己完成了开发环境搭建,在Java编程语言的基础进一步学习了kotlin语言。我一步一个脚印,安装了Android Studio,配置了虚拟机,并且成功实现了第一个项目。接着我们学习了Kotlin语言,相比Java语言,Kotlin语言更加简洁,便于Android开发。
接着,我们重点学习了安卓四大组件:深入学习了Activity、Service、BroadcastReceiver、Content Provider等核心组件的工作原理和使用方法。在实验和作业中,我们学会了运用这些插件。
安卓开发是一个不断发展的领域,新的技术和框架不断涌现。为了跟上时代的步伐,我们需要保持持续学习的态度。我很早就用过android studio,但是由于课程兴趣,我在课程之外,也尝试了别的开发工具(如hbuilderX)。
通过本学期的学习,我提高了安卓开发的基本知识和技能,能够独立完成简单的安卓应用开发。同时,我也提高了自己的编程能力和解决问题的能力。我也通过跟校外团队的合作,开发出了一个聊天通讯APP,但使用的是vue前后端分离技术,没有用到android studio。下面是APP的一些界面。
总之,本学期安卓移动平台开发课程的学习让我收获颇丰。感谢老师的悉心教导和同学们的帮助与支持。在未来的学习和工作中,我将继续努力、不断进步!