在camera2上裁剪矩形子区域并将其传递给OpenCV进行处理

3
我已经成功绘制了一个覆盖矩形,使得矩形内的内容是唯一需要处理的,应用程序应忽略相机区域的其余部分。 截图链接 问题在于,我想在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图像中的矩形,以便我可以将裁剪后的图像传递给我的处理算法。


请注意,您可以在onCameraFrame()中使用OpenCV相机,并裁剪预览图像,以便将相同的子Mat发送到显示和图像处理。请参见https://stackoverflow.com/a/47519725/192373。 - Alex Cohn
1个回答

4
在 onImageAvailable() 中,如果你将 JPEG 格式转换为位图,则可以使用 Bitmap.createBitmap。
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接