forked from gloomyfish1998/opencv_tutorial
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
31ac7d3
commit dbcf59e
Showing
1 changed file
with
173 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |