12. 플러터 : 개와 고양이 사진 분류 (케라스) (3)

모델 파일은 생성했고
이제 스마트폰에 올릴 코드를 구성하면 된다.
먼저 플러터 코드를 구성하고 다음 글에서 안드로이드 코드를 구현한다.


3번
안드로이드 스튜디오에서 flutter_catdog으로 플러터 프로젝트를 생성한다.
프로젝트 옵션에서는 지금처럼 코틀린 사용은 표시하지 않는다. ^^


4번
pubspec.yaml 파일을 열고 이미지 피커 모듈을 추가한다.
잊지 말고, 상단에 있는 Packages upgrade 메뉴를 눌러 업그레이드를 진행한다.


dependencies:
flutter:
sdk: flutter

# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
image_picker:


5번
안드로이드와 연동하는 코드를 구현한다.
사진과 카메라 중에서 선택할 수 있고
선택하거나 촬영한 사진으로부터 경로를 가져와서 안드로이드에 전달한다.


import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart'; // 이미지 피커

class CatDogNets extends StatefulWidget {
@override
CatDogNetsState createState() => CatDogNetsState();
}

class CatDogNetsState extends State<CatDogNets> {
static const MethodChannel mMethodChannel = MethodChannel('catdog/predict');

String mResult = 'No Photo!'; // 예측 결과를 수신할 문자열
File mPhoto; // 선택 또는 촬영한 사진. ImagePicker 반환값

@override
Widget build(BuildContext context) {
Widget photo = (mPhoto != null) ? Image.file(mPhoto) : Placeholder();

return Material(
child: Column(
children: <Widget>[
Expanded(
child: Center(child: photo),
),
Row(
children: <Widget>[Text(mResult, style: TextStyle(fontSize: 23))],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
),
Row(
children: <Widget>[
RaisedButton(
child: Text('사진', style: TextStyle(fontSize: 23)),
onPressed: () => onPhoto(ImageSource.gallery),
),
RaisedButton(
child: Text('카메라', style: TextStyle(fontSize: 23)),
onPressed: () => onPhoto(ImageSource.camera),
),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
)
],
mainAxisAlignment: MainAxisAlignment.end,
),
);
}

// 앨범과 카메라 양쪽에서 호출. ImageSource.gallery와 ImageSource.camera 두 가지밖에 없다.
void onPhoto(ImageSource source) async {
mPhoto = await ImagePicker.pickImage(source: source);

try {
var photoPath = <String, String>{'path': mPhoto.path};
String received = await mMethodChannel.invokeMethod('predictImage', photoPath);

// 안드로이드로부터 결과 수신하고, 선택한 사진으로 변경
mResult = received;
setState(() => {});
} on PlatformException {}
}
}

void main() {
runApp(MaterialApp(home: CatDogNets()));
}