Memperbaiki OCR

This commit is contained in:
Muhammad Raihan Surya 2023-12-13 16:58:12 +07:00
parent 6c5edf8997
commit 1b57781980
4 changed files with 99 additions and 119 deletions

View File

@ -12,6 +12,7 @@ use App\Models\User;
use Barryvdh\DomPDF\Facade\Pdf;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
@ -25,6 +26,7 @@ use Laravolt\Indonesia\Models\Province;
use Laravolt\Indonesia\Models\Village;
use Pusher\Pusher;
use Ramsey\Uuid\Uuid;
use GuzzleHttp\Client;
class LoginController extends Controller
{
@ -62,7 +64,7 @@ class LoginController extends Controller
return redirect()->intended('user');
}
} elseif (Auth::user()->status == 'Rejected') {
Session::flash('message', 'Akun ditolak. Alasan: '.Auth::user()->keterangan);
Session::flash('message', 'Akun ditolak. Alasan: ' . Auth::user()->keterangan);
return redirect()->back();
} else {
Session::flash('message', 'Akun tidak ditemukan atau sedang dalam pengajuan');
@ -94,7 +96,6 @@ class LoginController extends Controller
public function register(Request $request)
{
// return response()->json($request->all());
$request->validate(
[
'nama_depan' => ['required'],
@ -181,64 +182,74 @@ class LoginController extends Controller
$ktpBase64 = $request->request->get('ktp');
$wajahBase64 = $request->request->get('wajah');
$validatedData['email_verified_at'] = now();
// $validatedData['email_verified_at'] = now();
if ($ktpBase64 && $wajahBase64) {
// Konversi string Base64 ke file gambar
$ktpFile = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $ktpBase64));
$wajahFile = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $wajahBase64));
$foto_ktp = 'Foto-KTP-' . $nama_depan . '-' . $nama_belakang . '.jpg';
$foto_wajah = 'Foto-Wajah-' . $nama_depan . '-' . $nama_belakang . '.jpg';
$foto_ktp = 'Foto-KTP-' . $email . '.jpg';
$foto_wajah = 'Foto-Wajah-' . $email . '.jpg';
file_put_contents(public_path('storage/foto-ktp/' . $foto_ktp), $ktpFile);
file_put_contents(public_path('storage/foto-wajah/' . $foto_wajah), $wajahFile);
}
//OCR
try {
// $fotoKTP = public_path('storage/foto-ktp/' . $foto_ktp);
// OCR
$client = new Client();
$response = $client->request('POST', 'http://localhost:8888/process-image', [
'multipart' => [
[
'name' => 'image',
'contents' => fopen(public_path('storage/foto-ktp/'.$foto_ktp), 'r'),
'filename' => $foto_ktp,
],
],
]);
// $image = Image::make($fotoKTP);
$result = $response->getBody()->getContents();
// $image->greyscale(); // Convert to grayscale
// $image->contrast(10); // Increase contrast, adjust the value as needed
$lines = json_decode($result,true);
// $preprocessedfotoKTP = public_path('storage/preprocessed/preprocessed_image.jpg');
// $image->save($preprocessedfotoKTP);
$namaKTP = str_replace(' ','',strtolower($nama_depan.$nama_belakang));
$nikKTP = $nik;
$persentaseNama = 0;
$persentaseNik = 0;
// $result = (new TesseractOCR($preprocessedfotoKTP))->run();
foreach($lines['result'] as $line){
$teks = str_replace(' ','',strtolower($line));
$persentaseNamaSementara = 0;
$persentaseNikSementara = 0;
similar_text($teks,$namaKTP,$persentaseNamaSementara);
similar_text($teks,$nikKTP,$persentaseNikSementara);
// (5) Normalize
if($persentaseNamaSementara > 0){
if($persentaseNamaSementara > $persentaseNama){
$persentaseNama = $persentaseNamaSementara;
}
}
// $lines = explode("\n", $result);
// $namaOCR = '';
// $nikOCR = '';
// $nikInputan = $nik;
// $namaInputan = $nama_depan . ' ' . $nama_belakang;
if($persentaseNikSementara > 0){
if($persentaseNikSementara > $persentaseNik){
$persentaseNik = $persentaseNikSementara;
}
}
}
// foreach ($lines as $line) {
// // Mencari NIK
// if (strpos($line, $nikInputan) !== false) {
// $nikOCR = preg_replace('/[^0-9]/', '', $line);
// }
$persentase_kemiripan = ($persentaseNama + $persentaseNik)/2;
// // Mencari nama
// if (strpos($line, $namaInputan) !== false) {
// $namaOCR = trim(substr($line, strpos($line, ':') + 1));
// }
// }
$status = 'Progress';
//Selesai
// $persentase_kemiripan = (similar_text($nikInputan, $nikOCR, $percent) + similar_text($namaOCR, $namaOCR, $percent)) / 2;
// $status = 'Progress';
// if (similar_text($nikInputan, $nikOCR, $percent) >= 70 && similar_text($namaOCR, $namaOCR, $percent) >= 70) {
// $status = 'Progress';
// } else {
// $status = 'Progress';
// }
if($status >= 50){
$status = 'Finished';
}else if($status <= 35){
return response()->json([
'status' => false,
'message' => 'Sistem tidak dapat mendeteksi foto KTP. Kemungkinan foto tidak jelas atau buram, silahkan upload foto KTP yang jelas. Persentase kemiripan inputan : '.$persentase_kemiripan.'%'
]);
}
DB::beginTransaction();
@ -261,6 +272,7 @@ class LoginController extends Controller
'gender' => $gender,
'kode_kelurahan' => $kode_kelurahan,
'remember_token' => Str::random(10),
'status' => $status
]);
DB::commit();
@ -273,15 +285,22 @@ class LoginController extends Controller
$pusher = new Pusher('3e5bdc20dddd7fbc655e', 'f2274c37c616d29ff590', '1659859', $options);
$payload = [
'service' => 'User'
'service' => 'User',
];
$pusher->trigger('chanel-update-notifikasi-untuk-admin', 'event-update-notifikasi-untuk-admin', $payload);
return response()->json([
'status' => true,
'message' => 'Akun anda sudah terdaftar dan butuh verifikasi hingga maksimal 1 hari kerja',
]);
if($status == 'Finished'){
return response()->json([
'status' => true,
'message' => 'Akun anda sudah terdaftar dan dapat digunakan',
]);
}else{
return response()->json([
'status' => true,
'message' => 'Akun anda sudah terdaftar dan butuh verifikasi hingga maksimal 1 hari kerja',
]);
}
} catch (\Exception $e) {
DB::rollBack();
@ -305,7 +324,7 @@ class LoginController extends Controller
} else {
return response()->json([
'status' => false,
'message' => 'Akun dengan email '.$request->email.' tidak tersedia',
'message' => 'Akun dengan email ' . $request->email . ' tidak tersedia',
]);
}
}
@ -369,73 +388,35 @@ class LoginController extends Controller
public function getOcr()
{
//OCR
// dd(phpinfo());
try {
$fotoKTP = public_path('storage/foto-ktp/ktp.jpg');
$client = new Client();
$response = $client->request('POST', 'http://localhost:8888/process-image', [
'multipart' => [
[
'name' => 'image',
'contents' => fopen(public_path('storage/foto-ktp/foto_ktp.jpg'), 'r'),
'filename' => 'foto_ktp.jpg',
],
],
]);
$image = Image::make($fotoKTP);
$image->greyscale(); // Convert to grayscale
$image->contrast(10); // Increase contrast, adjust the value as needed
$preprocessedfotoKTP = public_path('storage/preprocessed/preprocessed_image.jpg');
$image->save($preprocessedfotoKTP);
$result = (new TesseractOCR($preprocessedfotoKTP))->run();
// (5) Normalize
$lines = explode("\n", $result);
$nikOCR = '';
$namaOCR = '';
$nikInputan = '3471140209790001';
$namaInputan = 'RIYANTO. SE';
foreach ($lines as $line) {
// Mencari NIK
if (strpos($line, $nikInputan) !== false) {
$nikOCR = preg_replace('/[^0-9]/', '', $line);
}
// Mencari nama
if (strpos($line, $namaInputan) !== false) {
$namaOCR = trim(substr($line, strpos($line, ':') + 1));
}
}
//Selesai
$persentase_kemiripan = (similar_text($nikInputan, $nikOCR, $percent) + similar_text($namaOCR, $namaOCR, $percent)) / 2;
// $status = 'Progress';
dd([$persentase_kemiripan, $lines]);
// if (similar_text($nikInputan, $nikOCR, $percent) >= 70 && similar_text($namaOCR, $namaOCR, $percent) >= 70) {
// $status = 'Progress';
// } else {
// $status = 'Progress';
// }
} catch (\Exception $e) {
// $status = 'Progress';
dd($e);
}
//OCR
dd($response->getBody()->getContents());
}
public function email(){
public function email()
{
$verificationEmail = [
'email' => 'Halo',
'code' => 'kode'
'code' => 'kode',
];
return view('email.verification-email',compact('verificationEmail'));
return view('email.verification-email', compact('verificationEmail'));
}
public function invoice(){
public function invoice()
{
// return view('invoice.export-invoice');
// $transaction = Transaction::findOrFail('80d9b19b-ba17-4aea-8cad-c3b4661d33bc');
$pdf = Pdf::loadView('invoice.export-invoice')->setPaper('A4','portrait');
return $pdf->download("invoice-".uniqid().".pdf");
$pdf = Pdf::loadView('invoice.export-invoice')->setPaper('A4', 'portrait');
return $pdf->download('invoice-' . uniqid() . '.pdf');
}
}

View File

@ -27,7 +27,7 @@ return new class extends Migration
$table->string('foto_ktp')->nullable();
$table->string('foto_wajah')->nullable();
$table->string('foto_profile')->nullable();
$table->integer('persentase_kemiripan')->nullable();
$table->float('persentase_kemiripan')->nullable();
$table->enum('status',['Finished','Progress','Rejected'])->default('Progress');
$table->string('gender',15);
$table->char('kode_kelurahan',10);

View File

@ -136,17 +136,16 @@
<span class="fw-bold text-start">Persentase Kemiripan</span>
<span class="text-muted ">{{ $user->persentase_kemiripan }}</span>
</div>
@if ($user->status == 'Progress')
<div class="d-flex justify-content-between align-items-center">
<div class="card-title pb-2 m-0">
<h4>Setujui pembuatan akun ini?</h4>
</div>
{{-- @if ($user->status == 'Progress') --}}
<div class="d-flex justify-content-between align-items-center">
<div class="card-title pb-2 m-0">
<h4>Setujui pembuatan akun ini?</h4>
</div>
<a class="btn btn-primary text-white" id="approveUser"
data-id="{{ $user->id }}">Setujui</a>
<a class="btn btn-danger text-white" id="denyUser"
data-id="{{ $user->id }}">Tolak</a>
@endif
</div>
<a class="btn btn-primary text-white" id="approveUser"
data-id="{{ $user->id }}">Setujui</a>
<a class="btn btn-danger text-white" id="denyUser" data-id="{{ $user->id }}">Tolak</a>
{{-- @endif --}}
</div>
</div>
</div>

View File

@ -629,13 +629,13 @@
return;
}
if (verificationCode == kode && waktuSekarangDetik > 0) {
verificationStatus = true;
}
// if (verificationCode == kode && waktuSekarangDetik > 0) {
// verificationStatus = true;
// }
let formData = new FormData(this);
formData.append('kode_verifikasi', verificationCode);
formData.append('verification_status', verificationStatus ? 'true' : 'false');
// formData.append('kode_verifikasi', verificationCode);
// formData.append('verification_status', verificationStatus ? 'true' : 'false');
Swal.fire({
html: '<div class="mt-3"><lord-icon src="https://cdn.lordicon.com/etwtznjn.json" trigger="loop" colors="primary:#0ab39c,secondary:#405189" style="width:120px;height:120px"></lord-icon><div class="mt-4 pt-2 fs-15"><h4>Form Anda sedang diproses!</h4><p class="text-muted mx-4 mb-0">Mohon tunggu...</p></div></div>',
@ -666,9 +666,9 @@
confirmButtonText: 'OK',
}).then(function() {
if (response.status) {
console.log(response);
location.reload();
}
console.log(response);
});
},
error: function(error) {