본문 바로가기

Ai

문자인식기, google_mlkit_text_recognition , 복붙으로 만들기

복사 붙여 넣기로 . korea 로 설정해도 . 한글은 인식이 정말 안되네요 .

알파벳 영어와 숫자등에 특화가 되어 있습니다. .

 

구글 머신 러닝 텍스트 인식기 궁금해서 . 짜집기로 만들어 봅니다 . 카메라와 퍼미션 말고는 전부 복붙입니다.

버전 안드로이드 min sdk 21~23.

 
  permission_handler: ^11.1.0
  camera: ^0.10.5+9
  google_mlkit_text_recognition: ^0.11.0
 

google_mlkit_text_recognition | Flutter Package (pub.dev)

google_mlkit_text_recognition | Flutter Package

A Flutter plugin to use Google's ML Kit Text Recognition to recognize text in any Chinese, Devanagari, Japanese, Korean and Latin character set.

pub.dev

그래들 디펜던시

dependencies {
    // Add language package you need to use
    implementation 'com.google.mlkit:text-recognition-chinese:16.0.0-beta6'
    implementation 'com.google.mlkit:text-recognition-devanagari:16.0.0-beta6'
    implementation 'com.google.mlkit:text-recognition-japanese:16.0.0-beta6'
    implementation 'com.google.mlkit:text-recognition-korean:16.0.0-beta6'
}
 

korea 설정 해보고 안될시 . () 로 비워두기

final textRecognizer = TextRecognizer(script: TextRecognitionScript.korea);
 

영어가 더 잘된다 .

//flutter pub add camera
//flutter pub add google_mlkit_text_recognitionflutter pub add google_mlkit_text_recognition
class TextCamera extends StatefulWidget {
  const TextCamera({super.key});

  @override
  State<TextCamera> createState() => _TextCameraState();
}

class _TextCameraState extends State<TextCamera> with WidgetsBindingObserver {
  bool isPermission = false;
  late final Future<void> future;
  CameraController? cameraController;
  final textRecogniser  = TextRecognizer();


  //
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    future = requestCamera();
  }

  Future<void> requestCamera() async {
    final status = await Permission.camera.request();
    isPermission = status == PermissionStatus.granted;
  }

  Future<void> cameraSelected(CameraDescription camera) async {
    cameraController = CameraController(camera, ResolutionPreset.max, enableAudio: false);
    await cameraController?.initialize();
    if (!mounted) {
      return;
    }
    setState(() {});
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    WidgetsBinding.instance.removeObserver(this);
    stopCamera();
    textRecogniser.close();
  }

  //Start Camera
  void startCamera() {
    if (cameraController != null) {
      cameraSelected(cameraController!.description);
    }
  }

  //Stop Camera
  void stopCamera() {
    if (cameraController != null) {
      cameraController?.dispose();
    }
  }

  //It'll check if app is in foreground or background
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (cameraController == null || !cameraController!.value.isInitialized) {
      return;
    }
    if (state == AppLifecycleState.inactive) {
      stopCamera();
    } else if (state == AppLifecycleState.resumed &&
        cameraController != null &&
        cameraController!.value.isInitialized) {
      startCamera();
    }
  }
 
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: future,
        builder: (context, snapshot) {
          return Stack(
            children: [
              //Show camera content behind everything
              if (isPermission)
                FutureBuilder<List<CameraDescription>>(
                    future: availableCameras(),
                    builder: (context, snapshot) {
                      if (snapshot.hasData) {
                        initCameraController(snapshot.data!);
                        return Center(
                          child: CameraPreview(cameraController!),
                        );
                      } else {
                        return const LinearProgressIndicator();
                      }
                    }),
              Scaffold(
                appBar: AppBar(
                  title: const Text('Text Recognition Sample'),
                ),
                backgroundColor: isPermission ? Colors.transparent : null,
                body: isPermission
                    ? Column(
                        children: [
                          Expanded(child: Container()),
                          Container(
                            padding: EdgeInsets.only(bottom: 30),
                            child: ElevatedButton(
                                onPressed: () {
                                  scanImage();
                                },
                                child: Text('Scan Text')),
                          ),
                        ],
                      )
                    : Center(
                        child: Container(
                          padding: const EdgeInsets.only(left: 24.0, right: 24.0),
                          child: const Text(
                            'Camera Permission Denied',
                            textAlign: TextAlign.center,
                          ),
                        ),
                      ),
              ),
            ],
          );
        });
  }

  //
  //It is used to initialise the camera controller
  //It also check the available camera in your device
  //It also check if camera controller is initialised or not.
  void initCameraController(List<CameraDescription> cameras) {
    if (cameraController != null) {
      return;
    }
    //Select the first ream camera
    CameraDescription? camera;
    for (var a = 0; a < cameras.length; a++) {
      final CameraDescription current = cameras[a];
      if (current.lensDirection == CameraLensDirection.back) {
        camera = current;
        break;
      }
    }
    if (camera != null) {
      cameraSelected(camera);
    }
  }


  //It will take care of scanning text from image
  Future<void> scanImage() async {
    if (cameraController == null) {
      return;
    }
    final navigator = Navigator.of(context);
    try {
      final pictureFile = await cameraController!.takePicture();
      final file = File(pictureFile.path);
      final inputImage = InputImage.fromFile(file);
      final recognizerText = await textRecogniser.processImage(inputImage);
      await navigator.push(
        MaterialPageRoute(
          builder: (context) => ResultScreen(text: recognizerText.text),
        ),
      );
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(
          content: Text('An error occurred when scanning text'),
        ),
      );
    }
  }
  //
}

//
//
//

class ResultScreen extends StatelessWidget {
  final String text;
  const ResultScreen({Key? key, required this.text}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Text Recognition Sample'),
      ),
      body: Container(
        padding: EdgeInsets.all(30.0),
        child: SingleChildScrollView(child: Text(text)),
      ),
    );
  }
}