You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Flutter Windows应用集成原生OpenCV库?附动态库创建指南

Flutter Windows集成原生OpenCV库(含获取版本示例)

准备工作

  • 下载安装OpenCV Windows版(推荐选择包含opencv_worldxxx.dll的发行版,例如4.8.0),记录安装路径(如C:\opencv)
  • 确保Flutter已配置Windows开发环境(执行flutter doctor验证)

步骤1:创建OpenCV封装动态库

1.1 新建原生项目结构

创建名为opencv_native的文件夹,添加以下两个文件:

opencv_wrapper.cpp(封装OpenCV接口)

#include <opencv2/core/version.hpp>
#include <cstdlib>
#include <cstring>

// 使用extern "C"避免C++名字修饰,确保Dart能正确找到函数
extern "C" {
    // 返回OpenCV版本字符串,内存由malloc分配,需调用free_memory释放
    const char* get_opencv_version() {
        const char* version_str = CV_VERSION;
        char* allocated_str = (char*)malloc(strlen(version_str) + 1);
        strcpy(allocated_str, version_str);
        return allocated_str;
    }

    // 供Dart调用释放内存的函数
    void free_memory(char* ptr) {
        free(ptr);
    }
}

CMakeLists.txt(编译配置)

cmake_minimum_required(VERSION 3.10)
project(opencv_native)

# 指定C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 替换为你的OpenCV安装路径
set(OpenCV_DIR "C:/opencv/build")
find_package(OpenCV REQUIRED)

# 生成动态库
add_library(opencv_native SHARED opencv_wrapper.cpp)

# 链接OpenCV依赖库
target_link_libraries(opencv_native ${OpenCV_LIBS})

# 设置动态库输出目录,方便后续拷贝
set_target_properties(opencv_native PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output
)

1.2 编译动态库

  1. 打开CMake GUI,选择opencv_native为源代码目录,新建build文件夹作为编译目录
  2. 点击Configure,选择对应版本的Visual Studio(如2022 x64),完成配置
  3. 点击Generate,然后选择Open Project打开Visual Studio
  4. 选择Release模式编译项目,编译完成后,output/Release目录会生成opencv_native.dll
  5. 从OpenCV安装目录(如C:\opencv\build\x64\vc16\bin)拷贝对应版本的opencv_worldxxx.dll到output/Release目录

步骤2:Flutter项目集成与FFI调用

2.1 拷贝动态库到Flutter项目

将opencv_native.dll和opencv_worldxxx.dll拷贝到Flutter项目的windows/runner/Release目录(Debug模式则拷贝到windows/runner/Debug,需对应使用OpenCV的Debug版库)

2.2 编写Dart FFI代码

在lib目录下新建opencv_ffi.dart:

import 'dart:ffi';
import 'dart:io';
import 'package:ffi/ffi.dart';

// 加载动态库
final DynamicLibrary _opencvLib = Platform.isWindows
    ? DynamicLibrary.open('opencv_native.dll')
    : throw UnsupportedError('仅支持Windows平台');

// 定义函数签名
typedef _GetVersionFunc = Pointer<Utf8> Function();
typedef _GetVersion = Pointer<Utf8> Function();

typedef _FreeMemoryFunc = Void Function(Pointer<Utf8>);
typedef _FreeMemory = void Function(Pointer<Utf8>);

// 获取函数指针
final _getVersion = _opencvLib.lookupFunction<_GetVersionFunc, _GetVersion>('get_opencv_version');
final _freeMemory = _opencvLib.lookupFunction<_FreeMemoryFunc, _FreeMemory>('free_memory');

// 封装调用方法,自动处理内存释放
String getOpenCVVersion() {
  final versionPtr = _getVersion();
  final version = versionPtr.toDartString();
  _freeMemory(versionPtr); // 释放C层分配的内存
  return version;
}

2.3 在Flutter界面中调用

修改lib/main.dart:

import 'package:flutter/material.dart';
import 'opencv_ffi.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('OpenCV版本查询')),
        body: Center(
          child: FutureBuilder<String>(
            future: Future.value(getOpenCVVersion()),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Text('OpenCV版本:${snapshot.data}');
              } else if (snapshot.hasError) {
                return Text('错误:${snapshot.error}');
              }
              return const CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }
}

步骤3:运行项目

执行以下命令启动Flutter Windows应用:

flutter run -d windows

界面将显示当前集成的OpenCV版本号。


内容的提问来源于stack exchange,提问作者Ibne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:17:50