Skip to content

Commit

Permalink
code changes
Browse files Browse the repository at this point in the history
  • Loading branch information
gloomyfish1998 committed Apr 9, 2018
1 parent 31ac7d3 commit dbcf59e
Showing 1 changed file with 173 additions and 0 deletions.
173 changes: 173 additions & 0 deletions dnn_tutorial/Androd_ssd_demo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
package com.example.zhigang.ssddemo;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceView;
import android.view.WindowManager;

import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.dnn.Dnn;
import org.opencv.dnn.Net;
import org.opencv.imgproc.Imgproc;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{
private static final String[] classNames = {"background",
"aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair",
"cow", "diningtable", "dog", "horse",
"motorbike", "person", "pottedplant",
"sheep", "sofa", "train", "tvmonitor"};
private final int IN_WIDTH = 300;
private final int IN_HEIGHT = 300;
private final float WH_RATIO = (float)IN_WIDTH / IN_HEIGHT;
private final double IN_SCALE_FACTOR = 0.007843;
private final double MEAN_VAL = 127.5;
private final double THRESHOLD = 0.2;

private JavaCameraView mcameraView;
private Net net;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mcameraView = findViewById(R.id.camera_view_id);
mcameraView.setVisibility(SurfaceView.VISIBLE);
mcameraView.setCvCameraViewListener(MainActivity.this); // setup frame listener
mcameraView.setCameraIndex(0);
mcameraView.enableFpsMeter();
mcameraView.enableView();

staticLoadCVLibraries();
}

//OpenCV库静态加载并初始化
private void staticLoadCVLibraries(){
boolean load = OpenCVLoader.initDebug();
if(load) {
Log.i("CV", "Open CV Libraries loaded...");
}
}

private String initBinaryData()throws IOException {
InputStream input = getResources().openRawResource(R.raw.mobilenetssd_binary);
File cascadeDir = this.getDir("ssd", Context.MODE_PRIVATE);
File file = new File(cascadeDir.getAbsolutePath() + "mobilenetssd_binary.caffemodel");
FileOutputStream out = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len = 0;
while((len = input.read(buff)) != -1) {
out.write(buff, 0, len);
}
input.close();
out.close();
return file.getAbsolutePath();
}

private String initDescData()throws IOException {
InputStream input = getResources().openRawResource(R.raw.mobilenetssd_desc);
File cascadeDir = this.getDir("ssd", Context.MODE_PRIVATE);
File file = new File(cascadeDir.getAbsolutePath() + "mobilenetssd_desc.prototxt");
FileOutputStream out = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len = 0;
while((len = input.read(buff)) != -1) {
out.write(buff, 0, len);
}
input.close();
out.close();
return file.getAbsolutePath();
}


@Override
public void onCameraViewStarted(int width, int height) {
try {
net = Dnn.readNetFromCaffe(initDescData(), initBinaryData());
} catch (IOException ioe) {
ioe.printStackTrace();
}
}

@Override
public void onCameraViewStopped() {

}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
Mat frame = inputFrame.rgba();
Log.i("SSD", "start to detection...");
frame = processFrame(frame);
return frame;
}

private Mat processFrame(Mat frame) {
// Get a new frame
Imgproc.cvtColor(frame, frame, Imgproc.COLOR_RGBA2RGB);
// Forward image through network.
Mat blob = Dnn.blobFromImage(frame, IN_SCALE_FACTOR,
new Size(IN_WIDTH, IN_HEIGHT),
new Scalar(MEAN_VAL, MEAN_VAL, MEAN_VAL), false, false);
net.setInput(blob);
Mat detections = net.forward();
int cols = frame.cols();
int rows = frame.rows();
Size cropSize;
if ((float)cols / rows > WH_RATIO) {
cropSize = new Size(rows * WH_RATIO, rows);
} else {
cropSize = new Size(cols, cols / WH_RATIO);
}
int y1 = (int)(rows - cropSize.height) / 2;
int y2 = (int)(y1 + cropSize.height);
int x1 = (int)(cols - cropSize.width) / 2;
int x2 = (int)(x1 + cropSize.width);
Mat subFrame = frame.submat(y1, y2, x1, x2);
cols = subFrame.cols();
rows = subFrame.rows();
detections = detections.reshape(1, (int)detections.total() / 7);
for (int i = 0; i < detections.rows(); ++i) {
double confidence = detections.get(i, 2)[0];
if (confidence > THRESHOLD) {
int classId = (int)detections.get(i, 1)[0];
int xLeftBottom = (int)(detections.get(i, 3)[0] * cols);
int yLeftBottom = (int)(detections.get(i, 4)[0] * rows);
int xRightTop = (int)(detections.get(i, 5)[0] * cols);
int yRightTop = (int)(detections.get(i, 6)[0] * rows);
// Draw rectangle around detected object.
Imgproc.rectangle(subFrame, new Point(xLeftBottom, yLeftBottom),
new Point(xRightTop, yRightTop),
new Scalar(0, 255, 0));
String label = classNames[classId] + ": " + confidence;
int[] baseLine = new int[1];
Size labelSize = Imgproc.getTextSize(label, Core.FONT_HERSHEY_SIMPLEX, 0.5, 1, baseLine);
// Draw background for label.
Imgproc.rectangle(subFrame, new Point(xLeftBottom, yLeftBottom - labelSize.height),
new Point(xLeftBottom + labelSize.width, yLeftBottom + baseLine[0]),
new Scalar(255, 255, 255), Core.FILLED);
// Write class name and confidence.
Imgproc.putText(subFrame, label, new Point(xLeftBottom, yLeftBottom),
Core.FONT_HERSHEY_SIMPLEX, 0.5, new Scalar(0, 0, 0));
}
}

return frame;
}
}

0 comments on commit dbcf59e

Please sign in to comment.