在camera2上裁剪矩形子部分并将其传递给opencv进行处理

问题描述:

我设法绘制了一个覆盖矩形,以便矩形内部是唯一要处理的部分,应用程序应该忽略相机区域的其余部分。 link to Screenshot在camera2上裁剪矩形子部分并将其传递给opencv进行处理

的问题是我要裁剪上onimagaavailable功能上面的矩形,如下图所示:

@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) 
    } 

这是我绘制矩形覆盖上camera2的顶部

@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); 

} 

请码帮助/告诉我可以使用哪个代码从ImageReader图像裁剪矩形,以便我可以将裁剪后的图像传递给我的处理算法

+0

请注意,您可以使用OpenCV相机,并在'onCameraFrame()'中裁剪预览图像,以便相同的子Mat进行显示和图像处理。请参阅https://stackoverflow.com/a/47519725/192373 –

在onImageAvailable(),您可以使用 Bitmap.createBitmap如果是JPEG格式,你转换为位图

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

如果使用YUV可以减少存储和使用compressToJpeg与矩形,它更轻过程

yuv.compressToJpeg(rect, compress, out);