Flutter图像分割插件splicerai的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter图像分割插件splicerai的使用

SplicerAi Flutter Plugin

Pub Version

Extrieve Technologies - 您的文档管理和AI解决方案专家

SplicerAi Flutter Plugin 提供了一套工具,用于将高级文档管理和基于AI的KYC(了解您的客户)解决方案集成到您的Flutter应用程序中。通过这个插件,您可以轻松地对Aadhaar卡进行遮罩处理,检测和提取KYC文档信息,并验证KYC文档。

功能

  • Aadhaar遮罩:自动遮罩Aadhaar卡上的敏感信息以保护用户隐私。
  • KYC文档检测:检测提供的KYC文档类型(例如Aadhaar、护照、PAN卡)。
  • KYC信息提取:从KYC文档中提取结构化数据以便于处理。
  • KYC文档验证:验证KYC文档的真实性。
  • 支持的文档类型:获取所有受支持的KYC文档类型的列表。

快速开始

前提条件

  • Flutter SDK:确保您已经在机器上安装了Flutter。有关安装说明,请访问 Flutter官方文档
  • Dart SDK:包含在Flutter SDK中。

安装

在项目的 pubspec.yaml 文件中添加 splicerai

dependencies:
  flutter:
    sdk: flutter
  splicerai: ^1.0.0 # 替换为最新版本

然后,运行 flutter pub get 来获取包。

集成

导入包

import 'package:splicerai/splicerai.dart';

许可激活

在使用插件之前,您需要激活许可证。请替换 "<Your Android License Key>""<Your iOS License Key>" 为Extrieve Technologies提供的许可证密钥。

Future<void> activateLicense() async {
  String androidLicense = "<Your Android License Key>";
  String iosLicense = "<Your iOS License Key>";

  try {
    bool? isActivated = await SplicerAi().activateLicense(
      android: androidLicense,
      ios: iosLicense,
    );

    if (isActivated == true) {
      print("许可证激活成功");
    } else {
      print("许可证激活失败。请检查您的许可证。");
    }
  } catch (e) {
    print("激活许可证时出错: ${e.toString()}");
  }
}

使用示例

1. Aadhaar遮罩

对Aadhaar卡图像中的敏感信息进行遮罩。

Future<void> maskAadhaar(String imagePath) async {
  try {
    String? maskedImagePath = await SplicerAi.maskAadhaar(imagePath);

    if (maskedImagePath != null) {
      print("Aadhaar遮罩成功。遮罩后的图像路径: $maskedImagePath");
    } else {
      print("Aadhaar遮罩失败");
    }
  } catch (e) {
    print("Aadhaar遮罩时出错: ${e.toString()}");
  }
}
2. KYC文档检测

检测图像中的KYC文档类型。

Future<void> detectKYCDocument(String imagePath) async {
  try {
    String? detectionResult = await SplicerAi.detectKYCDocument(imagePath);

    if (detectionResult != null) {
      print("检测到的KYC文档类型: $detectionResult");
    } else {
      print("KYC文档检测失败");
    }
  } catch (e) {
    print("KYC文档检测时出错: ${e.toString()}");
  }
}
3. KYC信息提取

从KYC文档中提取信息。

Future<void> extractKYCDocument(String imagePath) async {
  try {
    String? extractionResult = await SplicerAi.extractKYCDocument(imagePath);

    if (extractionResult != null) {
      print("KYC文档提取结果: $extractionResult");
    } else {
      print("KYC文档提取失败");
    }
  } catch (e) {
    print("KYC文档提取时出错: ${e.toString()}");
  }
}
4. 获取支持的KYC文档类型

获取所有支持的KYC文档类型的列表。

Future<void> getSupportedKYCDocuments() async {
  try {
    String? docListJson = await SplicerAi.getSupportedKYCDocList();

    if (docListJson != null) {
      List<dynamic> docList = jsonDecode(docListJson);
      print("支持的KYC文档类型: ${docList.join(', ')}");
    } else {
      print("未能获取支持的KYC文档类型");
    }
  } catch (e) {
    print("获取支持的KYC文档类型时出错: ${e.toString()}");
  }
}
5. KYC文档验证

验证KYC文档是否符合指定的文档类型。

Future<void> verifyKYCDocument(String imagePath, String documentType) async {
  try {
    String? verificationResult = await SplicerAi.verifyKYCDocument(
      imagePath,
      documentType,
    );

    if (verificationResult != null) {
      print("KYC文档验证结果: $verificationResult");
    } else {
      print("KYC文档验证失败");
    }
  } catch (e) {
    print("KYC文档验证时出错: ${e.toString()}");
  }
}

完整示例

以下是一个完整的示例,集成了上述所有功能:

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:splicerai/splicerai.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'dart:io';
import 'dart:convert';

void main() {
  runApp(const MyApp());
}

/// 应用程序的根组件
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'SplicerAi Flutter Plugin 示例',
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

/// 主页组件,显示主要功能
class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  HomePageState createState() => HomePageState();
}

/// 主页的状态类
class HomePageState extends State<HomePage> {
  final ImagePicker _picker = ImagePicker();
  String? _selectedImagePath;
  String? _processedImagePath;
  String? _kycResponseData;
  bool _isLoading = false;
  List<String> _supportedKYCDocs = [];

  @override
  void initState() {
    super.initState();
    activateLicense();
    fetchSupportedKYCDocList();
  }

  Future<void> activateLicense() async {
    String androidLicense = "<Your Android License Key>";
    String iosLicense = "<Your iOS License Key>";

    try {
      bool? isActivated = await SplicerAi().activateLicense(
        android: androidLicense,
        ios: iosLicense,
      );

      if (isActivated == true) {
        _showToast("许可证激活成功", isSuccess: true);
      } else {
        _showToast("许可证激活失败。请检查您的许可证.", isSuccess: false);
      }
    } catch (e) {
      _showToast("激活许可证时出错: ${e.toString()}", isSuccess: false);
    }
  }

  Future<void> fetchSupportedKYCDocList() async {
    try {
      String? jsonString = await SplicerAi.getSupportedKYCDocList();
      if (jsonString != null && jsonString.isNotEmpty) {
        List<dynamic> jsonList = jsonDecode(jsonString);
        List<String> docs = jsonList.map((item) => item.toString()).toList();

        setState(() {
          _supportedKYCDocs = docs;
        });
      } else {
        _showSnackBar('未找到支持的KYC文档');
      }
    } catch (e) {
      _showSnackBar('获取KYC文档时出错: ${e.toString()}');
    }
  }

  Future<void> _pickImage() async {
    try {
      final XFile? pickedFile = await _picker.pickImage(source: ImageSource.gallery);

      if (pickedFile != null) {
        setState(() {
          _selectedImagePath = pickedFile.path;
          _processedImagePath = null;
          _kycResponseData = null;
        });
      } else {
        _showSnackBar('未选择图像');
      }
    } catch (e) {
      _showSnackBar('选择图像时出错: ${e.toString()}');
    }
  }

  Future<void> _processAadhaarMask() async {
    if (_selectedImagePath == null) {
      _showSnackBar('请先附加图像');
      return;
    }

    setState(() => _isLoading = true);

    try {
      String? result = await SplicerAi.maskAadhaar(_selectedImagePath!);

      if (result != null) {
        String newPath = _selectedImagePath!.replaceFirstMapped(
          RegExp(r'(\.\w+)$'), 
          (Match match) => '_masked${match.group(1)}',
        );

        await File(result).copy(newPath);

        setState(() {
          _processedImagePath = newPath;
        });

        _showSnackBar('Aadhaar遮罩成功');

        if (await File(_processedImagePath!).exists()) {
          print('已成功保存处理后的图像到 $_processedImagePath');
        } else {
          print('处理后的图像文件不存在于 $_processedImagePath');
        }
      } else {
        _showSnackBar('Aadhaar遮罩失败');
      }
    } catch (e) {
      _showSnackBar('Aadhaar遮罩时出错: ${e.toString()}');
    } finally {
      setState(() => _isLoading = false);
    }
  }

  Future<void> _processKYC(String type) async {
    if (_selectedImagePath == null) {
      _showSnackBar('请先附加图像');
      return;
    }

    setState(() => _isLoading = true);

    try {
      String? result;
      if (type == 'detect') {
        result = await SplicerAi.detectKYCDocument(_selectedImagePath!);
      } else if (type == 'extract') {
        result = await SplicerAi.extractKYCDocument(_selectedImagePath!);
      }

      if (result != null) {
        setState(() {
          _kycResponseData = result;
        });
        _showSnackBar('KYC $type 处理成功');
      } else {
        _showSnackBar('处理KYC $type 失败');
      }
    } catch (e) {
      _showSnackBar('处理KYC $type 时出错: ${e.toString()}');
    } finally {
      setState(() => _isLoading = false);
    }
  }

  void _openKYCVerifyDialog() {
    if (_selectedImagePath == null) {
      _showSnackBar('请先附加图像');
      return;
    }

    if (_supportedKYCDocs.isEmpty) {
      _showSnackBar('没有可用的支持的KYC文档');
      return;
    }

    String? selectedDoc;

    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('KYC验证'),
          content: SingleChildScrollView(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                FutureBuilder<Uint8List>(
                  future: File(_selectedImagePath!).readAsBytes(),
                  builder: (context, snapshot) {
                    if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) {
                      return Image.memory(
                        snapshot.data!,
                        fit: BoxFit.contain,
                        width: MediaQuery.of(context).size.width * 0.8,
                        height: MediaQuery.of(context).size.height * 0.4,
                      );
                    } else {
                      return const CircularProgressIndicator();
                    }
                  },
                ),
                const SizedBox(height: 20),
                DropdownButtonFormField<String>(
                  decoration: const InputDecoration(
                    labelText: '选择文档',
                    border: OutlineInputBorder(),
                  ),
                  items: _supportedKYCDocs.map((String doc) {
                    return DropdownMenuItem<String>(
                      value: doc,
                      child: Text(doc),
                    );
                  }).toList(),
                  onChanged: (String? newValue) {
                    selectedDoc = newValue;
                  },
                ),
              ],
            ),
          ),
          actions: [
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: const Text('取消'),
            ),
            ElevatedButton(
              onPressed: () {
                if (selectedDoc != null) {
                  Navigator.of(context).pop();
                  _verifyKYC(selectedDoc!);
                } else {
                  _showSnackBar('请选择文档');
                }
              },
              child: const Text('验证'),
            ),
          ],
        );
      },
    );
  }

  Future<void> _verifyKYC(String documentType) async {
    setState(() => _isLoading = true);

    try {
      String? result = await SplicerAi.verifyKYCDocument(
        _selectedImagePath!,
        documentType,
      );

      if (result != null) {
        setState(() {
          _kycResponseData = result;
        });
        _showSnackBar('KYC验证成功');
      } else {
        _showSnackBar('KYC验证失败');
      }
    } catch (e) {
      _showSnackBar('KYC验证时出错: ${e.toString()}');
    } finally {
      setState(() => _isLoading = false);
    }
  }

  void _showSnackBar(String message) {
    if (!mounted) return;
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text(message)),
    );
  }

  void _showToast(String message, {required bool isSuccess}) {
    Fluttertoast.showToast(
      msg: message,
      toastLength: Toast.LENGTH_SHORT,
      gravity: ToastGravity.CENTER,
      backgroundColor: isSuccess ? Colors.green : Colors.red,
      textColor: Colors.white,
      fontSize: 16.0,
    );
  }

  @override
  Widget build(BuildContext context) {
    String? displayImagePath = _processedImagePath ?? _selectedImagePath;

    return Scaffold(
      appBar: AppBar(
        title: const Text('SplicerAi Flutter Plugin 示例'),
      ),
      body: Stack(
        children: [
          SingleChildScrollView(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                const SizedBox(height: 20),
                Center(
                  child: ElevatedButton(
                    onPressed: _pickImage,
                    child: const Text('附加图像'),
                  ),
                ),
                const SizedBox(height: 20),
                if (displayImagePath != null) ...[
                  Column(
                    children: [
                      const Text(
                        '选择的图像',
                        style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
                      ),
                      const SizedBox(height: 10),
                      FutureBuilder<Uint8List>(
                        future: File(displayImagePath).readAsBytes(),
                        builder: (context, snapshot) {
                          if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) {
                            return Image.memory(
                              snapshot.data!,
                              fit: BoxFit.contain,
                              width: MediaQuery.of(context).size.width * 0.8,
                            );
                          } else {
                            return const CircularProgressIndicator();
                          }
                        },
                      ),
                    ],
                  ),
                  const SizedBox(height: 20),
                  Wrap(
                    spacing: 10,
                    runSpacing: 10,
                    alignment: WrapAlignment.center,
                    children: [
                      ElevatedButton(
                        onPressed: _processAadhaarMask,
                        child: const Text('Aadhaar遮罩'),
                      ),
                      ElevatedButton(
                        onPressed: () => _processKYC('detect'),
                        child: const Text('KYC检测'),
                      ),
                      ElevatedButton(
                        onPressed: () => _processKYC('extract'),
                        child: const Text('KYC提取'),
                      ),
                      ElevatedButton(
                        onPressed: _openKYCVerifyDialog,
                        child: const Text('KYC验证'),
                      ),
                    ],
                  ),
                ],
                if (_kycResponseData != null) ...[
                  const SizedBox(height: 20),
                  const Text(
                    '响应数据:',
                    style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
                  ),
                  Container(
                    margin: const EdgeInsets.all(10),
                    padding: const EdgeInsets.all(10),
                    constraints: BoxConstraints(
                      maxWidth: MediaQuery.of(context).size.width * 0.9,
                      maxHeight: MediaQuery.of(context).size.height * 0.4,
                    ),
                    decoration: BoxDecoration(
                      border: Border.all(color: Colors.grey),
                      borderRadius: BorderRadius.circular(8),
                    ),
                    child: SingleChildScrollView(
                      scrollDirection: Axis.vertical,
                      child: Text(
                        const JsonEncoder.withIndent('  ').convert(jsonDecode(_kycResponseData!)),
                        style: const TextStyle(fontSize: 14),
                      ),
                    ),
                  ),
                ],
              ],
            ),
          ),
          if (_isLoading)
            Container(
              color: Colors.black.withOpacity(0.5),
              child: const Center(child: CircularProgressIndicator()),
            ),
        ],
      ),
    );
  }
}

其他信息

注意事项

  • 隐私与安全:始终安全地处理用户数据,并确保遵守适用的法律和法规。
  • 错误处理:在应用中实现适当的错误处理,以提供流畅的用户体验。

通过集成SplicerAi Flutter Plugin,您可以增强应用程序的文档管理和AI能力,为用户提供安全高效的KYC处理体验。


更多关于Flutter图像分割插件splicerai的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图像分割插件splicerai的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用SplicerAI进行图像分割,你可以通过调用其提供的API来实现。虽然SplicerAI本身可能不是一个官方的Flutter插件,但你可以通过集成其提供的REST API或SDK(如果可用)来实现图像分割功能。以下是一个基本的思路,假设SplicerAI提供了一个REST API来进行图像分割。

1. 添加依赖

首先,确保你的Flutter项目中包含了必要的网络请求库,比如diohttp。这里以dio为例。

pubspec.yaml中添加dio依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.4  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

2. 导入依赖并创建API请求

接下来,在你的Flutter应用中导入dio库,并创建一个函数来调用SplicerAI的API。

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'dart:typed_data';
import 'dart:ui' as ui;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImageSegmentationPage(),
    );
  }
}

class ImageSegmentationPage extends StatefulWidget {
  @override
  _ImageSegmentationPageState createState() => _ImageSegmentationPageState();
}

class _ImageSegmentationPageState extends State<ImageSegmentationPage> {
  final Dio _dio = Dio();
  Uint8List? _imageBytes;
  Map<String, dynamic>? _segmentationResult;

  Future<void> _pickImage() async {
    final pickedFile = await ImagePicker().pickImage(source: ImageSource.camera);
    if (pickedFile != null) {
      setState(() {
        _imageBytes = pickedFile.readAsBytesSync();
      });
      _uploadImageForSegmentation();
    }
  }

  Future<void> _uploadImageForSegmentation() async {
    final formData = FormData.fromMap({
      'image': _dio.formDataPartFromBytes(
        'image',
        _imageBytes!,
        filename: 'image.jpg',
        contentType: MediaType.parse('image/jpeg'),
      ),
    });

    try {
      final response = await _dio.post('https://api.splicerai.com/segment', data: formData);
      final resultData = jsonDecode(response.data);
      setState(() {
        _segmentationResult = resultData;
      });
      // 处理分割结果,比如显示分割后的图像或数据
    } catch (error) {
      print('Error uploading image: $error');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Segmentation with SplicerAI'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _imageBytes == null
              ? Text('No image selected.')
              : Image.memory(_imageBytes!),
            if (_segmentationResult != null)
              Text('Segmentation Result: $_segmentationResult'),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 注意事项

  1. API端点:上面的代码示例中,https://api.splicerai.com/segment是一个假设的API端点。你需要替换为SplicerAI实际提供的API端点。

  2. API认证:如果SplicerAI的API需要认证(比如API密钥或OAuth),你需要在请求头中添加相应的认证信息。

  3. 错误处理:上面的代码简单地打印了错误消息。在实际应用中,你可能需要更细致的错误处理逻辑,比如显示错误对话框给用户。

  4. 图像显示:上面的代码直接显示了原始图像。如果你需要根据分割结果来显示分割后的图像,你需要根据返回的数据进行额外的处理。

  5. 依赖管理:确保你的dio库版本与Flutter SDK兼容,并定期检查是否有可用的更新。

  6. 安全性:不要在客户端代码中硬编码敏感信息,比如API密钥。考虑使用环境变量或安全的密钥管理服务。

这个示例提供了一个基本的框架,你可以根据SplicerAI的具体API文档和需求进行调整和扩展。

回到顶部