Web

[Raspberry Pi + PHP] Tesseract OCR(광학) 텍스트 읽기

CodeSlave 2021. 11. 10. 21:26

PHP환경에서 간단하게 Tesseract OCR(광학) 리딩을 해보도록 하겠습니다.

 

라즈베리파이에서 아래 명령을 입력하여 Tesseract를 설치합니다.

1
$ sudo apt-get install tesseract-ocr
cs

첨부된 압축파일에 샘플 코드가 작성되어 있으니 참고하여 활용해주시면 됩니다.

웹서버 홈 디렉토리가 /var/www/html 이라고 가정하고 작성하였습니다.

jun-tesseract-ocr.7z
0.00MB
샘플 코드 파일 목록

 

웹서버에 업로드 후 index.php 페이지를 접속하면 아래와 같이 파일을 업로드하는 페이지가 나옵니다.

테스트로 이미지를 업로드 해보겠습니다.

index.php

 

이미지 파일을 선택 후 업로드하시면 사용한 명령어, 저장된 원본 이미지 경로, 흑백으로 변환된 이미지 경로,

저장된 인식 텍스트 파일, 저장된 인식 결과 경로를 표시하게끔 작업해놓았습니다.

이 후 업로드된 이미지의 텍스트를 읽어 인식결과에 표시해주고 흑백으로 변환된 이미지를 표시합니다.

upload.php

이제 코드를 살펴보겠습니다.

index.php는 단순히 파일을 업로드하기 위함이니 무시하고 upload.php를 보겠습니다.

Tesseract OCR 처리를 할 때는 인식률이 생각보다

매우 안좋아 흑백으로 변환하거나 노이즈를 없애는 등 처리가 필요하지만

현재 샘플에서는 흑백 변환만 테스트 해보도록 하겠습니다.

 

- 5번 라인에서는 업로드한 이미지가 저장될 경로를 지정하고

- 9~11번 라인에서는 이미지가 저장된 경로, 흑백 이미지가 저장될 경로, 인식 결과가 저장될 경로등을 지정합니다.

- 13~16번 라인에서는 이미지를 흑백으로 변환하여 저장합니다.

- 18번 라인에서는 PHP에서 쉘 명령어를 실행하여 Tesseract OCR을 작동시킵니다.
해당 명령어를 사용하게 되면 인식된 텍스트를 지정한 경로에 저장합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
$file_name = $_FILES['upload_file']['name'];
$tmp_file = $_FILES['upload_file']['tmp_name'];
 
$file_path = 'images/'.$file_name;
 
$r = move_uploaded_file($tmp_file$file_path);
 
$imgPath     = '/var/www/html/images/'.$file_name;        //흑백으로 변환할 이미지
$grayPath   = '/var/www/html/images/tmp.'.$file_name;    //흑백이미지가 저장될 경로
$resultPath = '/var/www/html/result/tmp.'.$file_name;    //인식 결과가 저장될 경로
 
$image = imagecreatefromjpeg($imgPath);     
imagefilter($image, IMG_FILTER_GRAYSCALE);
imagejpeg($image$grayPath);                 
imagedestroy($image);
 
$execute = '"tesseract" "'.$grayPath.'" "'.$resultPath.'"';
shell_exec($execute);
?> 
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
        <meta name="author" content="" />
        <title>OCR 테스트 결과</title>
        
        <!-- BootStrap CDN -->
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js"></script>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    </head>
 
    <body style="min-width:450px;">
        <div style="width:100%;">
            <div class="card">
                <div class="card card-header">
                    <h1>테서랙트 무료 OCR 테스트</h1>
                </div>
 
                <div class="card card-body" style="font-size:small;">
                    <p><span>사용 명령값 </span></p>
                    <p>>> <?php echo $execute;?></p>
 
                    <p><span>이미지 경로</span></p>
                    <p>>> <?php echo $imgPath;?></p>
 
                    <p><span>그레이 이미지 변환 경로</span></p>
                    <p>>> <?php echo $grayPath;?></p>
 
                    <p><span>인식 결과 파일 경로</span></p>
                    <p>>> <?php echo $resultPath.'.txt';?></p>
 
                    <p><span>인식 결과</span></p>
                    <p>>> <?php echo readfile($resultPath.'.txt');?></p>
 
                    <p><span>변환된 이미지</span>    </p>
                    <img src="images/tmp.<?php echo $file_name;?>"/>
                </div>
        </div>
    </body> 
    </body>
</html>
cs

 

해당 경로들을 사용하시는 환경에 맞추어 설정하신 후

테스트 이미지를 업로드하면 아래와 같이 결과를 확인하실 수 있습니다.

테스트이미지 (Test.jpg)
파일 업로드 (index.php)
인식된 결과(upload.php)

인식 결과의 정확성을 높이기 위해서는
이미지 이진화 및 노이즈 제거 등 작업이 필요하거나 명령어에 옵션을 추가하는 등
작업이 필요할 수 있습니다.
해당 내용 관련하여 참고 가능한 사이트 링크도 첨부해드립니다.
 

Tesseract를 사용하여 Linux 명령 줄에서 OCR을 수행하는 방법 - 최신

Fatmawati Achmad Zaenuri / Shutterstock Tesseract OCR 엔진을 사용하여 Linux 명령 줄의 이미지에서 텍스트를 추출 할 수 있습니다. 빠르고 정확하며 약 100 개 언어로 작동합니다. 사용 방법은 다음과 같습니다

choesin.com

 

image processing to improve tesseract OCR accuracy

I've been using tesseract to convert documents into text. The quality of the documents ranges wildly, and I'm looking for tips on what sort of image processing might improve the results. I've noti...

stackoverflow.com