Google 使用 OpenCV 将 v2 快照映射到灰度

Google Map v2 snapshot to grayscale using OpenCV

我正在尝试将从 google 地图拍摄的快照转换为灰度(阈值等)但是我不明白 opencv 是如何工作的,我已经成功地实现了它但我不明白人们如何定义什么图像处理,这是我的地图活动代码。

package com.example.admin.pathplaning;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.GoogleMap.SnapshotReadyCallback;


import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.Map;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    GPSTracker gps;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        gps = new GPSTracker(MapsActivity.this);
        double latitude = gps.getLatitude();
        double longitude = gps.getLongitude();
        // Add a marker in operators possition and move the camera
        LatLng operator = new LatLng(latitude,longitude);
        mMap.addMarker(new MarkerOptions().position(operator).title("Boat Operator"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(operator));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(19.0f));

        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
            @Override

            public void onMapClick(LatLng point) {
                MarkerOptions marker = new MarkerOptions().position(
                        new LatLng(point.latitude,point.longitude)).title("Destenation");
                mMap.addMarker(marker);
                Bitmap bitmap;
                 SnapshotReadyCallback callback = new  SnapshotReadyCallback() {
                    @Override

                    public void onSnapshotReady(Bitmap bitmap) {

                        Date now = new Date();
                        android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss",now);
                        try {
                            String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg";
                            File imageFile = new File(mPath);
                            FileOutputStream out = new FileOutputStream(imageFile);
                            bitmap.compress(Bitmap.CompressFormat.PNG,90,out);
                            Log.d("Image:","Saved Snashot. Starting covertion");
                            String gPath =  Environment.getExternalStorageDirectory().toString() + "/" + now + "gray.jpg";
                            ImageView imgview = (ImageView) findViewById(R.id.imageView);
                            Bitmap myBitmap = BitmapFactory.decodeFile(mPath);
                            imgview.setImageBitmap(myBitmap);
                            Mat mRgba = new Mat();
                            Mat gray = new Mat(CvType.CV_8UC1);
                            Imgproc.cvtColor(mRgba,gray,Imgproc.COLOR_BGR2GRAY);

                        }

                        catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };
                mMap.snapshot(callback);
                Log.d("test","test2");
            }
        });

    }
}

这里是 XML

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.admin.pathplaning.MainActivity">

    <fragment
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="149dp"
        android:layout_height="match_parent"
        tools:context="com.example.admin.pathplaning.MapsActivity"
        android:layout_row="0"
        android:layout_column="1" />

    <ImageView
        android:layout_width="209dp"
        android:layout_height="485dp"
        app:srcCompat="@drawable/cast_abc_scrubber_control_off_mtrl_alpha"
        android:id="@+id/imageView" />
</GridLayout>

在这里你可以看到我得到的一个错误,但是,是的,我仍然无法理解发生了什么,即使从 openCV 的文档中也没有,这对我来说真的很新

E/art: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__) D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.admin.pathplaning, PID: 8041 java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__) at org.opencv.core.Mat.n_Mat(Native Method) at org.opencv.core.Mat.(Mat.java:24) at com.example.admin.pathplaning.MapsActivity.onSnapshotReady(MapsActivity.java:95) at com.google.android.gms.maps.GoogleMap.zzH(Unknown Source) at com.google.android.gms.maps.internal.zzag$zza.onTransact(Unknown Source) at android.os.Binder.transact(Binder.java:514) at com.google.android.gms.maps.internal.dn.a(:com.google.android.gms.DynamiteModulesB:117) at com.google.maps.api.android.lib6.impl.a.a(:com.google.android.gms.DynamiteModulesB:92) at com.google.maps.api.android.lib6.gmm6.api.y.run(:com.google.android.gms.DynamiteModulesB:2014) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6209) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) D/AppTracker: App Event: crash I/Process: Sending signal. PID: 8041 SIG: 9 Application terminated.

嘿所以经过大量研究我终于明白我做错了什么,我试图将 Nothing 转换为灰色,我找到了我的答案 here

  Mat tmp = new Mat (myBitmap.getWidth(), myBitmap.getHeight(), CvType.CV_8UC1);
                        Utils.bitmapToMat(myBitmap, tmp);
                        Imgproc.cvtColor(tmp, tmp, Imgproc.COLOR_RGB2GRAY);
                        Utils.matToBitmap(tmp, myBitmap);
                      //  Utils.matToBitmap(mat1,img);

                        imgview2.setImageBitmap(myBitmap);

留在这里也许对以后的人有帮助