2017-05-29 1 views
2

Ich habe es geschafft, ein Overlay-Rechteck zu zeichnen, so dass nur innerhalb des Rechtecks ​​verarbeitet wird und die App den Rest der Kamera-Region ignorieren sollte. link to ScreenshotCrop Rechteck Teilabschnitt auf Kamera2 und übergeben Sie es zur Verarbeitung auf opencv

Das Problem ist, ich das oben Rechteck auf onimagaavailable Funktion zuschneiden möchten, wie unten dargestellt:

@Override 
    public void onImageAvailable(ImageReader reader) { 
     Image img = reader.acquireLatestImage(); 

     //THIS IS WHERE I WANT TO CROP THE IMAGE TO ONLY SHOW WHAT WAS IN THE 
     // ABOVE DRAWN RECTANGLE BUT I DONT KNOW HOW, I HAVE GOOGLED FOR THE 
     // PAST WEEK ON THIS 


     //after processing i should pass the image to my opencv processing 
     //algorithm 
     process(img) 
    } 

Das ist mein Code ist auf der Oberseite des camera2 das Rechteck Overlay zum Zeichnen

@Override 
protected void onDraw(Canvas canvas) { // Override the onDraw() Method 
    super.onDraw(canvas); 

    paint.setStyle(Paint.Style.STROKE); 
    paint.setColor(Color.WHITE); 
    paint.setStrokeWidth(10); 
    int width = canvas.getWidth()/2; 
    int height = canvas.getHeight()/4; 
    int height1 = canvas.getHeight()/3; 
    int height_1 = canvas.getHeight()/10; 

    int fin = canvas.getWidth() + canvas.getWidth()/3; 
    int top = height/4; 

    Log.e("top", top + ""); 
    canvas.drawRect(canvas.getWidth() - (canvas.getWidth() - 150), 
    canvas.getHeight() - fin, canvas.getWidth() - 150, height + top, paint); 

} 

freundlicher Hilfe/sagen Sie mir, welchen Code ich verwenden kann, um das Rechteck aus dem ImageReader-Bild zuzuschneiden, damit ich das zugeschnittene Bild an meinen Verarbeitungsalgorithmus übergeben kann

+0

Beachten Sie, dass Sie die OpenCV-Kamera verwenden und das Vorschaubild in 'onCameraFrame()' zuschneiden können, damit die gleiche Sub-Mat zur Anzeige und zur Bildbearbeitung verwendet wird. Siehe https://stackoverflow.com/a/47519725/192373 –

Antwort

2

in onImageAvailable() können Sie Bitmap.createBitmap verwenden, wenn es JPEG-Format ist, dass Sie

Rect rectCrop = new Rect(left,top,right,bottom); 
Bitmap bitmapRotated = Bitmap.createBitmap(bitmap, rectCrop.left, rectCrop.top, rectCrop.width(), rectCrop.height(), mat, true); 

wenn Sie YUV verwenden Sie Speicher reduzieren und verwenden compressToJpeg mit Rechteck, es ist mehr leichter Prozess

in Bitmap umgewandelt
yuv.compressToJpeg(rect, compress, out); 
Verwandte Themen