1
package org.opencv.samples.colorblobdetect;
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;
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;
30
public class ColorBlobDetectionActivity extends Activity implements OnTouchListener, CvCameraViewListener2 {
31
private static final String TAG = "OCVSample::Activity";
33
private boolean mIsColorSelected = false;
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;
42
private CameraBridgeViewBase mOpenCvCameraView;
44
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
46
public void onManagerConnected(int status) {
48
case LoaderCallbackInterface.SUCCESS:
50
Log.i(TAG, "OpenCV loaded successfully");
51
mOpenCvCameraView.enableView();
52
mOpenCvCameraView.setOnTouchListener(ColorBlobDetectionActivity.this);
56
super.onManagerConnected(status);
62
public ColorBlobDetectionActivity() {
63
Log.i(TAG, "Instantiated new " + this.getClass());
66
/** Called when the activity is first created. */
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);
74
setContentView(R.layout.color_blob_detection_surface_view);
76
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.color_blob_detection_activity_surface_view);
77
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
78
mOpenCvCameraView.setCvCameraViewListener(this);
85
if (mOpenCvCameraView != null)
86
mOpenCvCameraView.disableView();
90
public void 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);
97
Log.d(TAG, "OpenCV library found inside package. Using it!");
98
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
102
public void onDestroy() {
104
if (mOpenCvCameraView != null)
105
mOpenCvCameraView.disableView();
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);
118
public void onCameraViewStopped() {
122
public boolean onTouch(View v, MotionEvent event) {
123
int cols = mRgba.cols();
124
int rows = mRgba.rows();
126
int xOffset = (mOpenCvCameraView.getWidth() - cols) / 2;
127
int yOffset = (mOpenCvCameraView.getHeight() - rows) / 2;
129
int x = (int)event.getX() - xOffset;
130
int y = (int)event.getY() - yOffset;
132
Log.i(TAG, "Touch image coordinates: (" + x + ", " + y + ")");
134
if ((x < 0) || (y < 0) || (x > cols) || (y > rows)) return false;
136
Rect touchedRect = new Rect();
138
touchedRect.x = (x>4) ? x-4 : 0;
139
touchedRect.y = (y>4) ? y-4 : 0;
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;
144
Mat touchedRegionRgba = mRgba.submat(touchedRect);
146
Mat touchedRegionHsv = new Mat();
147
Imgproc.cvtColor(touchedRegionRgba, touchedRegionHsv, Imgproc.COLOR_RGB2HSV_FULL);
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;
155
mBlobColorRgba = converScalarHsv2Rgba(mBlobColorHsv);
157
Log.i(TAG, "Touched rgba color: (" + mBlobColorRgba.val[0] + ", " + mBlobColorRgba.val[1] +
158
", " + mBlobColorRgba.val[2] + ", " + mBlobColorRgba.val[3] + ")");
160
mDetector.setHsvColor(mBlobColorHsv);
162
Imgproc.resize(mDetector.getSpectrum(), mSpectrum, SPECTRUM_SIZE);
164
mIsColorSelected = true;
166
touchedRegionRgba.release();
167
touchedRegionHsv.release();
169
return false; // don't need subsequent touch events
172
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
173
mRgba = inputFrame.rgba();
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);
181
Mat colorLabel = mRgba.submat(4, 68, 4, 68);
182
colorLabel.setTo(mBlobColorRgba);
184
Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70, 70 + mSpectrum.cols());
185
mSpectrum.copyTo(spectrumLabel);
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);
196
return new Scalar(pointMatRgba.get(0, 0));