2016-08-29 2 views
0

В настоящее время я использую opencv, что хочу, когда пользователь нажимает на экран, конечно, экран/объект с отображаемой камеры, он выделяет все необходимые/похожие цвета: Color-Blob-Detector. Video без скриншота.Black Screenshot android OpenCv

Внизу есть значок маленькой камеры для запуска скриншота (imagebutton), однако при скриншотах результат изображения всегда черный. То, что я хотел, - это когда выделены нужные цвета, и я нажимаю скриншот прогматически (это ImageButton), он отображает изображение экрана (включая выделенные объекты) и сохраняет изображение в файле.

Я также попытался использовать camera control из opencv для сфотографирования, но мне так сложно объединить эти два.

public class Camera extends Activity implements OnTouchListener, CvCameraViewListener2 { 
private static final String TAG    = "OCVSample::Activity"; 

private boolean    mIsColorSelected = false; 
private Mat     mRgba; 
private Scalar    mBlobColorRgba; 
private Scalar    mBlobColorHsv; 
private ColorBlobDetector mDetector; 
private Mat     mSpectrum; 
private Size     SPECTRUM_SIZE; 
private Scalar    CONTOUR_COLOR; 


private CameraBridgeViewBase mOpenCvCameraView; 
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: 
      { 
       Log.i(TAG, "OpenCV loaded successfully"); 
       mOpenCvCameraView.enableView(); 
       mOpenCvCameraView.setOnTouchListener(Camera.this); 
      } break; 
      default: 
      { 
       super.onManagerConnected(status); 
      } break; 
     } 
    } 
}; 

public Camera() { 
    Log.i(TAG, "Instantiated new " + this.getClass()); 
} 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.i(TAG, "called onCreate"); 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.colorblobdetector); 
    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.activity_java_surface_view); 
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 
    mOpenCvCameraView.setCvCameraViewListener(this); 

    if (!OpenCVLoader.initDebug()) { 
     Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working."); 
    } else { 
     Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working."); 
    } 


} 





    public void camera_b(View v) 
    { 
     String path = Environment.getExternalStorageDirectory().toString() + "/" + "hellp.jpg"; 

     v = getWindow().getDecorView().getRootView(); 
     v.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache()); 
     v.setDrawingCacheEnabled(false); 

     OutputStream out = null; 
     File imageFile = new File(path); 

     try { 
      out = new FileOutputStream(imageFile); 
      // choose JPEG format 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      out.flush(); 
     } catch (FileNotFoundException e) { 
      // manage exception 
     } catch (IOException e) { 
      // manage exception 
     } finally { 

      try { 
       if (out != null) { 
        out.close(); 
       } 

      } catch (Exception exc) { 
      } 

     } 
    } 


    @Override 
    public void onPause() 
    { 
     super.onPause(); 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     if (!OpenCVLoader.initDebug()) { 
      Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); 
      OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback); 
     } else { 
      Log.d(TAG, "OpenCV library found inside package. Using it!"); 
      mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
     } 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 
    } 

    public void onCameraViewStarted(int width, int height) { 
     mRgba = new Mat(height, width, CvType.CV_8UC4); 
     mDetector = new ColorBlobDetector(); 
     mSpectrum = new Mat(); 
     mBlobColorRgba = new Scalar(255); 
     mBlobColorHsv = new Scalar(255); 
     SPECTRUM_SIZE = new Size(200, 64); 
     CONTOUR_COLOR = new Scalar(255,0,0,255); 
    } 

    public void onCameraViewStopped() { 
     mRgba.release(); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     int cols = mRgba.cols(); 
     int rows = mRgba.rows(); 

     int xOffset = (mOpenCvCameraView.getWidth() - cols)/2; 
     int yOffset = (mOpenCvCameraView.getHeight() - rows)/2; 

     int x = (int)event.getX() - xOffset; 
     int y = (int)event.getY() - yOffset; 

     Log.i(TAG, "Touch image coordinates: (" + x + ", " + y + ")"); 

     if ((x < 0) || (y < 0) || (x > cols) || (y > rows)) return false; 

     Rect touchedRect = new Rect(); 

     touchedRect.x = (x>4) ? x-4 : 0; 
     touchedRect.y = (y>4) ? y-4 : 0; 

     touchedRect.width = (x+4 < cols) ? x + 4 - touchedRect.x : cols - touchedRect.x; 
     touchedRect.height = (y+4 < rows) ? y + 4 - touchedRect.y : rows - touchedRect.y; 

     Mat touchedRegionRgba = mRgba.submat(touchedRect); 

     Mat touchedRegionHsv = new Mat(); 
     Imgproc.cvtColor(touchedRegionRgba, touchedRegionHsv, Imgproc.COLOR_RGB2HSV_FULL); 

     // Calculate average color of touched region 
     mBlobColorHsv = Core.sumElems(touchedRegionHsv); 
     int pointCount = touchedRect.width*touchedRect.height; 
     for (int i = 0; i < mBlobColorHsv.val.length; i++) 
      mBlobColorHsv.val[i] /= pointCount; 

     mBlobColorRgba = converScalarHsv2Rgba(mBlobColorHsv); 

     Log.i(TAG, "Touched rgba color: (" + mBlobColorRgba.val[0] + ", " + mBlobColorRgba.val[1] + 
       ", " + mBlobColorRgba.val[2] + ", " + mBlobColorRgba.val[3] + ")"); 

     mDetector.setHsvColor(mBlobColorHsv); 

     Imgproc.resize(mDetector.getSpectrum(), mSpectrum, SPECTRUM_SIZE); 

     mIsColorSelected = true; 

     touchedRegionRgba.release(); 
     touchedRegionHsv.release(); 

     return false; // don't need subsequent touch events 
    } 

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
     mRgba = inputFrame.rgba(); 

     if (mIsColorSelected) { 
      mDetector.process(mRgba); 
      List<MatOfPoint> contours = mDetector.getContours(); 
      Log.e(TAG, "Contours count: " + contours.size()); 
      Imgproc.drawContours(mRgba, contours, -1, CONTOUR_COLOR); 

      Mat colorLabel = mRgba.submat(4, 68, 4, 68); 
      colorLabel.setTo(mBlobColorRgba); 

      Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70, 70 + mSpectrum.cols()); 
      mSpectrum.copyTo(spectrumLabel); 
     } 

     return mRgba; 
    } 

    private Scalar converScalarHsv2Rgba(Scalar hsvColor) { 
     Mat pointMatRgba = new Mat(); 
     Mat pointMatHsv = new Mat(1, 1, CvType.CV_8UC3, hsvColor); 
     Imgproc.cvtColor(pointMatHsv, pointMatRgba, Imgproc.COLOR_HSV2RGB_FULL, 4); 

     return new Scalar(pointMatRgba.get(0, 0)); 
    } 
} 

Как вы можете видеть camera_b где все скриншот happens.The XML для детектора цвета двоичных объектов: ColorBlobXML (я не могу вставить XML-код здесь)

Image выхода. Как вы можете видеть, он может сделать снимок экрана, а не ожидаемый Image. (Это Image производится с использованием мощности + VOL вниз)

ответ

0

Поместите это в AndroidManifest.xml

<uses-permission android:name="android.permission.CAMERA"/> 

И в этом

@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.i(TAG, "called onCreate"); 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.colorblobdetector); 
    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.activity_java_surface_view); 
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 
    mOpenCvCameraView.setCvCameraViewListener(this); 
    mOpenCvCameraView.setCameraIndex(0); //0 = back and 1 = frontal 
    mOpenCvCameraView.enableView(); 

    if (!OpenCVLoader.initDebug()) { 
     Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working."); 
    } else { 
     Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working."); 
    } 
+0

setCameraIndex (0) не помогло. – Shulz