How To

Menggunakan Input RGB Terdekode

Panduan OCR langsung dari buffer piksel RGB8 terinterleave tanpa kompresi di Rust, C FFI, dan berbagai binding bahasa.

OCR dari Piksel RGB Terdekode

Aplikasi pemrosesan citra dengan throughput tinggi (seperti server libvips, imagor, OpenCV, feed kamera, dan viewport GUI) telah memiliki larik piksel mentah yang tidak terkompresi di memori. Mengompresi piksel tersebut ke JPEG atau PNG hanya untuk memanggil rocr_detect_text_data menambah beban kerja codec dan risiko artefak kompresi yang menurunkan akurasi pengenalan teks.

RustO! menyediakan jalur input langsung untuk buffer RGB terdekode yang melewati siklus kompresi/dekompresi secara penuh tanpa mengubah sistem koordinat maupun konfigurasi model.

Karakteristik Utama

  • Format Input: Interleaved unsigned 8-bit RGB (RGB8), tanpa channel alpha dan tanpa rotasi EXIF otomatis.
  • Padding Baris: Mendukung row stride berpadding (stride >= width * 3). Buffer harus mencakup minimal (height - 1) * stride + width * 3 byte (baris terakhir tidak membutuhkan padding akhir).
  • Fast-Path Memory Copy: Saat stride == width * 3 (piksel kontigu tanpa padding), buffer disalin dalam satu kali operasi memori tervektorisasi.
  • Invarian Keamanan Memori: Pemanggil tetap memiliki buffer piksel. RustO menyalin data yang dibutuhkan dan tidak pernah mempertahankan atau membebaskan pointer pemanggil.
  • Kebutuhan Backend: Memerlukan backend citra pure-Rust bawaan.

Integrasi C / C++

Bangun RustO! dengan perintah cargo build --release --features ffi. Deklarasi C tersedia di include/rusto.h.

Output Terstruktur (rocr_detect_text_rgb)

#include "rusto.h"

CTextResult *results = NULL;
size_t count = 0;
int status = rocr_detect_text_rgb(
    handle,
    pixels,
    buffer_length,
    width,
    height,
    stride_bytes,
    "{}",
    &results,
    &count
);

if (status == 0) {
    for (size_t i = 0; i < count; ++i) {
        printf("Teks: %s (skor: %.2f)\n", results[i].text, results[i].score);
    }
    rocr_free_results(results, count);
}

Output Spasial (rocr_detect_text_rgb_spatial)

#include "rusto.h"

char *spatial_json = rocr_detect_text_rgb_spatial(
    handle,
    pixels,
    buffer_length,
    width,
    height,
    stride_bytes,
    "{}"
);

if (spatial_json != NULL) {
    printf("JSON Spasial: %s\n", spatial_json);
    rocr_free_string(spatial_json);
}

Kode Status Pengembalian

KodeKeterangan
0Berhasil
-1Pointer NULL pada argumen wajib
-2Dimensi tidak valid, stride kurang, atau panjang buffer kurang
-3Kegagalan mesin inferensi
-4JSON opsi tidak valid
-5Output spasial diminta pada API terstruktur (gunakan rocr_detect_text_rgb_spatial)

API Rust Native

use rusto::{InitializeConfig, OcrRunOptions, RustO};

let mut ocr = RustO::initialize(config)?;
let options = OcrRunOptions::default();

let result = ocr.detect_text_rgb(pixels, width, height, stride, &options)?;

Binding Lintas Platform

Go (packages/go)

results, err := engine.DetectTextRGB(pixels, width, height, stride, "{}")
if err != nil {
    log.Fatal(err)
}

Flutter & Dart (packages/flutter, packages/dart)

final results = ocr.detectTextRgb(pixelBytes, width, height, stride);

Java & JVM (packages/java)

List<TextResult> results = ocr.detectTextRGB(pixelBytes, width, height, stride, "{}");

Python (packages/python via UniFFI)

results = ocr.detect_text_rgb(pixel_bytes, width, height, stride, options)