Сделать снимок с помощью CameraBridgeViewBase на openCV
У меня был бинарный образ. Теперь, как, когда я нажму на кнопку, я хочу взять ее.? Помогите мне, пожалуйста.
Это мой код:
public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener2, Camera.PictureCallback {
private static final String TAG = "MainActivity";
private JavaCameraView mOpenCvCameraView;
private static final int REQUEST_CODE = 123;
private Button mButton;
private Mat mRgba;
private Mat mByte;
private Mat imGgray, imgCandy;
CameraBridgeViewBase.CvCameraViewFrame inputFrame;
BaseLoaderCallback mBaseLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
super.onManagerConnected(status);
switch (status) {
case BaseLoaderCallback.SUCCESS:
{
mOpenCvCameraView.enableView();
break;
}
default:
{
super.onManagerConnected(status);
break;
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.detetionbutton);
mOpenCvCameraView = (JavaCameraView) findViewById(R.id.textdetetion_view);
mOpenCvCameraView.setCvCameraViewListener(this);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
mButton.setOnClickListener(new View.OnClickListener() { // take a picture
@Override
public void onClick(View v) {
}
});
}
@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null) {
mOpenCvCameraView.disableView();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null) {
mOpenCvCameraView.disableView();
}
}
@Override
public void onResume() {
super.onResume();
if (OpenCVLoader.initDebug() == true) {
Log.i(TAG, "opencv loaded");
mBaseLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
} else {
Log.i(TAG, "opencn not loade");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mBaseLoaderCallback);
}
}
@Override
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
mByte = new Mat(height, width, CvType.CV_8UC4);
imGgray = new Mat(height, width, CvType.CV_8UC4);
imgCandy = new Mat(height, width, CvType.CV_8UC1);
}
@Override
public void onCameraViewStopped() {
mRgba.release();
}
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
Imgproc.cvtColor(mRgba, imGgray, Imgproc.COLOR_RGB2GRAY);
Imgproc.adaptiveThreshold(imGgray, mByte, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 35, 5);
return mByte; // this is m Binary image
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {}
}
1 ответ
Так что со ссылкой на ваш пример кода. Вы можете сделать это двумя способами,
Вы можете использовать метод OpenCV onPictureTaken, чтобы захватить изображение и сохранить его в своем хранилище.
public void onPictureTaken(byte[] data, Camera camera) { //Log.i(TAG, "Saving a bitmap to file"); // The camera preview was automatically stopped. Start it again. mCamera.startPreview(); mCamera.setPreviewCallback(this); // Write the image in a file (in jpeg format) try { FileOutputStream fos = new FileOutputStream(mPictureFileName); fos.write(data); fos.close(); } catch (java.io.IOException e) { Log.e("PictureDemo", "Exception in photoCallback", e); } }
и поместите этот код внутри onClick Listener
mOpenCvCameraView.takePicture(fileName);
но дело в том, что изображение, которое отправляется в качестве предварительного просмотра на камеру, будет сохранено по умолчанию (если его изображение RBG будет сохранено, то изображение RGB будет сохранено, а если двоичное, то будет сохранено двоичное изображение)
Или вы можете создать кнопку на Android, а в слушателе onClick вы можете использовать imwrite и сохранить изображение, если ваша камера поддерживает захват onTouch, вы также можете использовать ее в методе onTouch. вставьте этот код в прослушиватель onClick или в прослушиватель onTouch (по вашему желанию).
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); String currentDateandTime = sdf.format(new Date()); String fileName = Environment.getExternalStorageDirectory().getPath() + "/sample_picture_" + currentDateandTime + ".jpg"; Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show(); String filename = "/storage/emulated/0/DCIM/Camera/samplepass.jpg"; Highgui.imwrite(filename,mByte);