Advertisement
Guest User

BallTracker

a guest
Jun 28th, 2016
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.24 KB | None | 0 0
  1. package cobramosch.trackingserver;
  2.  
  3. import android.content.pm.ActivityInfo;
  4. import android.hardware.Camera;
  5. import android.os.Bundle;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.text.Editable;
  8. import android.text.TextWatcher;
  9. import android.util.Log;
  10. import android.view.Menu;
  11. import android.view.MenuInflater;
  12. import android.view.SurfaceView;
  13. import android.view.WindowManager;
  14. import android.widget.EditText;
  15. import android.widget.Switch;
  16. import android.widget.TextView;
  17.  
  18. import com.appyvet.rangebar.RangeBar;
  19.  
  20. import org.opencv.android.BaseLoaderCallback;
  21. import org.opencv.android.CameraBridgeViewBase;
  22. import org.opencv.android.LoaderCallbackInterface;
  23. import org.opencv.android.OpenCVLoader;
  24. import org.opencv.core.Core;
  25. import org.opencv.core.CvType;
  26. import org.opencv.core.Mat;
  27. import org.opencv.core.MatOfPoint;
  28. import org.opencv.core.MatOfPoint2f;
  29. import org.opencv.core.Point;
  30. import org.opencv.core.Scalar;
  31. import org.opencv.imgproc.Imgproc;
  32.  
  33. import java.util.ArrayList;
  34. import java.util.List;
  35.  
  36.  
  37. public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
  38.  
  39.     /* OpenCV stuff */
  40.     CameraBridgeViewBase mOpenCvCameraView;
  41.     Scalar mLowerBound = new Scalar(0), mUpperBound = new Scalar(0);
  42.     List<MatOfPoint> contours;
  43.     Point[] points;
  44.     Mat mRgba, mRgbaF, smHsv, mMask, mHistory;
  45.  
  46.     /* UI stuff */
  47.     Switch hsvSwitch;
  48.     TextView angle;
  49.     EditText ipEditText, portEditText, fEditText;
  50.     SyncUDPServer server;
  51.     RangeBar hRangeBar, sRangeBar, vRangeBar;
  52.  
  53.     private float lastDistance = 0.0f;
  54.     private float amplitude    = 10.0f;
  55.  
  56.     private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this){
  57.         @Override
  58.         public void onManagerConnected(int status) {
  59.             switch (status) {
  60.                 case LoaderCallbackInterface.SUCCESS:
  61.                     mOpenCvCameraView.enableView();
  62.                     break;
  63.                 default:
  64.                     super.onManagerConnected(status);
  65.                     break;
  66.             }
  67.         }
  68.     };
  69.  
  70.     @Override
  71.     protected void onCreate(Bundle savedInstanceState) {
  72.         super.onCreate(savedInstanceState);
  73.         setContentView(R.layout.activity_main);
  74.         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
  75.         getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  76.  
  77.         mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.color_blob_detection_activity_surface_view);
  78.         mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
  79.         mOpenCvCameraView.setCvCameraViewListener(this);
  80.         mOpenCvCameraView.setMaxFrameSize(848, 480);
  81.  
  82.         hsvSwitch = (Switch) findViewById(R.id.maskSwitch);
  83.         angle = (TextView) findViewById(R.id.angleTextView);
  84.  
  85.         ipEditText = (EditText) findViewById(R.id.ipEditText);
  86.         ipEditText.setText(DataStorage.getUDPConnectionIP());
  87.  
  88.         ipEditText.addTextChangedListener(new TextWatcher() {
  89.             @Override
  90.             public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
  91.  
  92.             @Override
  93.             public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
  94.  
  95.             @Override
  96.             public void afterTextChanged(Editable editable) {
  97.                 DataStorage.setUDPConnectionIP(editable.toString());
  98.             }
  99.         });
  100.  
  101.         portEditText = (EditText) findViewById(R.id.portEditText);
  102.         portEditText.setText(String.valueOf(DataStorage.getUDPPort()));
  103.  
  104.         portEditText.addTextChangedListener(new TextWatcher() {
  105.             @Override
  106.             public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
  107.  
  108.             @Override
  109.             public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
  110.  
  111.             @Override
  112.             public void afterTextChanged(Editable editable) {
  113.                 DataStorage.setUDPPort(Integer.valueOf(editable.toString()));
  114.             }
  115.         });
  116.  
  117.         fEditText = (EditText) findViewById(R.id.fEditText);
  118.         fEditText.setText(String.valueOf(DataStorage.getF()));
  119.  
  120.         fEditText.addTextChangedListener(new TextWatcher() {
  121.             @Override
  122.             public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  123.  
  124.             }
  125.  
  126.             @Override
  127.             public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  128.  
  129.             }
  130.  
  131.             @Override
  132.             public void afterTextChanged(Editable editable) {
  133.                 DataStorage.setF(editable.toString().equals("") ? 0 : Float.valueOf(editable.toString()));
  134.             }
  135.         });
  136.  
  137.  
  138.         hRangeBar = (RangeBar) findViewById(R.id.hRangeBar);
  139.         hRangeBar.setOnRangeBarChangeListener(new RangeBar.OnRangeBarChangeListener() {
  140.             @Override
  141.             public void onRangeChangeListener(RangeBar rangeBar, int leftPinIndex,
  142.                                               int rightPinIndex,
  143.                                               String leftPinValue, String rightPinValue) {
  144.  
  145.                 mLowerBound.val[0] = Double.valueOf(leftPinValue);
  146.                 mUpperBound.val[0] = Double.valueOf(rightPinValue);
  147.  
  148.             }
  149.         });
  150.  
  151.         sRangeBar = (RangeBar) findViewById(R.id.sRangeBar);
  152.         sRangeBar.setOnRangeBarChangeListener(new RangeBar.OnRangeBarChangeListener() {
  153.             @Override
  154.             public void onRangeChangeListener(RangeBar rangeBar, int leftPinIndex,
  155.                                               int rightPinIndex,
  156.                                               String leftPinValue, String rightPinValue) {
  157.  
  158.                 mLowerBound.val[1] = Double.valueOf(leftPinValue);
  159.                 mUpperBound.val[1] = Double.valueOf(rightPinValue);
  160.  
  161.             }
  162.         });
  163.  
  164.         vRangeBar = (RangeBar) findViewById(R.id.vRangeBar);
  165.         vRangeBar.setOnRangeBarChangeListener(new RangeBar.OnRangeBarChangeListener() {
  166.             @Override
  167.             public void onRangeChangeListener(RangeBar rangeBar, int leftPinIndex,
  168.                                               int rightPinIndex,
  169.                                               String leftPinValue, String rightPinValue) {
  170.  
  171.                 mLowerBound.val[2] = Double.valueOf(leftPinValue);
  172.                 mUpperBound.val[2] = Double.valueOf(rightPinValue);
  173.  
  174.             }
  175.         });
  176.  
  177.         server = new SyncUDPServer();
  178.         server.execute();
  179.  
  180.     }
  181.  
  182.     @Override
  183.     public void onCameraViewStarted(int width, int height) {
  184.         assignUpperLower();
  185.  
  186.         this.mRgba = new Mat(height, width, CvType.CV_8UC4);
  187.         this.mRgbaF = new Mat(height, width, CvType.CV_8UC4);
  188.         this.mHistory = new Mat();
  189.         this.smHsv = new Mat();
  190.         this.mMask = new Mat();
  191.  
  192.         contours = new ArrayList<>();
  193.  
  194.         Camera camera = ((MyCameraView) findViewById(R.id.color_blob_detection_activity_surface_view)).getCamera();
  195.         if (camera != null) {
  196.             Camera.Parameters params = camera.getParameters();
  197.             params.setAutoWhiteBalanceLock(false);
  198.             params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);
  199.             params.setVideoStabilization(false);
  200.             params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
  201.             camera.setParameters(params);
  202.  
  203.             double vertAngle = params.getVerticalViewAngle();
  204.             double horAngle = params.getHorizontalViewAngle();
  205.             angle.setText((int)vertAngle + "::" + (int)horAngle);
  206.         }
  207.     }
  208.  
  209.     @Override
  210.     public void onCameraViewStopped() {
  211.  
  212.     }
  213.  
  214.     @Override
  215.     public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
  216.         mRgba = inputFrame.rgba();
  217.         Imgproc.resize(mRgba, mRgbaF, mRgbaF.size(), 0, 0, 0);
  218.         Core.flip(mRgbaF, mRgba, -1);
  219.  
  220.         if(mRgba.channels()>1)
  221.             Imgproc.cvtColor(mRgba, smHsv, Imgproc.COLOR_RGB2HSV_FULL);
  222.         else smHsv = mRgba;
  223.  
  224.         Core.inRange(smHsv, mLowerBound, mUpperBound, mMask);
  225.  
  226.         contours.clear();
  227.         Imgproc.findContours(mMask.clone(), contours, mHistory, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
  228.  
  229.         if(contours.size() > 0){
  230.             MatOfPoint largestContour = new MatOfPoint();
  231.             double max = 0;
  232.             for(MatOfPoint m: contours){
  233.                 double tmp = Imgproc.contourArea(m);
  234.                 if(tmp > max) {
  235.                     max = tmp;
  236.                     largestContour = m;
  237.                 }
  238.             }
  239.  
  240.             points = largestContour.toArray();
  241.  
  242.             Point center = new Point();
  243.             float[] radius = new float[1];
  244.             if(!largestContour.empty()) {
  245.                 Imgproc.minEnclosingCircle(new MatOfPoint2f(points), center, radius);
  246.             }
  247.  
  248.             if(radius[0] > 10){
  249.                 Imgproc.circle(mRgba, center, (int)radius[0], new Scalar(0, 255, 255), 2);
  250.             }
  251.  
  252.             /* Calculate the distance to the object */
  253.             float F, P, D, W, distance;
  254.             W = 93;
  255.             P = radius[0];
  256.             F = DataStorage.getF();
  257.  
  258.             distance = (W * F) / P;
  259.             Log.d("radius", "" + radius[0]);
  260.             Log.d("distance", "" + distance);
  261.  
  262.             server.distance = distance > (lastDistance + amplitude) || distance < (lastDistance - amplitude) ? distance : lastDistance;
  263.  
  264.             lastDistance = distance;
  265.  
  266.         }
  267.  
  268.         if(hsvSwitch.isChecked()) {
  269.  
  270.             return mMask;
  271.         }
  272.         else{
  273.  
  274.             return mRgba;
  275.         }
  276.  
  277.     }
  278.  
  279.     @Override
  280.     public void onPause(){
  281.         super.onPause();
  282.         if(mOpenCvCameraView != null){
  283.             mOpenCvCameraView.disableView();
  284.         }
  285.         server.STOP_FLAG = true;
  286.     }
  287.  
  288.     @Override
  289.     public void onDestroy(){
  290.         super.onDestroy();
  291.         if(mOpenCvCameraView != null){
  292.             mOpenCvCameraView.disableView();
  293.         }
  294.         server.STOP_FLAG = true;
  295.     }
  296.  
  297.     @Override
  298.     public void onResume(){
  299.         super.onResume();
  300.         if(!OpenCVLoader.initDebug()){
  301.             OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
  302.         }else{
  303.             mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
  304.         }
  305.         server.STOP_FLAG = false;
  306.     }
  307.  
  308.     private void assignUpperLower(){
  309.         /* Get values from range bar: h-value */
  310.         mLowerBound.val[0] = Double.valueOf(hRangeBar.getLeftPinValue());
  311.         mUpperBound.val[0] = Double.valueOf(hRangeBar.getRightPinValue());
  312.  
  313.         /* Get values from range bar: s-value */
  314.         mLowerBound.val[1] = Double.valueOf(sRangeBar.getLeftPinValue());
  315.         mUpperBound.val[1] = Double.valueOf(sRangeBar.getRightPinValue());
  316.  
  317.         /* Get values from range bar: v-value */
  318.         mLowerBound.val[2] = Double.valueOf(vRangeBar.getLeftPinValue());
  319.         mUpperBound.val[2] = Double.valueOf(vRangeBar.getRightPinValue());
  320.  
  321.  
  322.     }
  323.  
  324.     @Override
  325.     public boolean onCreateOptionsMenu(Menu menu) {
  326.         MenuInflater inflater = getMenuInflater();
  327.         inflater.inflate(R.menu.menu_main, menu);
  328.         return true;
  329.     }
  330. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement