Ask Your Question

Revision history [back]

Maybe you can begin with OpenAlpr.Here is the source code I ever used in this alpr system

import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.text.format.DateFormat; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast;

import com.openalpr.api.DefaultApi; import com.openalpr.api.invoker.ApiException; import com.openalpr.api.models.InlineResponse200; import com.yalantis.ucrop.UCrop; import com.yalantis.ucrop.UCropActivity;

import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Calendar; import java.util.Locale;

public class MainActivity extends AppCompatActivity { private final DefaultApi api = new DefaultApi(); private static final String TAG = "MainActivity"; Button reconize,select; TextView result,plate; ImageView showImage; Spinner spinner; String secretKey = "sk_960d6f4c62d1c20452c7613e"; String url = "https://qnwww2.autoimg.cn/youchuang/g6/M0A/FA/29/autohomecar__wKgH3FkZCr-AFH7zAAFPFgtP6pc751.jpg?imageView2/2/w/752|watermark/2/text/TEkzMw0K5rG96L2m5LmL5a62/font/5b6u6L2v6ZuF6buR/fontsize/270/fill/d2hpdGU=/dissolve/100/gravity/SouthEast/dx/5/dy/5"; File cameraFile,cropFile; private boolean isFromfile = false; String country = "us"; final Integer recognizeVehicle = 0; final String state = ""; final Integer returnImage = 1; final Integer topn = 10; final String prewarp = ""; private String cropPath = ""; String[] countrys ; String[] countryCodes ;

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

    reconize = (Button) findViewById(R.id.reconize);
    select = (Button) findViewById(R.id.selectImage);
    result = (TextView) findViewById(R.id.result);
    showImage = (ImageView) findViewById(R.id.imageShow);
    plate = (TextView) findViewById(R.id.plate);
    spinner = (Spinner) findViewById(R.id.spinner);

// GlideUtils.setUrlImage(this,url,showImage); countrys = getResources().getStringArray(R.array.countrys); countryCodes = getResources().getStringArray(R.array.country_codes);

    select.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String filename = DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg";
            cameraFile = new File(Environment.getExternalStorageDirectory() + "/Pictures/Camera/" + filename);
            if(!cameraFile.exists()){
                try {
                    cameraFile.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            Intent intent0 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            if (Build.VERSION.SDK_INT < 24) {
                intent0 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent0.putExtra("android.intent.extras.CAMERA_FACING", 0);
                intent0.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));
            } else {
                ContentValues contentValues = new ContentValues(1);
                intent0.putExtra("android.intent.extras.CAMERA_FACING", 0);
                contentValues.put(MediaStore.Images.Media.DATA, cameraFile.getAbsolutePath());
                Uri uri = MainActivity.this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
                intent0.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            }
            isFromfile = true;
            startActivityForResult(intent0, 200);
        }
    });
    reconize.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            result.setText("identifying...");
            plate.setText("");
            try {
                new Thread(){
                    @Override
                    public void run() {
                        super.run();
                        InlineResponse200 response = null;
                        try {
                            if(isFromfile){
                                response = api.recognizeFile(cropFile, secretKey, country, recognizeVehicle, state, returnImage, topn, prewarp);

                            }else {
                                response = api.recognizeUrl(url, secretKey, country, recognizeVehicle, state, returnImage, topn, prewarp);

                            }
                        } catch (ApiException e) {
                            e.printStackTrace();
                        }
                        final InlineResponse200 finalResponse = response;
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(finalResponse == null){
                                    Toast.makeText(MainActivity.this, "识别失败", Toast.LENGTH_SHORT).show();
                                    return;
                                }
                                Toast.makeText(MainActivity.this, "识别成功", Toast.LENGTH_SHORT).show();
                                if(finalResponse.getResults()!=null && finalResponse.getResults().size()>=1)
                                plate.setText("license plate number:"+finalResponse.getResults().get(0).getPlate());
                                result.setText("result:"+finalResponse.toString());
                            }
                        });
                    }
                }.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    ArrayAdapter<String> product_adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_singlechoice, countrys);
    spinner.setAdapter(product_adapter);
    spinner.setSelection(12);

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            country = countryCodes[position];
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode != RESULT_OK){
        return;
    }
    switch (requestCode) {
        case 200:

            if (!cameraFile.exists()) {
                return ;
            }
            Bitmap bitmap = null;
            if (resultCode== Activity.RESULT_OK){
                    try {
                        FileInputStream fis = new FileInputStream(cameraFile);
                        bitmap = BitmapFactory.decodeStream(fis);
                        fis.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    if (bitmap!=null) {
                        showImage.setImageBitmap(bitmap);
                    }
                cropPath = startUCrop(this,cameraFile.getPath(),UCrop.REQUEST_CROP,16,9);
            }
            break;
        case UCrop.REQUEST_CROP:
            final Uri resultUri = UCrop.getOutput(data);
            showImage.setImageURI(resultUri);
            cropFile = new File(cropPath);
            break;

        default:
            break;
    }
}

/**
 * Start the cutting
 * @param activity context
 * @param sourceFilePath You need to crop the absolute path of the image
 * @param requestCode such as:UCrop.REQUEST_CROP
 * @param aspectRatioX Crop image aspect ratio
 * @param aspectRatioY Crop image aspect ratio
 * @return
 */
public static String startUCrop(Activity activity, String sourceFilePath,
                                int requestCode, float aspectRatioX, float aspectRatioY) {
    Uri sourceUri = Uri.fromFile(new File(sourceFilePath));
    File outDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    if (!outDir.exists()) {
        outDir.mkdirs();
    }
    File outFile = new File(outDir, System.currentTimeMillis() + ".jpg");
    //Absolute path of cropped image
    String cameraScalePath = outFile.getAbsolutePath();
    Uri destinationUri = Uri.fromFile(outFile);
    //Initialization, first parameter: image to be cropped;

Second parameter: crop the image UCrop uCrop = UCrop.of(sourceUri, destinationUri); //Initialize the UCrop configuration UCrop.Options options = new UCrop.Options(); //Set an actionable gesture to crop the image options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL); //Whether to hide the bottom container, shown by default options.setHideBottomControls(true); // //Set toolbar color // options.setToolbarColor(ActivityCompat.getColor(activity, R.color.colorPrimary)); // //Set the status bar color // options.setStatusBarColor(ActivityCompat.getColor(activity, R.color.colorPrimary)); //Can I adjust the clipping box options.setFreeStyleCropEnabled(true); //UCrop seting uCrop.withOptions(options); //Set the aspect ratio of cropped images, such as 16:9 uCrop.withAspectRatio(aspectRatioX, aspectRatioY); //uCrop.useSourceImageAspectRatio(); //Skip clipping page uCrop.start(activity, requestCode); return cameraScalePath; }

}