গুগল ভিশনে সনাক্তকরণের ক্ষেত্র সীমাবদ্ধ করা হচ্ছে, পাঠ্য স্বীকৃতি


11

আমি একটি সমাধানের জন্য সারা দিন অনুসন্ধান করে যাচ্ছিলাম। আমি আমার সমস্যা সম্পর্কিত বিভিন্ন থ্রেড পরীক্ষা করে দেখেছি।

তবে এটি আমাকে খুব একটা কাজে দেয়নি। মূলত আমি চাই যে ক্যামেরা প্রিভিউ পুরো স্ক্রিনযুক্ত তবে পাঠ্যটি কেবলমাত্র পর্দার কেন্দ্রেই স্বীকৃত হয়, যেখানে একটি আয়তক্ষেত্র আঁকা হয়।

প্রযুক্তিগুলি আমি ব্যবহার করছি:

  • অপটিকাল চরিত্র স্বীকৃতি (ওসিআর) এর জন্য গুগল মোবাইল ভিশন এপিআই
  • Dependecy: play-services-vision

আমার বর্তমান অবস্থা: আমি একটি বক্সডেক্টর শ্রেণি তৈরি করেছি:

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);
    }
}

এবং এখানে এই শ্রেণীর উদাহরণ প্রয়োগ করেছে:

   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();

মৃত্যুদন্ড কার্যকর করার সময় এই ব্যতিক্রম নিক্ষেপ করা হয়:

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)

কারও যদি একটি ক্লু থাকে তবে আমার দোষ কী বা এর কোন বিকল্প আছে আমি সত্যিই এটির প্রশংসা করব। ধন্যবাদ!

এটিই আমি অর্জন করতে চাই, একটি রেক্ট। পাঠ্য অঞ্চল স্ক্যানার:

আমি যা অর্জন করতে চাই

উত্তর:


0

গুগল দৃষ্টি সনাক্তকরণের ইনপুটটি একটি ফ্রেম রয়েছে। একটি ফ্রেম একটি চিত্রের ডেটা এবং সম্পর্কিত ডেটা হিসাবে প্রস্থ এবং উচ্চতা ধারণ করে। ইউ এটি ডিটেক্টরকে পাস করার আগে এই ফ্রেমটি (এটি আরও ছোট কেন্দ্রের ফ্রেমে কাটা) প্রক্রিয়া করতে পারে। এই প্রক্রিয়াটি দ্রুত হওয়া উচিত এবং ক্যামেরা প্রসেসিং ইমেজ বরাবর করা উচিত। আমার গিথুবটি নীচে দেখুন, ফ্রেমপ্রসেসিংআরনেবলের জন্য অনুসন্ধান করুন। আপনি সেখানে ফ্রেম ইনপুট দেখতে পাচ্ছেন। আপনি নিজেই সেখানে প্রক্রিয়াটি করতে পারেন।

CameraSource


হ্যালো, উত্তর দেওয়ার জন্য প্রথমে ধন্যবাদ! আমি আপনার কোডটি দেখে অবাক হয়েছি, আমার কোডটিতে আমার কী পরিবর্তন করতে হবে? ফ্রেম প্রসেসিং অংশটিই কেবল আমাকে যুক্ত করতে হবে? (2 বেসরকারী ক্লাস)?
অ্যালান

হ্যাঁ, আপনি ডিটেক্টরটির শেষ ক্রিয়াকলাপটি পাস করার আগে আপনাকে আপনার ফ্রেমটি পরিবর্তন করতে হবে: mDetector.receiveFrame(outputFrame);
Thành Hà Văn

আমার যে কোডটি যুক্ত করা দরকার তা দিয়ে আপনি কি নিজের উত্তরটি সম্পাদনা করতে পারবেন, যাতে আমি এটি কোড আউট করতে পারি এবং আপনাকে বাউটিটি দিতে পারি?
অ্যালান

0

গুগল- ভিশনে আপনি কোনও মোবাইল সনাক্তকরণ এপিআই ব্যবহার করে কোনও চিত্রের পাঠ্যের অবস্থান কীভাবে পাবেন তা বর্ণিত যেমন সনাক্ত করা পাঠ্যের স্থানাঙ্কগুলি পেতে পারেন ?

আপনি এগুলি TextBlocksপান TextRecognizer, তারপরে আপনি TextBlockতাদের স্থানাঙ্কগুলি দ্বারা ফিল্টার করুন যা ক্লাসের পদ্ধতি getBoundingBox()বা getCornerPoints()পদ্ধতি দ্বারা নির্ধারণ করা যেতে পারে TextBlocks:

TextRecognizer

সনাক্তকরণের ফলাফলগুলি (ফ্রেম) দ্বারা ফিরে আসে। ওসিআর অ্যালগরিদম পাঠ্য লেআউটটি অনুমান করার চেষ্টা করে এবং প্রতিটি অনুচ্ছেদকে পাঠ্যব্লক দৃষ্টান্তগুলিতে সংগঠিত করে। যদি কোনও পাঠ্য সনাক্ত করা হয় তবে কমপক্ষে একটি টেক্সটব্লক উদাহরণ ফিরে আসবে।

[..]

পাবলিক পদ্ধতি

public SparseArray<TextBlock> detect (Frame frame)একটি চিত্রের পাঠ্য সনাক্ত এবং সনাক্ত করে। আপাতত বিটম্যাপ এবং এনভি 21 সমর্থন করে। পাঠ্যব্লকটিতে ইন্টের ম্যাপিং প্রত্যাবর্তন করে, যেখানে ইন্টার ডোমেন পাঠ্য ব্লকের জন্য একটি অস্বচ্ছ ID উপস্থাপন করে।

উত্স: https://developers.google.com/android/references/com/google/android/gms/vision/text/TextRecognizer

TextBlock

public class TextBlock extends Object implements Text

ওসিআর ইঞ্জিন দ্বারা বিবেচিত হিসাবে পাঠ্যের একটি ব্লক (অনুচ্ছেদ হিসাবে এটি মনে করুন)।

পাবলিক মেথডের সংক্ষিপ্তসার

Rect getBoundingBox() টেক্সটব্লকের অক্ষ-সংযুক্ত বাউন্ডিং বাক্সটি প্রদান করে।

List<? extends Text> getComponents() এই সত্তা সমন্বিত ছোট ছোট উপাদানগুলি, যদি কোনও হয়।

Point[] getCornerPoints() উপরে-বাম দিক দিয়ে শুরু হয়ে ঘড়ির কাঁটার দিকে 4 কোণার পয়েন্ট।

String getLanguage() পাঠ্যব্লকটিতে প্রচলিত ভাষা।

String getValue() স্ট্রিং হিসাবে স্বীকৃত পাঠ্য পুনরুদ্ধার করুন।

উত্স: https://developers.google.com/android/references/com/google/android/gms/vision/text/TextBlock

সুতরাং আপনি মূলত মোবাইল ভিশন এপিআই ব্যবহার করে কোনও চিত্রের পাঠ্যের অবস্থান কীভাবে পেতে চান? তবে আপনি লাইনগুলিতে কোনও ব্লক বিভক্ত করবেন না এবং তারপরে কোনও লাইনের মতো শব্দও লিখবেন না

//Loop through each `Block`
            foreach (TextBlock textBlock in blocks)
            {
                IList<IText> textLines = textBlock.Components; 

                //loop Through each `Line`
                foreach (IText currentLine in textLines)
                {
                    IList<IText>  words = currentLine.Components;

                    //Loop through each `Word`
                    foreach (IText currentword in words)
                    {
                        //Get the Rectangle/boundingBox of the word
                        RectF rect = new RectF(currentword.BoundingBox);
                        rectPaint.Color = Color.Black;

                        //Finally Draw Rectangle/boundingBox around word
                        canvas.DrawRect(rect, rectPaint);

                        //Set image to the `View`
                        imgView.SetImageDrawable(new BitmapDrawable(Resources, tempBitmap));


                    }

                }
            }

পরিবর্তে আপনি সমস্ত পাঠ্য ব্লকের সীমানা বাক্স পাবেন এবং তারপরে স্ক্রিন / ফ্রেমের কেন্দ্রের নিকটবর্তী বা আপনার উল্লিখিত আয়তক্ষেত্রের সাথে সীমানা বাক্সটি নির্বাচন করুন (উদাহরণস্বরূপ, আমি কীভাবে আমার অ্যান্ড্রয়েডের x, y কেন্দ্র পেতে পারি? )। এর জন্য আপনি এর পদ্ধতি getBoundingBox()বা getCornerPoints()পদ্ধতিটি ব্যবহার করুন TextBlocks...


আমি আগামীকাল ধন্যবাদ পরীক্ষা করব
এ্যালান

আমি এটি চেষ্টা করেছিলাম তবে কীভাবে এটি সঠিকভাবে প্রয়োগ করা যায় তা আমি জানতাম না
এ্যালান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.