티스토리 뷰

명함 판독 앱에서 이름, 주소 등의 데이터를 가져오는 앱을 만들기 위해서는 OCR 기술과 명함 데이터 추출 알고리즘을 사용해야 합니다. OCR 기술을 사용하여 이미지에서 텍스트를 추출한 다음, 명함 데이터 추출 알고리즘을 사용하여 필요한 정보를 추출합니다.

아래는 Tesseract OCR 엔진과 OpenCV 라이브러리를 사용하여 명함에서 이름, 주소 등의 데이터를 추출하는 안드로이드 앱의 예제 코드입니다.

 

import android.graphics.Bitmap;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import com.googlecode.tesseract.android.TessBaseAPI;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {

    private static final String TESSERACT_DATA_PATH = "/tesseract/";
    private static final String TESSERACT_LANG = "eng";
    private static final String REGEX_PHONE_NUMBER = "(\\(\\d{3}\\)|\\d{3})[- .]?\\d{3}[- .]?\\d{4}";

    private TessBaseAPI tessBaseAPI;
    private Mat cardImage;
    private Bitmap cardBitmap;

    private final BaseLoaderCallback baseLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            if (status == LoaderCallbackInterface.SUCCESS) {
                // OpenCV 초기화 성공
            } else {
                super.onManagerConnected(status);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Tesseract OCR 초기화
        tessBaseAPI = new TessBaseAPI();
        tessBaseAPI.init(getExternalFilesDir(null) + TESSERACT_DATA_PATH, TESSERACT_LANG);

        // 명함 이미지 가져오기
        cardBitmap = ...
        cardImage = new Mat();
        Utils.bitmapToMat(cardBitmap, cardImage);

        // 명함 이미지 전처리
        preProcessImage(cardImage);

        // 이름, 주소, 전화번호 추출
        String name = extractName(cardImage);
        String address = extractAddress(cardImage);
        String phoneNumber = extractPhoneNumber(cardImage);
    }

    @Override
    protected void onResume() {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, baseLoaderCallback);
    }

    private void preProcessImage(Mat image) {
        // 명함 이미지 전처리
        Mat gray = new Mat();
        Mat blur = new Mat();
        Mat edges = new Mat();

        Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY);
        Imgproc.GaussianBlur(gray, blur, new Size(5, 5), 0);
        Imgproc.Canny(blur, edges, 75, 200);

        Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9, 9));
        Imgproc.dilate(edges, edges, element

 

반응형