如何在Android中使用坐标捕获图像

4

我刚了解安卓,并希望向您提出我的问题。

我想在以下四个坐标之间捕获图像,如下所示:

enter image description here

首先我将图像转换为位图,然后将其设置为相对布局的背景。我知道这四个坐标。

那么我该如何获取框内的图像并将其设置为另一个布局的背景?

请帮我解决这个问题。

3个回答

7

最终我找到了解决方案并想与您分享,

首先,这是基于+12级转换理论完成的。好的,我的问题已经通过“安卓OpenCv”的帮助得到了解决。

以下是代码...

public class MainActivity extends Activity implements CvCameraViewListener2,OnTouchListener 
{

Bitmap sourceBitmap,descBitmap,sourceBitmap1;
ImageView view,view2;
SurfaceView amSurfaceView ;
Mat mRgba;
  private CameraBridgeViewBase mOpenCvCameraView;     
private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i("Yesssssssss", "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }

};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    // initialise bitmap for crop is here
    Bitmap bitmap_source=BitmapFactory.decodeResource(getResources(), R.drawable.quadone);
    if(bitmap_source==null)
        Log.e("bitmap Null","nulllllll");

    // these values should not exceed the limits of bitmap..



    Log.e("Bitmap"," "+bitmap_source.getWidth()+" "+bitmap_source.getHeight());


    sourceBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.quadone);
    sourceBitmap1 =BitmapFactory.decodeResource(getResources(), R.drawable.quadone);
    descBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    view = (ImageView) findViewById(R.id.imageView1);
    view2=(ImageView) findViewById(R.id.imageView2);

    view.setImageBitmap(sourceBitmap1);
    view.setOnTouchListener(this);
      mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.color_blob_detection_activity_surface_view);
        mOpenCvCameraView.setCvCameraViewListener(this);
    Log.e("MAtt","Startttttttttmmmmmmmmmtttttttt");
    sourceBitmap =bitmap_source;
             if (!OpenCVLoader.initDebug()) {
                    // Handle initialization error
                }
             Mat inputMat = new Mat();
             Mat outputMat = new Mat();
             descBitmap=sourceBitmap;
             Utils.bitmapToMat(sourceBitmap, inputMat);
                List<Point> src_pnt = new ArrayList<Point>();
                Point p0 = new Point(0, 0);
                src_pnt.add(p0);
                Point p1 = new Point(10, 100);
                src_pnt.add(p1);
                Point p2 = new Point(100, 125);
                src_pnt.add(p2);
                Point p3 = new Point(90, 20);                   
                src_pnt.add(p3);
                Mat startM = Converters.vector_Point2f_to_Mat(src_pnt);

                List<Point> dst_pnt = new ArrayList<Point>();
                Point p4 = new Point(0.0, 0.0);
                dst_pnt.add(p4);
                Point p5 = new Point(0.0, sourceBitmap.getHeight());
                dst_pnt.add(p5);
                Point p6 = new Point(sourceBitmap.getWidth(), sourceBitmap.getHeight());
                dst_pnt.add(p6);
                Point p7 = new Point(sourceBitmap.getWidth(), 0);
                dst_pnt.add(p7);
                Mat endM = Converters.vector_Point2f_to_Mat(dst_pnt);
                Mat perspectiveTransform = Imgproc.getPerspectiveTransform(startM, endM);
                Size size = new Size(sourceBitmap.getWidth(), sourceBitmap.getHeight());
                Scalar scalar = new Scalar(50.0);
                Imgproc.warpPerspective(inputMat, outputMat, perspectiveTransform, size, Imgproc.INTER_LINEAR + Imgproc.CV_WARP_FILL_OUTLIERS, Imgproc.BORDER_DEFAULT, scalar);

                Log.e("1=",""+inputMat.cols()+" "+inputMat.rows());
                Log.e("outmat.."," "+outputMat.cols()+" "+outputMat.rows());
                Utils.matToBitmap(outputMat, descBitmap);
                view2.setImageBitmap(descBitmap);

             // ram@san 


}

@Override
public void onCameraViewStarted(int width, int height) {
    // TODO Auto-generated method stub
    Log.e("onCameraViewStarted","onCameraViewStarted");
}

@Override
public void onCameraViewStopped() {
    // TODO Auto-generated method stub
    Log.e("onCameraViewStopped","onCameraViewStopped");
}

@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        // TODO Auto-generated method stub
mRgba= new Mat();
Utils.bitmapToMat(sourceBitmap, mRgba);
Utils.matToBitmap(mRgba, descBitmap);
view2.setImageBitmap(sourceBitmap);
        return mRgba;
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    return false;
}


}

如果有任何疑问,请在此处提出。

祝编码愉快,Ram..


嗨,Ramesh,你的代码只适用于矩形大小裁剪,但实际上我需要使用四个坐标来裁剪图像,形状不仅限于矩形,它基于四个点而变化(四边形)。 - Manoj
这不仅适用于矩形,也适用于由4个点组成的任何形状。Manoj,你运行了我的代码吗?在这里,所有这些坐标都可以单独拖动到图像边界内的任何位置。 - Ramesh J
你为什么需要sourceBitmap1? - Gilberto Ibarra
你能分享一下这个活动的布局吗? - Qadir Hussain
@RameshJ,你能分享一下这个活动的布局吗? - Qadir Hussain

0

关于获取坐标内的图像

Bitmap croppedBmp = Bitmap.createBitmap(originalBmp, startx, starty, endx, endy);

这将创建一个像你想要的那样裁剪过的位图


谢谢您的回复,但这是针对矩形位图的...但我需要通过四个坐标来实现...@Roy James - Ramesh J
这将创建一个矩形裁剪图像 - 是吗? - g00dy
抱歉哈哈,我只是匆匆一瞥图片,以为你想要一个矩形。 - Roy James Schumacher

0

这将(很可能)从您在ImageView上手动单击以获取的4、5、6等点创建图像。这应该适用于选择超过4个点的情况。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ImageView imageView = (ImageView) findViewById(R.id.img);
    compositeImageView = (ImageView) findViewById(R.id.imageView);

    Bitmap bitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.drawable_android);
    Bitmap bitmap2=BitmapFactory.decodeResource(getResources(), R.drawable.drawable_android_cr);

    Bitmap resultingImage=Bitmap.createBitmap(320, 480, bitmap1.getConfig());
    Canvas canvas = new Canvas(resultingImage);

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    Path path=new Path();

    imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
                // textView.setText("Touch coordinates : " +String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
                Log.e("X",String.valueOf(event.getX())+"");
                Log.e("y",String.valueOf(event.getY())+"");
                path.lineTo(String.valueOf(event.getX()), String.valueOf(event.getY()));
            }
            if(/*Touch count == 4 or 5 or 6 etc.*/){
                canvas.drawPath(path, paint);
                paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
                canvas.drawBitmap(bitmap2, 0, 0, paint);
                compositeImageView.setImageBitmap(resultingImage);
                return true;
            }
        }
    });
}

为什么要使用两个位图?...您能详细解释一下上面的代码吗? - SergioGeeK7

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