/* Copyright (C) 2014,2015 Philipp Lenk
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package de.hu_berlin.informatik.spws2014.mapever.camera;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera.Size;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import java.util.List;
import de.hu_berlin.informatik.spws2014.mapever.R;
import de.hu_berlin.informatik.spws2014.mapever.entzerrung.CornerDetector;
@SuppressWarnings("deprecation")
public class CornerDetectionCamera extends Activity implements CvCameraViewListener2
{
private class AsyncCornerDetection extends AsyncTask<Void, Void, Void>
{
public AsyncCornerDetection(CornerDetectionCamera parent)
{
this.parent = parent;
}
protected Void doInBackground(Void... unused)
{
while (parent != null && parent.run_detection)
{
if (parent.last_frame != null)
{
parent.last_corners = CornerDetector.guess_corners(parent.last_frame);
}
}
return null;
}
private CornerDetectionCamera parent;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_cornerdetectioncamera);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
camera_view = (CornerDetectionView) findViewById(R.id.corner_detection_java_surface_view);
camera_view.setVisibility(SurfaceView.VISIBLE);
camera_view.setCvCameraViewListener(this);
camera_view.startMonitoringOrientation();
last_corners = new Point[] { new Point(), new Point(), new Point(), new Point() };
run_detection = true;
corner_detection_task = new AsyncCornerDetection(this);
corner_detection_task.execute();
}
public void onCameraViewStarted(int width, int height)
{
}
public void onCameraViewStopped()
{
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame)
{
last_frame = inputFrame.gray().clone();
Mat rgba_img = inputFrame.rgba();
Point[] corners = last_corners;
if (corners != null) {
for (Point p : corners)
Core.circle(rgba_img, p, 10, CIRCLE_COLOR);
Core.line(rgba_img, corners[0], corners[1], LINE_COLOR);
Core.line(rgba_img, corners[1], corners[2], LINE_COLOR);
Core.line(rgba_img, corners[2], corners[3], LINE_COLOR);
Core.line(rgba_img, corners[3], corners[0], LINE_COLOR);
}
return rgba_img;
}
@Override
public void onPause()
{
super.onPause();
if (camera_view != null)
{
camera_view.disableView();
camera_view.stopMonitoringOrientation();
}
}
@Override
public void onResume()
{
super.onResume();
// OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, loader_callback);
camera_view.enableView();
camera_view.startMonitoringOrientation();
}
public void onDestroy()
{
super.onDestroy();
if (camera_view != null)
{
camera_view.disableView();
camera_view.stopMonitoringOrientation();
}
run_detection = false;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
case CONFIRM_RESULT_CODE: {
if (resultCode == Activity.RESULT_OK)
{
Intent result_data = new Intent();
setResult(Activity.RESULT_OK, result_data);
camera_view.stopMonitoringOrientation();
run_detection = false;
finish();
}
break;
}
}
}
public void onTakePictureClick(View v)
{
// Dateinamen aus Intent lesen, oder Default verwenden
final String filename = this.getIntent().hasExtra(MediaStore.EXTRA_OUTPUT)
? this.getIntent().getStringExtra(MediaStore.EXTRA_OUTPUT)
: Environment.getExternalStorageDirectory().getPath() + "/temp.jpg";
Toast.makeText(this,
"Saving picture as " + filename,
Toast.LENGTH_SHORT
).show();
final CornerDetectionCamera this_ref = this;
camera_view.take_picture(filename, new CornerDetectionView.PictureCallback()
{
@Override
public void onPictureTaken()
{
if(this_ref.getIntent().hasExtra(NO_CONFIRM))
{
Intent result_data = new Intent();
this_ref.setResult(Activity.RESULT_OK, result_data);
this_ref.run_detection = false;
this_ref.finish();
}
else
{
Intent intent = new Intent(this_ref, de.hu_berlin.informatik.spws2014.mapever.camera.ConfirmImageActivity.class);
intent.putExtra("filename", filename);
startActivityForResult(intent, CONFIRM_RESULT_CODE);
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
preview_resolution_menu = menu.addSubMenu("PreviewResolution");
List<Size> available_resolutions = camera_view.get_preview_resolutions();
preview_resolution_items = new MenuItem[available_resolutions.size()];
int i = 0;
for (Size res : available_resolutions)
{
preview_resolution_items[i] = preview_resolution_menu.add(
PREVIEW_MENU_ID,
i,
Menu.NONE,
res.width + "x" + res.height
);
++i;
}
picture_resolution_menu = menu.addSubMenu("PictureResolution");
available_resolutions = camera_view.get_picture_resolutions();
picture_resolution_items = new MenuItem[available_resolutions.size()];
i = 0;
for (Size res : available_resolutions)
{
picture_resolution_items[i] = picture_resolution_menu.add(
PICTURE_MENU_ID,
i,
Menu.NONE,
res.width + "x" + res.height
);
++i;
}
List<String> flash_modes=camera_view.get_flash_modes();
if(flash_modes!=null)
{
flash_menu = menu.addSubMenu("FlashModes");
flash_menu_items = new MenuItem[flash_modes.size()];
i = 0;
for (String mode : flash_modes)
{
flash_menu_items[i] = flash_menu.add(
FLASH_MENU_ID,
i,
Menu.NONE,
mode
);
++i;
}
}
return true;
}
public boolean onOptionsItemSelected(MenuItem item)
{
if (item.getGroupId() == PREVIEW_MENU_ID)
{
List<Size> available_resolutions = camera_view.get_preview_resolutions();
Size requested_resolution = available_resolutions.get(item.getItemId());
camera_view.set_preview_resolution(requested_resolution);
Size new_resolution = camera_view.get_preview_resolution();
Toast.makeText(this,
"Set preview resolution to " + new_resolution.width + "x" + new_resolution.height,
Toast.LENGTH_SHORT
).show();
}
else if (item.getGroupId() == PICTURE_MENU_ID)
{
List<Size> available_resolutions = camera_view.get_picture_resolutions();
Size requested_resolution = available_resolutions.get(item.getItemId());
camera_view.set_picture_resolution(requested_resolution);
Size new_resolution = camera_view.get_picture_resolution();
Toast.makeText(this,
"Set picture resolution to " + new_resolution.width + "x" + new_resolution.height,
Toast.LENGTH_SHORT
).show();
}
else if (item.getGroupId() == FLASH_MENU_ID)
{
List<String> flash_modes=camera_view.get_flash_modes();
String requested_mode = flash_modes.get(item.getItemId());
camera_view.set_flash_mode(requested_mode);
Toast.makeText(this,
"Set flash mode to "+requested_mode,
Toast.LENGTH_SHORT
).show();
}
return true;
}
private AsyncCornerDetection corner_detection_task;
private Mat last_frame;
private Point[] last_corners;
private boolean run_detection;
private CornerDetectionView camera_view;
private SubMenu preview_resolution_menu, picture_resolution_menu, flash_menu;
private MenuItem[] preview_resolution_items, picture_resolution_items, flash_menu_items;
private static final int PREVIEW_MENU_ID = 1, PICTURE_MENU_ID = 2, FLASH_MENU_ID = 3;
private static final int CONFIRM_RESULT_CODE = 100;
private static final Scalar CIRCLE_COLOR = new Scalar(0, 255, 0, 255);
private static final Scalar LINE_COLOR = new Scalar(255, 0, 0);
public static final String NO_CONFIRM = "de.hu_berlin.informatik.spws2014.mapever.camera.CornerDetectionCamera.NoConfirm";
}