복사 붙여 넣기로 . 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)),
),
);
}
}
'Ai' 카테고리의 다른 글
flutter Dalle-3 2 달리 이미지 생성 ai 예제. (0) | 2024.01.12 |
---|---|
기계학습 & 유형 Machine Learning (1) | 2023.12.26 |
GPT와 BARD 가 못푸는 산수 코딩문제 , basic coding but GPT & BARD can't solve (0) | 2023.12.25 |
GPT 에 질문하는 가장 쉬운 간단한 예제 및 방법, 질문형식 (1) | 2023.12.24 |
Google Ai Gemini Story of Legends 구글 제미니 쌍둥이별자리 이야기 by GTP4 (0) | 2023.12.07 |