1
package org.opencv.samples.imagemanipulations;
3
import java.util.Arrays;
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.MatOfFloat;
13
import org.opencv.core.MatOfInt;
14
import org.opencv.core.Point;
15
import org.opencv.core.Scalar;
16
import org.opencv.core.Size;
17
import org.opencv.android.CameraBridgeViewBase;
18
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
19
import org.opencv.imgproc.Imgproc;
21
import android.app.Activity;
22
import android.os.Bundle;
23
import android.util.Log;
24
import android.view.Menu;
25
import android.view.MenuItem;
26
import android.view.WindowManager;
28
public class ImageManipulationsActivity extends Activity implements CvCameraViewListener2 {
29
private static final String TAG = "OCVSample::Activity";
31
public static final int VIEW_MODE_RGBA = 0;
32
public static final int VIEW_MODE_HIST = 1;
33
public static final int VIEW_MODE_CANNY = 2;
34
public static final int VIEW_MODE_SEPIA = 3;
35
public static final int VIEW_MODE_SOBEL = 4;
36
public static final int VIEW_MODE_ZOOM = 5;
37
public static final int VIEW_MODE_PIXELIZE = 6;
38
public static final int VIEW_MODE_POSTERIZE = 7;
40
private MenuItem mItemPreviewRGBA;
41
private MenuItem mItemPreviewHist;
42
private MenuItem mItemPreviewCanny;
43
private MenuItem mItemPreviewSepia;
44
private MenuItem mItemPreviewSobel;
45
private MenuItem mItemPreviewZoom;
46
private MenuItem mItemPreviewPixelize;
47
private MenuItem mItemPreviewPosterize;
48
private CameraBridgeViewBase mOpenCvCameraView;
52
private Mat mIntermediateMat;
54
private MatOfInt mChannels[];
55
private MatOfInt mHistSize;
56
private int mHistSizeNum = 25;
57
private MatOfFloat mRanges;
58
private Scalar mColorsRGB[];
59
private Scalar mColorsHue[];
60
private Scalar mWhilte;
63
private float mBuff[];
64
private Mat mSepiaKernel;
66
public static int viewMode = VIEW_MODE_RGBA;
68
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
70
public void onManagerConnected(int status) {
72
case LoaderCallbackInterface.SUCCESS:
74
Log.i(TAG, "OpenCV loaded successfully");
75
mOpenCvCameraView.enableView();
79
super.onManagerConnected(status);
85
public ImageManipulationsActivity() {
86
Log.i(TAG, "Instantiated new " + this.getClass());
89
/** Called when the activity is first created. */
91
public void onCreate(Bundle savedInstanceState) {
92
Log.i(TAG, "called onCreate");
93
super.onCreate(savedInstanceState);
94
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
96
setContentView(R.layout.image_manipulations_surface_view);
98
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.image_manipulations_activity_surface_view);
99
mOpenCvCameraView.setVisibility(CameraBridgeViewBase.VISIBLE);
100
mOpenCvCameraView.setCvCameraViewListener(this);
104
public void onPause()
107
if (mOpenCvCameraView != null)
108
mOpenCvCameraView.disableView();
112
public void onResume()
115
if (!OpenCVLoader.initDebug()) {
116
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
117
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
119
Log.d(TAG, "OpenCV library found inside package. Using it!");
120
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
124
public void onDestroy() {
126
if (mOpenCvCameraView != null)
127
mOpenCvCameraView.disableView();
131
public boolean onCreateOptionsMenu(Menu menu) {
132
Log.i(TAG, "called onCreateOptionsMenu");
133
mItemPreviewRGBA = menu.add("Preview RGBA");
134
mItemPreviewHist = menu.add("Histograms");
135
mItemPreviewCanny = menu.add("Canny");
136
mItemPreviewSepia = menu.add("Sepia");
137
mItemPreviewSobel = menu.add("Sobel");
138
mItemPreviewZoom = menu.add("Zoom");
139
mItemPreviewPixelize = menu.add("Pixelize");
140
mItemPreviewPosterize = menu.add("Posterize");
145
public boolean onOptionsItemSelected(MenuItem item) {
146
Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);
147
if (item == mItemPreviewRGBA)
148
viewMode = VIEW_MODE_RGBA;
149
if (item == mItemPreviewHist)
150
viewMode = VIEW_MODE_HIST;
151
else if (item == mItemPreviewCanny)
152
viewMode = VIEW_MODE_CANNY;
153
else if (item == mItemPreviewSepia)
154
viewMode = VIEW_MODE_SEPIA;
155
else if (item == mItemPreviewSobel)
156
viewMode = VIEW_MODE_SOBEL;
157
else if (item == mItemPreviewZoom)
158
viewMode = VIEW_MODE_ZOOM;
159
else if (item == mItemPreviewPixelize)
160
viewMode = VIEW_MODE_PIXELIZE;
161
else if (item == mItemPreviewPosterize)
162
viewMode = VIEW_MODE_POSTERIZE;
166
public void onCameraViewStarted(int width, int height) {
167
mIntermediateMat = new Mat();
169
mChannels = new MatOfInt[] { new MatOfInt(0), new MatOfInt(1), new MatOfInt(2) };
170
mBuff = new float[mHistSizeNum];
171
mHistSize = new MatOfInt(mHistSizeNum);
172
mRanges = new MatOfFloat(0f, 256f);
174
mColorsRGB = new Scalar[] { new Scalar(200, 0, 0, 255), new Scalar(0, 200, 0, 255), new Scalar(0, 0, 200, 255) };
175
mColorsHue = new Scalar[] {
176
new Scalar(255, 0, 0, 255), new Scalar(255, 60, 0, 255), new Scalar(255, 120, 0, 255), new Scalar(255, 180, 0, 255), new Scalar(255, 240, 0, 255),
177
new Scalar(215, 213, 0, 255), new Scalar(150, 255, 0, 255), new Scalar(85, 255, 0, 255), new Scalar(20, 255, 0, 255), new Scalar(0, 255, 30, 255),
178
new Scalar(0, 255, 85, 255), new Scalar(0, 255, 150, 255), new Scalar(0, 255, 215, 255), new Scalar(0, 234, 255, 255), new Scalar(0, 170, 255, 255),
179
new Scalar(0, 120, 255, 255), new Scalar(0, 60, 255, 255), new Scalar(0, 0, 255, 255), new Scalar(64, 0, 255, 255), new Scalar(120, 0, 255, 255),
180
new Scalar(180, 0, 255, 255), new Scalar(255, 0, 255, 255), new Scalar(255, 0, 215, 255), new Scalar(255, 0, 85, 255), new Scalar(255, 0, 0, 255)
182
mWhilte = Scalar.all(255);
187
mSepiaKernel = new Mat(4, 4, CvType.CV_32F);
188
mSepiaKernel.put(0, 0, /* R */0.189f, 0.769f, 0.393f, 0f);
189
mSepiaKernel.put(1, 0, /* G */0.168f, 0.686f, 0.349f, 0f);
190
mSepiaKernel.put(2, 0, /* B */0.131f, 0.534f, 0.272f, 0f);
191
mSepiaKernel.put(3, 0, /* A */0.000f, 0.000f, 0.000f, 1f);
194
public void onCameraViewStopped() {
195
// Explicitly deallocate Mats
196
if (mIntermediateMat != null)
197
mIntermediateMat.release();
199
mIntermediateMat = null;
202
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
203
Mat rgba = inputFrame.rgba();
204
Size sizeRgba = rgba.size();
208
int rows = (int) sizeRgba.height;
209
int cols = (int) sizeRgba.width;
214
int width = cols * 3 / 4;
215
int height = rows * 3 / 4;
217
switch (ImageManipulationsActivity.viewMode) {
218
case ImageManipulationsActivity.VIEW_MODE_RGBA:
221
case ImageManipulationsActivity.VIEW_MODE_HIST:
222
Mat hist = new Mat();
223
int thikness = (int) (sizeRgba.width / (mHistSizeNum + 10) / 5);
224
if(thikness > 5) thikness = 5;
225
int offset = (int) ((sizeRgba.width - (5*mHistSizeNum + 4*10)*thikness)/2);
227
for(int c=0; c<3; c++) {
228
Imgproc.calcHist(Arrays.asList(rgba), mChannels[c], mMat0, hist, mHistSize, mRanges);
229
Core.normalize(hist, hist, sizeRgba.height/2, 0, Core.NORM_INF);
230
hist.get(0, 0, mBuff);
231
for(int h=0; h<mHistSizeNum; h++) {
232
mP1.x = mP2.x = offset + (c * (mHistSizeNum + 10) + h) * thikness;
233
mP1.y = sizeRgba.height-1;
234
mP2.y = mP1.y - 2 - (int)mBuff[h];
235
Imgproc.line(rgba, mP1, mP2, mColorsRGB[c], thikness);
239
Imgproc.cvtColor(rgba, mIntermediateMat, Imgproc.COLOR_RGB2HSV_FULL);
241
Imgproc.calcHist(Arrays.asList(mIntermediateMat), mChannels[2], mMat0, hist, mHistSize, mRanges);
242
Core.normalize(hist, hist, sizeRgba.height/2, 0, Core.NORM_INF);
243
hist.get(0, 0, mBuff);
244
for(int h=0; h<mHistSizeNum; h++) {
245
mP1.x = mP2.x = offset + (3 * (mHistSizeNum + 10) + h) * thikness;
246
mP1.y = sizeRgba.height-1;
247
mP2.y = mP1.y - 2 - (int)mBuff[h];
248
Imgproc.line(rgba, mP1, mP2, mWhilte, thikness);
251
Imgproc.calcHist(Arrays.asList(mIntermediateMat), mChannels[0], mMat0, hist, mHistSize, mRanges);
252
Core.normalize(hist, hist, sizeRgba.height/2, 0, Core.NORM_INF);
253
hist.get(0, 0, mBuff);
254
for(int h=0; h<mHistSizeNum; h++) {
255
mP1.x = mP2.x = offset + (4 * (mHistSizeNum + 10) + h) * thikness;
256
mP1.y = sizeRgba.height-1;
257
mP2.y = mP1.y - 2 - (int)mBuff[h];
258
Imgproc.line(rgba, mP1, mP2, mColorsHue[h], thikness);
262
case ImageManipulationsActivity.VIEW_MODE_CANNY:
263
rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
264
Imgproc.Canny(rgbaInnerWindow, mIntermediateMat, 80, 90);
265
Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4);
266
rgbaInnerWindow.release();
269
case ImageManipulationsActivity.VIEW_MODE_SOBEL:
270
Mat gray = inputFrame.gray();
271
Mat grayInnerWindow = gray.submat(top, top + height, left, left + width);
272
rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
273
Imgproc.Sobel(grayInnerWindow, mIntermediateMat, CvType.CV_8U, 1, 1);
274
Core.convertScaleAbs(mIntermediateMat, mIntermediateMat, 10, 0);
275
Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4);
276
grayInnerWindow.release();
277
rgbaInnerWindow.release();
280
case ImageManipulationsActivity.VIEW_MODE_SEPIA:
281
rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
282
Core.transform(rgbaInnerWindow, rgbaInnerWindow, mSepiaKernel);
283
rgbaInnerWindow.release();
286
case ImageManipulationsActivity.VIEW_MODE_ZOOM:
287
Mat zoomCorner = rgba.submat(0, rows / 2 - rows / 10, 0, cols / 2 - cols / 10);
288
Mat mZoomWindow = rgba.submat(rows / 2 - 9 * rows / 100, rows / 2 + 9 * rows / 100, cols / 2 - 9 * cols / 100, cols / 2 + 9 * cols / 100);
289
Imgproc.resize(mZoomWindow, zoomCorner, zoomCorner.size());
290
Size wsize = mZoomWindow.size();
291
Imgproc.rectangle(mZoomWindow, new Point(1, 1), new Point(wsize.width - 2, wsize.height - 2), new Scalar(255, 0, 0, 255), 2);
292
zoomCorner.release();
293
mZoomWindow.release();
296
case ImageManipulationsActivity.VIEW_MODE_PIXELIZE:
297
rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
298
Imgproc.resize(rgbaInnerWindow, mIntermediateMat, mSize0, 0.1, 0.1, Imgproc.INTER_NEAREST);
299
Imgproc.resize(mIntermediateMat, rgbaInnerWindow, rgbaInnerWindow.size(), 0., 0., Imgproc.INTER_NEAREST);
300
rgbaInnerWindow.release();
303
case ImageManipulationsActivity.VIEW_MODE_POSTERIZE:
305
Imgproc.cvtColor(rgbaInnerWindow, mIntermediateMat, Imgproc.COLOR_RGBA2RGB);
306
Imgproc.pyrMeanShiftFiltering(mIntermediateMat, mIntermediateMat, 5, 50);
307
Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_RGB2RGBA);
309
rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
310
Imgproc.Canny(rgbaInnerWindow, mIntermediateMat, 80, 90);
311
rgbaInnerWindow.setTo(new Scalar(0, 0, 0, 255), mIntermediateMat);
312
Core.convertScaleAbs(rgbaInnerWindow, mIntermediateMat, 1./16, 0);
313
Core.convertScaleAbs(mIntermediateMat, rgbaInnerWindow, 16, 0);
314
rgbaInnerWindow.release();