栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Flutter的本机C ++中使用OpenCV 4?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Flutter的本机C ++中使用OpenCV 4?

这是我的解决方案。

特征

  1. 适用于Android和iOS。
  2. 使用静态链接而不是动态链接。(因此,代码大小要小得多。)
  3. 最新版本为2020.07.28。(由于这些API的变化很快,而且许多文章都有些陈旧。)

入门

注意:如果您已经有一个应用程序,则可以跳过本节:)本节假定您根本没有任何代码。

可以从此处下载示例代码。

步骤0 :确保您具有Flutter环境,并遵循官方的“使用Flutter编写C
++”教程

注意必须 遵循“在iOS上,您需要告诉Xpre静态链接文件:…”的步骤。否则,在我们的最后一步,iOS将抱怨找不到该符号。

第1步
:使用OpenCV编写所需的任何代码。例如,我更改

ios/Classes/native_add.cpp
为以下愚蠢的代码,与官方教程中的代码几乎相同:

#include <stdint.h>#include <opencv2/core.hpp>extern "C" __attribute__((visibility("default"))) __attribute__((used))int32_t native_add(int32_t x, int32_t y) {    cv::Mat m = cv::Mat::zeros(x, y, CV_8UC3);    return m.rows + m.cols;}

安卓系统

步骤0
:从官方网站下载Android OpenCV sdk
。假设我将其放在桌面上。

/Users/tom/Others/OpenCVRelease/OpenCV-android-sdk

步骤1.1 :将更

android/CMakeLists.txt
改为以下内容。 注意
:首先将更
OPENCV_base_DIR
改为您的文件夹。

cmake_minimum_required(VERSION 3.4.1)# TODO please change me!set(OPENCV_base_DIR "TODO PLEASE PUT YOUR DIR HERE!!!")set(OPENCV_INCLUDE_DIR "${OPENCV_base_DIR}/sdk/native/jni/include/")set(OPENCV_STATIC_LIB_DIR "${OPENCV_base_DIR}/sdk/native/staticlibs/${ANDROID_ABI}")set(OPENCV_3RDPARTY_STATIC_LIB_DIR "${OPENCV_base_DIR}/sdk/native/3rdparty/libs/${ANDROID_ABI}")include_directories(${OPENCV_INCLUDE_DIR})find_library(log-lib log)add_library(highgui STATIC importED)set_target_properties(highgui PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_highgui.a)add_library(calib3d STATIC importED)set_target_properties(calib3d PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_calib3d.a)add_library(core STATIC importED)set_target_properties(core PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_core.a)add_library(dnn STATIC importED)set_target_properties(dnn PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_dnn.a)add_library(flann STATIC importED)set_target_properties(flann PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_flann.a)add_library(imgproc STATIC importED)set_target_properties(imgproc PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_imgproc.a)add_library(videoio STATIC importED)set_target_properties(videoio PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_videoio.a)add_library(imgprecs STATIC importED)set_target_properties(imgprecs PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_imgprecs.a)add_library(features2d STATIC importED)set_target_properties(features2d PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_features2d.a)add_library(ml STATIC importED)set_target_properties(ml PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_ml.a)add_library(photo STATIC importED)set_target_properties(photo PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_photo.a)add_library(shape STATIC importED)set_target_properties(shape PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_shape.a)add_library(objdetect STATIC importED)set_target_properties(objdetect PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_objdetect.a)add_library(stitching STATIC importED)set_target_properties(stitching PROPERTIES importED_LOCATION ${OPENCV_STATIC_LIB_DIR}/libopencv_stitching.a)include(AndroidNdkModules)android_ndk_import_module_cpufeatures()set(CMAKE_THREAD_PREFER_PTHREAD TRUE)set(THREADS_PREFER_PTHREAD_FLAG TRUE)find_package(Threads REQUIRED)add_library(tbb STATIC importED)set_target_properties(tbb PROPERTIES importED_LOCATION ${OPENCV_3RDPARTY_STATIC_LIB_DIR}/libtbb.a)add_library(tegra_hal STATIC importED)set_target_properties(tegra_hal PROPERTIES importED_LOCATION ${OPENCV_3RDPARTY_STATIC_LIB_DIR}/libtegra_hal.a)add_library(ittnotify STATIC importED)set_target_properties(ittnotify PROPERTIES importED_LOCATION ${OPENCV_3RDPARTY_STATIC_LIB_DIR}/libittnotify.a)add_library(native_with_opencv        # Sets the library as a shared library.        SHARED        # Provides a relative path to your source file(s).        ../ios/Classes/native_add.cpp        )target_link_libraries(native_with_opencv        ${log-lib}        core        # note: You can import whatever other modules you like (e.g. dnn)        tbb # note: need to be placed *after* "core"        cpufeatures        ittnotify        tegra_hal # NOTE if still have error, check abiFilters, since tegra does *not* exist in x86.        Threads::Threads        -lz        )

当然,

lib/native_with_opencv.dart
应该将
.so
文件名更改为
"libnative_with_opencv.so"

步骤1.2 :更改

android/build.gradle
以下内容:

android {    ...    defaultConfig {        ...        // [[[CHANGE 1: Make minSdkVersion bigger]]]        // see https://github.com/opencv/opencv/issues/14419        minSdkVersion 21        // [[[CHANGE 2: Add these flags and filters]]]        externalNativeBuild { cmake {     cppFlags "-frtti -fexceptions -std=c++11"     abiFilters 'armeabi-v7a', 'arm64-v8a' }        }        ...    }    ...}

当然,

minSdkVersion
实际项目(
native_with_opencv/example/android/app/build.gradle
)中的也应更改为21。

完成!编译并享受它(并转到iOS的下一部分)!如果看到

1 + 2 == 3
,则一切正常。

奖励:如果您在发布模式下构建并查看apk大小,您将看到我们的

.so
文件小于1MB。因此,静态链接和减小文件大小确实有效:)

的iOS

步骤0 :在中

ios/native_with_opencv.podspec
,添加:

  s.static_framework = true  s.dependency 'OpenCV', '~> 4.1'

步骤1 :编译并享受。 注意: 您可能需要先运行

podinstall
native_with_opencv/example/ios
让Cocoapod初始化。


(可选)Android配置如何工作的说明:(1)最初,我只是链接

core
,但是有数百个链接错误。然后,我搜索并修复每个组。例如,
error:undefined reference to'carotene_o4t::...'
意味着我需要与链接
libtegra_hal
,因此我添加了几行。(2)奇怪的是,
tbb
应该放在 之后
core
,否则它仍然不会链接。(3)
abiFilters
是必需的,因为
tegra_hal
不支持
x86
(因此不
.a
存在文件)。(4)
minSdkVersion
需要复活,否则
fegetenv
将找不到。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/387591.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号