משתמש מכוון מצלמה לקבלה דהויה באור עמום. ללא עיבוד מקדים של התמונה, ספריות OCR סטנדרטיות מייצרות עד 50% שגיאות. הפתרון הוא החלת מתיחת ניגודיות (vImageContrastStretch ב-iOS, OpenCV באנדרואיד) ובינאריזציה בשלב הצילום. רק אז להזין את הפריים ל-VNRecognizeTextRequest או ML Kit Text Recognition. בניסיון שלנו, שרשרת זו מעלה את הדיוק מ-70% ל-98-99% על טקסט מודפס.
במשך יותר מחמש שנים, סיפקנו יותר מ-20 פרויקטי OCR לקמעונאות (תגי מחיר וקבלות), לוגיסטיקה (מעקב אחר שטרי מטען) ופינטק (אימות נתוני דרכון). לכל פרויקט היו סט מסננים ושלבי עיבוד משלו. טעות נפוצה היא לצפות מספריית ה-OCR לתוצאות מושלמות ללא התאמות. ללא עיבוד מקדים של התמונה ועיבוד תוצאות, הדיוק יורד ל-50–70%. לכן, השלב הראשון בכל פרויקט הוא איסוף דוגמאות מסמכים אמיתיות ובדיקתן.
מדוע עיבוד מקדים הוא קריטי לדיוק OCR
עיבוד מקדים הוא שלב מפתח הקובע את הדיוק הסופי. בתאורה חלשה או בטשטוש, אנו משתמשים ב:
- שיפור ניגודיות באמצעות
vImageContrastStretch(iOS) אוOpenCV(אנדרואיד). - המרה לגווני אפור ולאחר מכן
AdaptiveThreshold. -
SharpenCIFilter לפני הזנה ל-OCR.
עבור טקסט בכתב יד, מסגרות סטנדרטיות מציגות דיוק של 40–60%. במקרים כאלה, מודלים מותאמים אישית המבוססים על TensorFlow Lite עוזרים — זו משימה נפרדת הדורשת נתונים מתויגים ואימון.
כיצד פועלות מסגרות OCR מקוריות
iOS: Vision + VNRecognizeTextRequest
מאז iOS 13, מסגרת Vision יכולה לזהות טקסט במצב לא מקוון. VNRecognizeTextRequest תומכת בשני מצבים: .fast (משוער, מיידי) ו-.accurate (איטי יותר אך מדויק ב-15% עבור גופנים מורכבים). עבור גופנים מורכבים, מצב .accurate נותן שיפור דיוק של 15%.
func recognizeText(in image: UIImage) {
guard let cgImage = image.cgImage else { return }
let request = VNRecognizeTextRequest { [weak self] request, error in
guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
let text = observations.compactMap { $0.topCandidates(1).first?.string }.joined(separator: "\n")
DispatchQueue.main.async {
self?.handleRecognized(text: text)
}
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
request.recognitionLanguages = ["ru-RU", "en-US"] // порядок = приоритет
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try? handler.perform([request])
}func recognizeText(in image: UIImage) { guard let cgImage = image.cgImage else { return } let request = VNRecognizeTextRequest { [weak self] request, error in guard let observations = request.results as? [VNRecognizedTextObservation] else { return } let text = observations.compactMap { $0.topCandidates(1).first?.string }.joined(separator: "\n") DispatchQueue.main.async { self?.handleRecognized(text: text) } } request.recognitionLevel = .accurate request.usesLanguageCorrection = true request.recognitionLanguages = ["ru-RU", "en-US"] // порядок = приоритет let handler = VNImageRequestHandler(cgImage: cgImage, options: [:]) try? handler.perform([request]) } עוזר עם שגיאות הקלדה, אך לפעמים "מתקן" קיצורים ומספרי פריטים — עבור מסמכים טכניים עדיף להשבית אותו.
אנדרואיד: ML Kit Text Recognition v2
usesLanguageCorrection תומך בלטינית, קירילית, סינית, יפנית וקוריאנית באמצעות מודולים נפרדים. הוא מוריד בשימוש ראשון (~5 MB ללטינית).
val recognizer = TextRecognition.getClient(
TextRecognizerOptions.DEFAULT_OPTIONS // или RussianTextRecognizerOptions
)
val image = InputImage.fromBitmap(bitmap, 0)
recognizer.process(image)
.addOnSuccessListener { visionText ->
val fullText = visionText.textBlocks
.joinToString("\n") { block -> block.text }
handleRecognized(fullText)
}
.addOnFailureListener { e ->
handleError(e)
}ML Kit מחזיר גם תיבות תחום (bounding boxes) עבור כל בלוק טקסט — שימושי להדגשת אזורים שזוהו בממשק המשתמש.
מצב חי: טקסט בזמן אמת מזרם וידאו
עבור שכבת-על חיה (טקסט מודגש ישירות בזרם הווידאו) ב-iOS אנו משתמשים ב-com.google.mlkit:text-recognition + val recognizer = TextRecognition.getClient( TextRecognizerOptions.DEFAULT_OPTIONS // или RussianTextRecognizerOptions ) val image = InputImage.fromBitmap(bitmap, 0) recognizer.process(image) .addOnSuccessListener { visionText -> val fullText = visionText.textBlocks .joinToString("\n") { block -> block.text } handleRecognized(fullText) } .addOnFailureListener { e -> handleError(e) } :
// Delegate метод AVCaptureVideoDataOutput
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
// Не запускаем новый запрос, если предыдущий ещё не завершён
guard !isProcessing else { return }
isProcessing = true
let request = VNRecognizeTextRequest { [weak self] request, _ in
defer { self?.isProcessing = false }
// обработка результатов...
}
request.recognitionLevel = .fast // для live важна скорость
try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
}דגל AVCaptureSession הוא חובה — בלעדיו ב-30 FPS, תור הבקשות מצטבר והזיכרון גדל עד לקריסה.
באנדרואיד — CMSampleBuffer + // Delegate метод AVCaptureVideoDataOutput func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return } // Не запускаем новый запрос, если предыдущий ещё не завершён guard !isProcessing else { return } isProcessing = true let request = VNRecognizeTextRequest { [weak self] request, _ in defer { self?.isProcessing = false } // обработка результатов... } request.recognitionLevel = .fast // для live важна скорость try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request]) } . ML Kit מותאם לעבודה ישירה עם isProcessing ללא המרה ל-Bitmap.
| פרמטר | זיהוי סטטי | זיהוי חי |
|---|---|---|
| מהירות עיבוד | 100-200 אלפיות השנייה | עד 30 אלפיות השנייה לפריים |
| דיוק | עד 99% | עד 95% (בשל פשרה על מהירות) |
| צריכת סוללה | נמוכה | בינונית (עיבוד רציף) |
| יישום | סריקת מסמכים, קבלות | הפניית מצלמה לכרטיסי ביקור, לוחיות רישוי |
שיפור איכות הזיהוי בתנאים קשים
שיפור ניגודיות ובינאריזציה הם טכניקות סטנדרטיות. עבור מסמכים ספציפיים (למשל, קבלות דהויות), אנו מוסיפים מסננים מותאמים אישית.
טעויות אינטגרציה נפוצות:
- שכחת דגל
CameraXבמצב חי → דליפת זיכרון. - השארת
ImageAnalysis.Analyzerמופעל עבור טקסטים טכניים → משחית קיצורים. - אי בדיקת חפיפת תיבות תחום עם ממשק המשתמש → טקסט מוצג על גבי הממשק.
עיבוד תוצאות: מטקסט גולמי לנתונים מובנים
פלט OCR גולמי הוא זרם של מחרוזות. רוב המשימות דורשות מבנה:
- קבלות: חילוץ שורות עם מחירים באמצעות regex, ניתוח הסכום הסופי.
- כרטיסי ביקור:
ImageProxy(iOS) אוNSDataDetector(אנדרואיד) עבור טלפונים, אימיילים וכתובות. - דרכונים/מסמכים: אזור MRZ נקרא לפי תקן ICAO 9303, קיימים מנתחים.
- לוחיות רישוי: משימה נפרדת — עדיף להשתמש במודלים ייעודיים (OpenALPR, PlateRecognizer API).
עבור טקסט קירילי באיכות ירודה, עיבוד מקדים עוזר: הגברת ניגודיות באמצעות Patterns, גווני אפור, vImageContrastStretch CIFilter לפני OCR.
השוואת מסגרות מקוריות
| פרמטר | Vision (iOS) | ML Kit (אנדרואיד) |
|---|---|---|
| מצבים | .fast, .accurate | מודל בסיסי |
| שפות | עד 15 בבקשה אחת | מודולים: לטינית, קירילית, סינית, יפנית, קוריאנית |
| לא מקוון | כן | כן (מודל ~5 MB) |
| דיוק על מודפס | ~98% | ~97% |
| תיבות תחום | כן | כן |
| מהירות (Full HD) | 100-200 אלפיות השנייה | 80-150 אלפיות השנייה |
לחצו לפרטים נוספים על טכניקות עיבוד מקדים
לתנאים קיצוניים, אנו משתמשים בסף אדפטיבי (למשל, Sharpen עם גודל בלוק 11) ופעולות מורפולוגיות להסרת רעש. שלבים אלה יכולים לשפר את הדיוק בעוד 10-15%.
תוצרים הנכללים בפיתוח
בהזמנת שירות זה, אתה מקבל:
- אינטגרציה של Vision או ML Kit לתוך האפליקציה שלך.
- כוונון פרמטרי זיהוי עבור סוג המסמך שלך.
- מצב חי עם הדגשת טקסט על המצלמה (אופציונלי).
- עיבוד נתונים: ניתוח קבלות, כרטיסי ביקור, מספרים.
- תיעוד אינטגרציה ובדיקות.
- תמיכה במהלך בדיקת App Store / Google Play.
תהליך העבודה
- הגדרת מקרי שימוש: סוגי מסמכים, שפות, צורך במצב חי או רק בתמונה סטטית.
- יישום לכידת תמונה (מצלמה + גלריה), עיבוד מקדים.
- אינטגרציית OCR: Vision/ML Kit מקורי או ענן (Google Vision API, AWS Textract) אם נדרש דיוק גבוה יותר למסמכים מורכבים.
- עיבוד תוצאות למשימה הספציפית: מבנה נתונים, regex, NER.
- בדיקה על דוגמאות אמיתיות בתנאי תאורה שונים.
הערכות לוחות זמנים
זיהוי טקסט סטטי בסיסי באמצעות מסגרת מקורית — 2-3 ימים (החל מ-$2,000). מצב חי עם שכבת-על + מבנה נתונים לסוג מסמך ספציפי — 1-2 שבועות (כ-$5,000–$8,000). תרחישים מורכבים עם מודלים מותאמים אישית — מחודש (תקציב $15,000+). צור קשר להערכה מדויקת לפרויקט שלך.
הדיוק המובטח שלנו על טקסט מודפס הוא 98% עם עיבוד מקדים; אנו מספקים אינטגרציה מוסמכת עם תוצאות מתועדות. ניסיון של למעלה מ-5 שנים מבטיח מסירת פרויקט אמינה.
קבל ייעוץ לפרויקט שלך — נבחר את הפתרון האופטימלי. צור קשר כדי לדון במשימה שלך ולהעריך את עלות פיתוח ה-OCR לאפליקציה שלך. הפתרון שלנו תומך ב-OCR רב-לשוני לא מקוון כולל רוסית, אנגלית, סינית ויפנית.







