Android:如何在不拍照的情况下从相机捕获文本?
Posted
技术标签:
【中文标题】Android:如何在不拍照的情况下从相机捕获文本?【英文标题】:Android : How to capture text from camera without taking picture? 【发布时间】:2017-06-03 18:23:23 【问题描述】:我想使用 tess-two(在 android 和 eclipse 中)捕获用相机显示的文本和数字而不拍照。 我不想保存图像文件。
类似这样的东西(它在相机上实时捕捉):
我用过 tess-two ,但我必须先拍照,然后再捕捉文字。 (使用链接:https://***.com/questions/19533273/best-ocr-optical-character-recognition-example-in-android)
我已经使用这个 (https://www.codeproject.com/Articles/840623/Android-Character-Recognition) 来创建我上传的图片之类的行为,但它也应该拍照。
那么我该如何实现呢?有可能吗?
【问题讨论】:
当然。使用相机 API。您将获得可以随意处理的图片流。无需将它们保存到文件中。 是苔丝强迫你“先拍照”吗? “拍照”是什么意思。苔丝只能从文件中读取吗?这就是你想说的吗?不是来自位图吗?请说清楚。 tess 只想要位图。 那么我的第一条评论成真了。 试试github.com/rmtheis/android-ocr 【参考方案1】:您可以按照 android 文档here 中的说明轻松获取缩略图的位图,但从您的问题来看,您似乎需要完整尺寸的图片位图,因此要获得完整尺寸的位图,您必须将相机对准到可以存储捕获图片的某个文件。
要获得完整大小的位图,试试这个
private String imagePath = "";
private void startCamera()
// create a collision-resistant file name
String fileUniqueName= new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = fileUniqueName + ".jpg";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
imagePath = storageDir.getAbsolutePath() + "/" + imageFileName;
File file = new File(imagePath);
Uri outputFileUri = Uri.fromFile(file);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(cameraIntent, 1);
处理捕获的图像
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == 1)
File tempFile = new File(imagePath);
if(tempFile.exists())
Bitmap requiredBitmap = BitmapFactory.decodeFile(tempFile.getAbsolutePath());
此捕获的图像不会显示在图库中。
【讨论】:
这将不允许实时查看图像【参考方案2】:或者,您可以使用免费的 SDK,无需拍照即可进行 OCR:ABBYY Real-time Recognition SDK。它为您完成了处理视频流的所有工作。
免责声明:我为 ABBYY 工作。
【讨论】:
它需要互联网吗?我的意思是我必须连接到互联网才能使用它?【参考方案3】:/* this is the code of main activity it will capture text without taking picture all you need to do is to make a text field in mainActivity.xml */
import android.Manifest;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
> Blockquote
import android.util.Log;
import android.util.SparseArray;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.TextView;
import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.text.TextBlock;
import com.google.android.gms.vision.text.TextRecognizer;
import java.io.IOException;
public class MainActivity extends AppCompatActivity
SurfaceView cameraView;
TextView textView;
CameraSource cameraSource;
final int RequestCameraPermissionID = 1001;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
switch (requestCode)
case RequestCameraPermissionID:
if(grantResults[0]==PackageManager.PERMISSION_GRANTED)
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
return;
try
cameraSource.start(cameraView.getHolder());
catch (IOException e)
e.printStackTrace();
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cameraView = (SurfaceView) findViewById(R.id.surface_view);
textView = (TextView) findViewById(R.id.text_view);
TextRecognizer textRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();
if (!textRecognizer.isOperational())
Log.w("MainActivity", "Detector dependencies are not yet available");
else
cameraSource = new CameraSource.Builder(getApplicationContext(), textRecognizer)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedPreviewSize(1280, 1024)
.setRequestedFps(2.0f)
.setAutoFocusEnabled(true)
.build();
cameraView.getHolder().addCallback(new SurfaceHolder.Callback()
@Override
public void surfaceCreated(SurfaceHolder holder)
try
if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(MainActivity.this,
new String[]Manifest.permission.CAMERA,
RequestCameraPermissionID);
return;
cameraSource.start(cameraView.getHolder());
catch (IOException e)
e.printStackTrace();
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
@Override
public void surfaceDestroyed(SurfaceHolder holder)
cameraSource.stop();
);
textRecognizer.setProcessor(new Detector.Processor<TextBlock>()
@Override
public void release()
@Override
public void receiveDetections(Detector.Detections<TextBlock> detections)
final SparseArray<TextBlock> items = detections.getDetectedItems();
if(items.size()!=0)
textView.post(new Runnable()
@Override
public void run()
StringBuilder stringBuilder=new StringBuilder();
for(int i=0;i<items.size();i++)
TextBlock item = items.valueAt(i);
stringBuilder.append(item.getValue());
stringBuilder.append("\n");
textView.setText(stringBuilder.toString());
);
);
【讨论】:
请您添加几行来解释您的答案。 这是主要活动的代码,它将捕获文本。 嗨兄弟@shouzebhasan你能寄给我样品项目吗?我对你的代码很感兴趣。 请发送电子邮件至 shouzebhasan99@gmail.com以上是关于Android:如何在不拍照的情况下从相机捕获文本?的主要内容,如果未能解决你的问题,请参考以下文章