How To
Menggunakan C FFI
Panduan integrasi C / C++ dan Foreign Function Interface (FFI) untuk RustO!.
RustO! mengekspor C ABI yang stabil melalui pustaka bersama dinamis (librusto.so, librusto.dylib, rusto.dll) serta arsip statis (librusto.a, rusto.lib).
Header C (rusto.h)
#ifndef RUSTO_H
#define RUSTO_H
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
// Handle instance mesin buram (opaque)
typedef struct ROCRHandle ROCRHandle;
// Blok hasil deteksi teks yang kompatibel dengan C
typedef struct {
char *text;
float score;
float box_x1, box_y1;
float box_x2, box_y2;
float box_x3, box_y3;
float box_x4, box_y4;
float frame_width, frame_height;
float frame_top, frame_left;
} CTextResult;
// 1. Siklus Hidup Mesin
ROCRHandle *rocr_initialize(const char *config_json);
void rocr_free(ROCRHandle *handle);
const char *rocr_version(void);
// 2. Deteksi Teks Terstruktur (Baris / Kata)
int rocr_detect_text_file(
ROCRHandle *handle,
const char *image_path,
const char *options_json,
CTextResult **results_out,
size_t *count_out
);
int rocr_detect_text_data(
ROCRHandle *handle,
const uint8_t *image_data,
size_t image_len,
const char *options_json,
CTextResult **results_out,
size_t *count_out
);
// 3. Deteksi Tata Letak Spasial
char *rocr_detect_text_file_spatial(
ROCRHandle *handle,
const char *image_path,
const char *options_json
);
char *rocr_detect_text_data_spatial(
ROCRHandle *handle,
const uint8_t *image_data,
size_t image_len,
const char *options_json
);
// 4. Dealokasi Memori
void rocr_free_results(CTextResult *results, size_t count);
void rocr_free_string(char *s);
#ifdef __cplusplus
}
#endif
#endif // RUSTO_H
Referensi Kode Status (Return Codes)
Fungsi dengan status pengembalian int menggunakan kode kesalahan berikut:
| Kode | Konstanta | Makna |
|---|---|---|
0 | ROCR_OK | Operasi berhasil. |
-1 | ROCR_ERR_NULL_PTR | Pointer null diteruskan pada argumen yang wajib diisi. |
-2 | ROCR_ERR_INVALID_PATH | Path berkas tidak valid atau tidak ditemukan. |
-3 | ROCR_ERR_ENGINE | Kesalahan internal mesin inferensi atau deteksi OCR. |
-4 | ROCR_ERR_INVALID_OPTIONS | Kesalahan sintaks atau validasi JSON opsi. |
-5 | ROCR_ERR_MODE_MISMATCH | Mode opsi output tidak cocok dengan fungsi C yang dipanggil. |
Contoh Aplikasi C
#include <stdio.h>
#include <stdlib.h>
#include "rusto.h"
int main() {
printf("Versi RustO!: %s\n", rocr_version());
// 1. Inisialisasi mesin dengan konfigurasi JSON
const char *init_json =
"{"
" \"template\": \"ppv6\","
" \"detection\": { \"modelPath\": \"models/det.rten\" },"
" \"recognition\": { \"modelPath\": \"models/rec.rten\", \"dictPath\": \"models/dict.txt\" }"
"}";
ROCRHandle *engine = rocr_initialize(init_json);
if (!engine) {
fprintf(stderr, "Gagal menginisialisasi mesin RustO!.\n");
return 1;
}
// 2. Jalankan deteksi teks terstruktur
const char *options_json = "{\"output\":\"lines\",\"textScore\":0.5}";
CTextResult *results = NULL;
size_t count = 0;
int status = rocr_detect_text_file(engine, "receipt.jpg", options_json, &results, &count);
if (status == 0) {
printf("Ditemukan %zu blok teks:\n", count);
for (size_t i = 0; i < count; i++) {
printf("[%zu] %s (Skor: %.2f) di (%.1f, %.1f) [%.1fx%.1f]\n",
i, results[i].text, results[i].score,
results[i].frame_left, results[i].frame_top,
results[i].frame_width, results[i].frame_height
);
}
// Selalu bebaskan hasil terstruktur
rocr_free_results(results, count);
} else {
fprintf(stderr, "Kode kesalahan OCR: %d\n", status);
}
// 3. Jalankan rekonstruksi tata letak spasial
const char *spatial_opts = "{\"output\":\"spatial\",\"lineYThreshold\":0.5,\"wordXThreshold\":0.4}";
char *spatial_text = rocr_detect_text_file_spatial(engine, "receipt.jpg", spatial_opts);
if (spatial_text) {
printf("\n--- Tata Letak Spasial ---\n%s\n", spatial_text);
// Selalu bebaskan alokasi string spasial
rocr_free_string(spatial_text);
}
// 4. Dealokasi instans mesin
rocr_free(engine);
return 0;
}
Kompilasi dan Penautan (Linking)
Menggunakan GCC / Clang
gcc main.c -I. -L. -lrusto -Wl,-rpath,. -o ocr_demo
./ocr_demo
Menggunakan CMake (CMakeLists.txt)
cmake_minimum_required(VERSION 3.15)
project(OcrApp C)
add_executable(ocr_app main.c)
# Sertakan direktori header
target_include_directories(ocr_app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
# Tautkan pustaka bersama librusto
target_link_libraries(ocr_app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/librusto.so)