SurfaceView+Camera+OpenCv自定義相機保存圖片

至於如何在項目中如何添加OpenCv的SDK在此不再贅述:我引入的OpenCv-SDK版本爲OpenCV-3.1.0-android-sdk

在Activity中實現CameraBridgeViewBase.CvCameraViewListener2接口並重寫其方法,在

Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame)方法中可以使用OpenCv的保存圖片的方法,如下:
Imgcodecs.imwrite("/storage/emulated/0/" + "OpenCvimwrite.jpg", inputFrame.rgba());
方法參數爲:1.圖片名稱(包括路徑)2.Mat類型的數據
注:此方法保存的圖片分辨率和預覽分辨率相同(即Camera的PreviewSize屬性)
另外此圖片可能比較模糊,通過查看JavaCameraView類中的Boolean initializeCamera(int width,int height)方法發現有以下兩行代碼:
   
    int size = mFrameWidth * mFrameHeight;
    size  = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat()) / 8;
將size改爲
    size = size * ImageFormat.getBitsPerPixel(params.getPreviewFormat());
照片的效果會稍微好一點。
下面切入主題,添加保存照片的方法:
在JavaCameraView類中添加方法:
public void tackPhoto(final String name) {
        if (mCamera != null) {
            mCamera.takePicture(null, null, new Camera.PictureCallback() {
                @Override
                public void onPictureTaken(byte[] data, Camera camera) {
                    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
                    saveMyBitmap(bmp, name);
                }
            });
        }
 public void saveMyBitmap(Bitmap mBitmap, String photoName) {
        if (isMediaMounted()) {
            String SDCardPath = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
            createFileDir(SDCardPath + File.separator + "OpenCv");
            String FilePath = SDCardPath + File.separator + "OpenCv" + File.separator + photoName + ".jpg";
            File file = new File(FilePath);
//        "/storage/emulated/0/OpenCv" + "OpenCv.jpg",
            BufferedOutputStream bos = null;
            try {
                FileOutputStream fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos);
                mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                bos.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (mBitmap != null) {
                        mBitmap.recycle();
                    }
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            Log.e(TAG, "saveMyBitmap: 沒有掛載內存卡,無法保存圖片");
        }
    }

 /**
     * SD卡是否掛載
     *
     * @return
     */
    public static boolean isMediaMounted() {
        String status = Environment.getExternalStorageState();
        if (status.equals(Environment.MEDIA_MOUNTED)) {
            return true;
        } else {
            return false;
        }
    }

這樣在Activity中就可以調用JavaCameraView的tackPhoto()方法拍照了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章