Я использую tessaract для сканирования текста и преобразования его в строку, насколько это хорошо, но у меня проблема с полутоновым изображением. У меня есть изображения, снятые с моей камерой, и я хочу получить их в оттенках серого и для их масштабирования, чтобы сохранить некоторую память, я сделал это, используя BitmapFactory.Options и метод inSimpleSize (поместите его в 4). После этого я попытался получить изображение из папки, в которой она находится, и полутоновой. Но не получилось - текст не может быть извлечен из фотографии. Однако, когда я удалил гранулирование, работала. Вот мой код:Оттенки серого не влияют на мое изображение
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeFile(imgUri.getPath() , options);
// bitmap = toGrayscale(bitmap);
result = extractText(bitmap);
textView.setText(result);
Метод extractText просто вызывает Tessaract и сканировать изображение, и это работает отлично без grayscaling.
Мой toGrayscale код, который я нашел в Интернете (он работает, я попробовал его в качестве фильтра и я была счастлива с ним):
public Bitmap toGrayscale(Bitmap bmpOriginal)
{
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();
Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
c.drawBitmap(bmpOriginal, 0, 0, paint);
return bmpGrayscale;
}
Вот мой код для съемки фотографий с камеры:
if (captureImg != null) {
captureImg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startCameraActivity();
}
});
private void startCameraActivity() {
try {
String IMGS_PATH = Environment.getExternalStorageDirectory().toString() + "/Noetic/imgs";
prepareDirectory(IMGS_PATH);
String img_path = IMGS_PATH + "/ocr.jpg";
outputFileUri = Uri.fromFile(new File(img_path));
final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, PHOTO_REQUEST_CODE);
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
}
Я искал решение, но ничего не нашел. У меня есть некоторые теории, почему это не работает - один из них заключается в том, что мой метод градации серого создает тот же образ, но новый (так что BitmapFactory.Options.getSampleSize становится бесполезным). Любая помощь будет очень полезна. Спасибо заранее!