Flutter摄影测量插件photogrammetry的使用

Flutter摄影测量插件photogrammetry的使用

photogrammetry

Pub Version analysis License: MIT

Photogrammetry 是一个 Flutter 插件,它使 Flutter 应用程序能够从一系列图像创建 3D 模型。

Requirements

MacOS

  • 最低 macOS 部署目标:12.0
  • Xcode 15 或更新版本
  • Swift 5
  • ML Kit 仅支持 64 位架构(x86_64 和 arm64)

iOS

  • 最低 iOS 部署目标:17.0
  • Xcode 15 或更新版本
  • Swift 5
  • ML Kit 仅支持 64 位架构(x86_64 和 arm64)

Getting Started

首先需要导入 'package:photogrammetry/photogrammetry.dart';

bool isProcessing = false;
String? complete;
Photogrammetry? pg;
String? path;

[@override](/user/override)
void initState(){
  super.initState();
}

[@override](/user/override)
void dispose(){
  pg?.dispose();
  super.dispose();
}

Future<void> selectFolder() async {
  try {
    await FilePicker.platform.getDirectoryPath().then((value){
      if(value != null){
        setState(() {
          isProcessing = true;
        });
        pg = Photogrammetry()..process(
          pgData: PhotogrammetryData(
            path: value,
            name: 'TestHuman1',
            quality: PhotogrammetryQuality.preview
          ),
          onProgressChanged: (progress){
            setState(() {
              complete = '${(progress*100).toStringAsFixed(2)}%';
            });
          },
          onProcessingCompleted: (path){
            this.path = path;
          },
          onComplete: (){
            setState(() {
              isProcessing = false;
              complete = null;
            });
            print('complete');
          }
        );
      }
    });
  } 
  on PlatformException catch (e) {
    print('Unsupported operation Select: $e');
  } 
  catch (e) {
    print('Select: $e');
  }
}

[@override](/user/override)
Widget build(BuildContext context) {
  return Scaffold(
    body: Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          const Text(
            '点击文件夹图标开始!',
          ),
          Text(
            isProcessing ? '处理中' : '未处理',
            style: Theme.of(context).textTheme.headlineMedium,
          ),
          if(complete != null || path != null)Text(
            complete != null ? complete! : path != null ? path! : '',
            style: Theme.of(context).textTheme.headlineMedium,
          ),
          InkWell(
            onTap: selectFolder,
            child: Container(
              width: 140,
              height: 45,
              decoration: BoxDecoration(
                color: Colors.purple[100],
                borderRadius: BorderRadius.circular(5)
              ),
              padding: const EdgeInsets.fromLTRB(10,0,10,0),
              margin: EdgeInsets.only(top: 20),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Icon(
                    Icons.folder,
                    color: Colors.purple[900]
                  ),
                  Text(
                    '选择文件夹',
                    style: Theme.of(context).textTheme.bodySmall?.copyWith(color: Colors.purple[900]),
                  ),
                ],
              ),
            ),
          )
        ],
      ),
    ),
    floatingActionButton: FloatingActionButton(
      onPressed: () {
        pg?.abort();
      },
      tooltip: '取消操作',
      backgroundColor: Colors.purple[100],
      child: Icon(Icons.cancel, color: Colors.purple[900],),
    ),
  );
}

更多关于Flutter摄影测量插件photogrammetry的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter摄影测量插件photogrammetry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,虽然直接针对摄影测量(Photogrammetry)的官方插件可能并不常见,但你可以通过集成一些支持摄影测量功能的原生库来实现这一功能。通常,摄影测量涉及复杂的图像处理和3D重建算法,这些任务往往更适合在原生代码(如C++或Java/Kotlin)中实现,然后通过Flutter的平台通道(Platform Channels)与Flutter应用进行交互。

下面是一个简化的示例,展示如何通过Flutter平台通道调用原生Android代码(Java/Kotlin)进行摄影测量相关的操作。请注意,这里的代码不会直接实现完整的摄影测量算法,而是展示如何设置平台通道并调用原生方法。实际的摄影测量实现需要依赖专业的库或算法。

Flutter端代码

首先,在Flutter项目中创建一个平台通道,用于与原生代码通信。

import 'package:flutter/services.dart';

class PhotogrammetryChannel {
  static const MethodChannel _channel = MethodChannel('com.example.photogrammetry');

  // 假设我们有一个方法进行摄影测量相关的计算
  Future<String?> performPhotogrammetry(List<String> imagePaths) async {
    try {
      final result = await _channel.invokeMethod('performPhotogrammetry', imagePaths);
      return result;
    } on PlatformException catch (e) {
      print("Failed to invoke: '${e.message}'.");
      return null;
    }
  }
}

Android端代码(Java/Kotlin)

接下来,在Android项目中实现对应的方法。这里以Kotlin为例。

MainActivity.kt

package com.example.yourapp

import android.content.Context
import android.os.Bundle
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.photogrammetry"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "performPhotogrammetry") {
                val imagePaths = call.argument<List<String>>("imagePaths") ?: emptyList()
                val resultFromNativeCode = performPhotogrammetry(imagePaths, applicationContext)
                result.success(resultFromNativeCode)
            } else {
                result.notImplemented()
            }
        }
    }

    private fun performPhotogrammetry(imagePaths: List<String>, context: Context): String {
        // 这里你应该调用实际的摄影测量库或算法
        // 由于摄影测量算法的复杂性,这里仅返回一个示例字符串
        return "Photogrammetry result for images: $imagePaths"
    }
}

注意事项

  1. 摄影测量库:在实际应用中,你需要找到一个支持Android的摄影测量库(如OpenMVG、COLMAP等),并在performPhotogrammetry方法中调用该库的功能。这些库通常提供C++ API,你可能需要通过JNI(Java Native Interface)来调用它们。

  2. 性能与资源:摄影测量是一个计算密集型任务,可能需要大量内存和CPU资源。确保在调用这些功能时考虑应用的性能和资源使用情况。

  3. 权限处理:如果你的应用需要访问设备存储中的图像,确保在AndroidManifest.xml中声明了必要的权限,并在运行时请求这些权限。

  4. 错误处理:在实际应用中,添加更详细的错误处理逻辑,以处理可能发生的各种异常情况。

通过上述步骤,你可以在Flutter应用中集成摄影测量的功能,尽管实际的摄影测量实现需要依赖原生代码和专业的库。

回到顶部