Saya telah mencari solusi untuk sepanjang hari. Saya telah memeriksa beberapa Thread mengenai masalah saya.
- Objek detektor kustom
- Kurangi jendela pelacakan kode batang
- dan banyak lagi ...
Tapi itu tidak banyak membantu saya. Pada dasarnya saya ingin Pratinjau Kamera fullscreen tetapi teks hanya akan dikenali di tengah layar, di mana Rectangle diambil.
Teknologi yang saya gunakan:
- Google Mobile Vision API untuk Pengenalan karakter Optik (OCR)
- Ketergantungan:
play-services-vision
Keadaan saya saat ini: Saya membuat kelas BoxDetector:
public class BoxDetector extends Detector {
private Detector mDelegate;
private int mBoxWidth, mBoxHeight;
public BoxDetector(Detector delegate, int boxWidth, int boxHeight) {
mDelegate = delegate;
mBoxWidth = boxWidth;
mBoxHeight = boxHeight;
}
public SparseArray detect(Frame frame) {
int width = frame.getMetadata().getWidth();
int height = frame.getMetadata().getHeight();
int right = (width / 2) + (mBoxHeight / 2);
int left = (width / 2) - (mBoxHeight / 2);
int bottom = (height / 2) + (mBoxWidth / 2);
int top = (height / 2) - (mBoxWidth / 2);
YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, width, height, null);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(left, top, right, bottom), 100, byteArrayOutputStream);
byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);
Frame croppedFrame =
new Frame.Builder()
.setBitmap(bitmap)
.setRotation(frame.getMetadata().getRotation())
.build();
return mDelegate.detect(croppedFrame);
}
public boolean isOperational() {
return mDelegate.isOperational();
}
public boolean setFocus(int id) {
return mDelegate.setFocus(id);
}
@Override
public void receiveFrame(Frame frame) {
mDelegate.receiveFrame(frame);
}
}
Dan mengimplementasikan instance kelas ini di sini:
final TextRecognizer textRecognizer = new TextRecognizer.Builder(App.getContext()).build();
// Instantiate the created box detector in order to limit the Text Detector scan area
BoxDetector boxDetector = new BoxDetector(textRecognizer, width, height);
//Set the TextRecognizer's Processor but using the box collider
boxDetector.setProcessor(new Detector.Processor<TextBlock>() {
@Override
public void release() {
}
/*
Detect all the text from camera using TextBlock
and the values into a stringBuilder which will then be set to the textView.
*/
@Override
public void receiveDetections(Detector.Detections<TextBlock> detections) {
final SparseArray<TextBlock> items = detections.getDetectedItems();
if (items.size() != 0) {
mTextView.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");
}
mTextView.setText(stringBuilder.toString());
}
});
}
}
});
mCameraSource = new CameraSource.Builder(App.getContext(), boxDetector)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedPreviewSize(height, width)
.setAutoFocusEnabled(true)
.setRequestedFps(15.0f)
.build();
Pada pelaksanaan Pengecualian ini dilemparkan:
Exception thrown from receiver.
java.lang.IllegalStateException: Detector processor must first be set with setProcessor in order to receive detection results.
at com.google.android.gms.vision.Detector.receiveFrame(com.google.android.gms:play-services-vision-common@@19.0.0:17)
at com.spectures.shopendings.Helpers.BoxDetector.receiveFrame(BoxDetector.java:62)
at com.google.android.gms.vision.CameraSource$zzb.run(com.google.android.gms:play-services-vision-common@@19.0.0:47)
at java.lang.Thread.run(Thread.java:919)
Jika ada yang tahu, apa kesalahan saya atau memiliki alternatif, saya akan sangat menghargainya. Terima kasih!
Inilah yang ingin saya capai, sebuah kotak. Pemindai area teks:
mDetector.receiveFrame(outputFrame);
Di google-vision Anda bisa mendapatkan koordinat teks yang terdeteksi seperti dijelaskan dalam Cara mendapatkan posisi teks dalam gambar menggunakan Mobile Vision API?
Anda mendapatkan
TextBlocks
dariTextRecognizer
, lalu memfilterTextBlock
menurut koordinatnya, yang dapat ditentukan olehgetBoundingBox()
ataugetCornerPoints()
metodeTextBlocks
kelas:sumber: https://developers.google.com/android/reference/com/google/android/gms/vision/text/TextRecognizer
sumber: https://developers.google.com/android/reference/com/google/android/gms/vision/text/TextBlock
Jadi, Anda pada dasarnya melanjutkan seperti di Cara mendapatkan posisi teks dalam gambar menggunakan Mobile Vision API? namun Anda tidak memecah blok apa pun dalam garis dan kemudian garis apa pun dalam kata-kata seperti
alih-alih Anda mendapatkan kotak batas semua blok teks dan kemudian memilih kotak batas dengan koordinat terdekat ke tengah layar / bingkai atau persegi panjang yang Anda tentukan (yaitu Bagaimana saya bisa mendapatkan pusat x, y dari pandangan saya di android? ). Untuk ini, Anda menggunakan
getBoundingBox()
ataugetCornerPoints()
metodeTextBlocks
...sumber