~paparazzi-uav/paparazzi/v5.0-manual

« back to all changes in this revision

Viewing changes to sw/ext/opencv_bebop/opencv/samples/android/color-blob-detection/src/org/opencv/samples/colorblobdetect/ColorBlobDetectionActivity.java

  • Committer: Paparazzi buildbot
  • Date: 2016-05-18 15:00:29 UTC
  • Revision ID: felix.ruess+docbot@gmail.com-20160518150029-e8lgzi5kvb4p7un9
Manual import commit 4b8bbb730080dac23cf816b98908dacfabe2a8ec from v5.0 branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.opencv.samples.colorblobdetect;
 
2
 
 
3
import java.util.List;
 
4
 
 
5
import org.opencv.android.BaseLoaderCallback;
 
6
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
 
7
import org.opencv.android.LoaderCallbackInterface;
 
8
import org.opencv.android.OpenCVLoader;
 
9
import org.opencv.core.Core;
 
10
import org.opencv.core.CvType;
 
11
import org.opencv.core.Mat;
 
12
import org.opencv.core.MatOfPoint;
 
13
import org.opencv.core.Rect;
 
14
import org.opencv.core.Scalar;
 
15
import org.opencv.core.Size;
 
16
import org.opencv.android.CameraBridgeViewBase;
 
17
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
 
18
import org.opencv.imgproc.Imgproc;
 
19
 
 
20
import android.app.Activity;
 
21
import android.os.Bundle;
 
22
import android.util.Log;
 
23
import android.view.MotionEvent;
 
24
import android.view.View;
 
25
import android.view.Window;
 
26
import android.view.WindowManager;
 
27
import android.view.View.OnTouchListener;
 
28
import android.view.SurfaceView;
 
29
 
 
30
public class ColorBlobDetectionActivity extends Activity implements OnTouchListener, CvCameraViewListener2 {
 
31
    private static final String  TAG              = "OCVSample::Activity";
 
32
 
 
33
    private boolean              mIsColorSelected = false;
 
34
    private Mat                  mRgba;
 
35
    private Scalar               mBlobColorRgba;
 
36
    private Scalar               mBlobColorHsv;
 
37
    private ColorBlobDetector    mDetector;
 
38
    private Mat                  mSpectrum;
 
39
    private Size                 SPECTRUM_SIZE;
 
40
    private Scalar               CONTOUR_COLOR;
 
41
 
 
42
    private CameraBridgeViewBase mOpenCvCameraView;
 
43
 
 
44
    private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
 
45
        @Override
 
46
        public void onManagerConnected(int status) {
 
47
            switch (status) {
 
48
                case LoaderCallbackInterface.SUCCESS:
 
49
                {
 
50
                    Log.i(TAG, "OpenCV loaded successfully");
 
51
                    mOpenCvCameraView.enableView();
 
52
                    mOpenCvCameraView.setOnTouchListener(ColorBlobDetectionActivity.this);
 
53
                } break;
 
54
                default:
 
55
                {
 
56
                    super.onManagerConnected(status);
 
57
                } break;
 
58
            }
 
59
        }
 
60
    };
 
61
 
 
62
    public ColorBlobDetectionActivity() {
 
63
        Log.i(TAG, "Instantiated new " + this.getClass());
 
64
    }
 
65
 
 
66
    /** Called when the activity is first created. */
 
67
    @Override
 
68
    public void onCreate(Bundle savedInstanceState) {
 
69
        Log.i(TAG, "called onCreate");
 
70
        super.onCreate(savedInstanceState);
 
71
        requestWindowFeature(Window.FEATURE_NO_TITLE);
 
72
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 
73
 
 
74
        setContentView(R.layout.color_blob_detection_surface_view);
 
75
 
 
76
        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.color_blob_detection_activity_surface_view);
 
77
        mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
 
78
        mOpenCvCameraView.setCvCameraViewListener(this);
 
79
    }
 
80
 
 
81
    @Override
 
82
    public void onPause()
 
83
    {
 
84
        super.onPause();
 
85
        if (mOpenCvCameraView != null)
 
86
            mOpenCvCameraView.disableView();
 
87
    }
 
88
 
 
89
    @Override
 
90
    public void onResume()
 
91
    {
 
92
        super.onResume();
 
93
        if (!OpenCVLoader.initDebug()) {
 
94
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
 
95
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
 
96
        } else {
 
97
            Log.d(TAG, "OpenCV library found inside package. Using it!");
 
98
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
 
99
        }
 
100
    }
 
101
 
 
102
    public void onDestroy() {
 
103
        super.onDestroy();
 
104
        if (mOpenCvCameraView != null)
 
105
            mOpenCvCameraView.disableView();
 
106
    }
 
107
 
 
108
    public void onCameraViewStarted(int width, int height) {
 
109
        mRgba = new Mat(height, width, CvType.CV_8UC4);
 
110
        mDetector = new ColorBlobDetector();
 
111
        mSpectrum = new Mat();
 
112
        mBlobColorRgba = new Scalar(255);
 
113
        mBlobColorHsv = new Scalar(255);
 
114
        SPECTRUM_SIZE = new Size(200, 64);
 
115
        CONTOUR_COLOR = new Scalar(255,0,0,255);
 
116
    }
 
117
 
 
118
    public void onCameraViewStopped() {
 
119
        mRgba.release();
 
120
    }
 
121
 
 
122
    public boolean onTouch(View v, MotionEvent event) {
 
123
        int cols = mRgba.cols();
 
124
        int rows = mRgba.rows();
 
125
 
 
126
        int xOffset = (mOpenCvCameraView.getWidth() - cols) / 2;
 
127
        int yOffset = (mOpenCvCameraView.getHeight() - rows) / 2;
 
128
 
 
129
        int x = (int)event.getX() - xOffset;
 
130
        int y = (int)event.getY() - yOffset;
 
131
 
 
132
        Log.i(TAG, "Touch image coordinates: (" + x + ", " + y + ")");
 
133
 
 
134
        if ((x < 0) || (y < 0) || (x > cols) || (y > rows)) return false;
 
135
 
 
136
        Rect touchedRect = new Rect();
 
137
 
 
138
        touchedRect.x = (x>4) ? x-4 : 0;
 
139
        touchedRect.y = (y>4) ? y-4 : 0;
 
140
 
 
141
        touchedRect.width = (x+4 < cols) ? x + 4 - touchedRect.x : cols - touchedRect.x;
 
142
        touchedRect.height = (y+4 < rows) ? y + 4 - touchedRect.y : rows - touchedRect.y;
 
143
 
 
144
        Mat touchedRegionRgba = mRgba.submat(touchedRect);
 
145
 
 
146
        Mat touchedRegionHsv = new Mat();
 
147
        Imgproc.cvtColor(touchedRegionRgba, touchedRegionHsv, Imgproc.COLOR_RGB2HSV_FULL);
 
148
 
 
149
        // Calculate average color of touched region
 
150
        mBlobColorHsv = Core.sumElems(touchedRegionHsv);
 
151
        int pointCount = touchedRect.width*touchedRect.height;
 
152
        for (int i = 0; i < mBlobColorHsv.val.length; i++)
 
153
            mBlobColorHsv.val[i] /= pointCount;
 
154
 
 
155
        mBlobColorRgba = converScalarHsv2Rgba(mBlobColorHsv);
 
156
 
 
157
        Log.i(TAG, "Touched rgba color: (" + mBlobColorRgba.val[0] + ", " + mBlobColorRgba.val[1] +
 
158
                ", " + mBlobColorRgba.val[2] + ", " + mBlobColorRgba.val[3] + ")");
 
159
 
 
160
        mDetector.setHsvColor(mBlobColorHsv);
 
161
 
 
162
        Imgproc.resize(mDetector.getSpectrum(), mSpectrum, SPECTRUM_SIZE);
 
163
 
 
164
        mIsColorSelected = true;
 
165
 
 
166
        touchedRegionRgba.release();
 
167
        touchedRegionHsv.release();
 
168
 
 
169
        return false; // don't need subsequent touch events
 
170
    }
 
171
 
 
172
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
 
173
        mRgba = inputFrame.rgba();
 
174
 
 
175
        if (mIsColorSelected) {
 
176
            mDetector.process(mRgba);
 
177
            List<MatOfPoint> contours = mDetector.getContours();
 
178
            Log.e(TAG, "Contours count: " + contours.size());
 
179
            Imgproc.drawContours(mRgba, contours, -1, CONTOUR_COLOR);
 
180
 
 
181
            Mat colorLabel = mRgba.submat(4, 68, 4, 68);
 
182
            colorLabel.setTo(mBlobColorRgba);
 
183
 
 
184
            Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70, 70 + mSpectrum.cols());
 
185
            mSpectrum.copyTo(spectrumLabel);
 
186
        }
 
187
 
 
188
        return mRgba;
 
189
    }
 
190
 
 
191
    private Scalar converScalarHsv2Rgba(Scalar hsvColor) {
 
192
        Mat pointMatRgba = new Mat();
 
193
        Mat pointMatHsv = new Mat(1, 1, CvType.CV_8UC3, hsvColor);
 
194
        Imgproc.cvtColor(pointMatHsv, pointMatRgba, Imgproc.COLOR_HSV2RGB_FULL, 4);
 
195
 
 
196
        return new Scalar(pointMatRgba.get(0, 0));
 
197
    }
 
198
}