【问题标题】:How to capture an image in android with coordinates如何在带有坐标的android中捕获图像
【发布时间】:2013-07-12 23:29:13
【问题描述】:

我是 android 新手,我想把我的问题摆在你面前,

我想捕捉四个坐标之间的图像,如下所示..

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

那我怎样才能得到框内的图像并将其设置为另一个布局作为背景。

各位,请让我摆脱这种逻辑......

【问题讨论】:

    标签: java android image-processing bitmap image-manipulation


    【解决方案1】:

    这将(很可能)从 4、5、6 等点创建图像,您可以在 ImageView 上手动单击以获取。这应该适用于选择的 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;
                }
            }
        });
    }
    

    【讨论】:

    • 你为什么要拍两张位图?...你能解释一下上面的代码吗?
    【解决方案2】:

    我终于找到解决问题的方法,我想和你分享,

    首先,这是根据+12级的转化理论来完成的。 好的,我的问题在“OpenCv for Android”的帮助下解决了

    这是代码..

    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;
    }
    
    
    }
    

    如果有人有疑问,请把它放在这里..

    祝你编码愉快,拉姆..

    【讨论】:

    • 嗨 Ramesh,您的代码仅对矩形大小的裁剪有用,但实际上我需要的是使用四个坐标裁剪图像,形状不仅适用于矩形,它会根据四个点而变化(四边形)
    • 它不仅适用于矩形,适用于任何由 4 个点组成的形状。你有没有运行我的代码 Manoj... 这里所有这些坐标都被单独拖动到图像边界内的任何位置。
    • 为什么需要 sourceBitmap1?
    • 可以分享一下这个活动的布局吗
    • @RameshJ 可以分享一下这个活动的布局吗?
    【解决方案3】:

    至于获取坐标内的图像

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

    这将创建一个像你之后的裁剪位图

    【讨论】:

    • 感谢您提供重播,但这是用于矩形位图..但我需要四个坐标的帮助...@Roy james
    • 这将创建一个矩形裁剪图像 - 不是吗?
    • 是啊抱歉哈哈只看了一眼图片,还以为是你要的矩形
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2021-10-11
    • 2013-02-04
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2017-04-15
    • 2023-04-05
    相关资源
    最近更新 更多