Skip to content

快速开始

taotianran edited this page Mar 21, 2023 · 32 revisions
English | 简体中文

目录


我们支持大多数主流的操作系统,这里以android和armlinux为例,从一个简单的demo开始。

5分钟快速运行(armlinux)

步骤 1: 下载预编译完成的armlinux库,下载地址:Released packages

步骤 2: 添加demo代码。

创建一个 main.cpp 文件,将下面代码拷入:

#include "flycv.h"

int main(int argc, char** argv) {
    fcv::Mat dst;
    fcv::Mat src = fcv::imread("user.jpg");
    fcv::resize(src, dst, fcv::Size(src.width() / 2, src.height() / 2));
    fcv::imwrite("resize.jpg", dst);

    return 0;
}

在同级目录创建一个 CMakeLists.txt 文件,拷贝下面代码:

cmake_minimum_required(VERSION 3.10)
project(flycv_test)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/flycv/include)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/flycv/${ARCH})

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
    libflycv_static.a
    libpng16.a
    libturbojpeg.a
    libz.a)

步骤 3: armlinux机器上编译

将下载好的预编译库flycv移到同级目录下,命令行执行下面命令进行编译:

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
        -DARCH=aarch64 \
        ..
make

注: 如果使用交叉编译环境则需要设置CMAKE_TOOLCHAIN_FILE路径。

步骤 4: 运行

执行下面命令运行,会在同级目录生成 resize.jpg,可查看结果。

./flycv_test

至此,armlinux端一个简单的demo流程就走通了。


5分钟快速运行(Android)

步骤 1: 下载预编译完成的android库,下载地址:Released packages

步骤 2: 添加demo代码。

创建一个 main.cpp 文件,将下面代码拷入:

#include "flycv.h"

int main(int argc, char** argv) {
    fcv::Mat dst;
    fcv::Mat src = fcv::imread("user.jpg");
    fcv::resize(src, dst, fcv::Size(src.width() / 2, src.height() / 2));
    fcv::imwrite("resize.jpg", dst);

    return 0;
}

在同级目录创建一个 CMakeLists.txt 文件,拷贝下面代码:

cmake_minimum_required(VERSION 3.10)
project(flycv_test)
add_compile_options(-std=c++11)
find_library(
    log-lib
    log)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/flycv/include)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/flycv/${ANDROID_ABI})

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
    ${log-lib}
    libflycv_static.a
    libpng16.a
    libturbojpeg.a
    libz.a)

步骤 3: 编译

我们使用android ndk进行交叉编译。如果本地没有安装可以去官网下载:NDK下载

export ANDROID_NDK={Your ndk path}
// such as: export ANDROID_NDK=/home/flycv/android-ndk-r16b

mkdir build
cd build
cmake -DANDROID_NDK=${ANDROID_NDK} \
        -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}"/build/cmake/android.toolchain.cmake \
        -DANDROID_ABI=arm64-v8a \
        -DANDROID_PLATFORM=android-21 \
        -DCMAKE_BUILD_TYPE=Release \
        ..

make -j4

步骤 4: android命令行下运行

手机开启调试模式,连接PC,执行以下命令,可以在android shell环境直接运行:

adb push build/flycv_test /data/local/tmp/
adb push user.jpg /data/local/tmp/
adb shell
cd /data/local/tmp/
./flycv_test

user.jpg 可以用户任意选择一张照片即可。通过以下命令下载处理后的结果图片到本地查看:

adb pull /data/local/tmp/resize.jpg

至此,android端一个简单的demo流程就跑通了。


5分钟快速运行(js)

步骤 1: 下载预编译完成的js库,下载地址:Released packages

步骤 2: 新建一个test.html文档,添加demo源码。

<!doctype html>
<html>
<style>
    img { width: 300px; }
</style>
<body>
    <img src="test.jpg" id="source_img">
    <canvas id="target_img"></canvas>
    <script src="flycv.js" type="text/javascript"></script>
    <script type="text/javascript">
        fcv.then((fcv) => {
            let src = fcv.imread("source_img");
            let dst = new fcv.Mat();
            let size = new fcv.Size(180, 320);

            fcv.resize(src, dst, size, 0, 0, fcv.InterpolationType.INTER_LINEAR);
            fcv.imshow("target_img", dst);

            size.delete();
            src.delete();
            dst.delete();
        });
    </script>
</body>
</html>

test.jpgflycv.js放到html同级目录,因为涉及到跨域问题,所以需要在当前目录建立一个简单http服务器。

python3 -m http.server --bind 127.0.0.1

这样,通过在浏览器中输入网址:http://127.0.0.1:8000/test.html,就可以浏览效果了。

同时在samples目录下,我们提供了个每个算子的使用demo,可以参照使用。

demo使用方法:编译完成之后进入build/output/flycv/文件夹下,执行下面命令创建http服务器:

python3 -m http.server --bind 127.0.0.1

在浏览器中输入网址:http://127.0.0.1:8000/,选择对应的html文件打开即可。


从OpenCV快速迁移至FlyCV(C++)

考虑到很多历史项目使用的是OpenCV,为了方便大家快速迁移,下面用简单的例子介绍一下两种迁移场景的迁移方法。

迁移场景1:完全迁移至FlyCV(彻底替换OpenCV)→ 提升性能,缩小体积

如果您期望不仅提升性能,也要缩小体积,那么完全替换OpenCV将是不错的选择。

选择完全替换之前一定要检查当前项目使用的OpenCV方法是否已被FlyCV完全支持,避免造成时间浪费。

下面以一个resize方法调用为例进行介绍。

// OpenCV 调用方式
cv::Mat src(320, 640, CV_8UC1);
cv::Mat dst;
cv::resize(src, dst, cv::Size(320, 160));

// 等价的FlyCV 调用方式
fcv::Mat src(640, 320, FCVImageType::GRAY_U8);
fcv::Mat dst;
fcv::resize(src, dst, fcv::Size(320, 160));

可以看到函数调用方式基本一致,主要的差别存在于两点:

① Mat构造函数的输入宽高顺序不一致,OpenCV是按照rows、cols的顺序,FlyCV是按照width、height的顺序。

② Mat的type不一致。

掌握了这两点区别,迁移起来就比较简单了。

下表是OpenCV type和FlyCV type的对应关系提供查询。

OpenCV type FlyCV type
CV_8UC1 FCVImageType::GRAY_U8
CV_16UC1 FCVImageType::GRAY_U16
CV_16SC1 FCVImageType::GRAY_S16
CV_32SC1 FCVImageType::GRAY_S32
CV_32FC1 FCVImageType::GRAY_F32
CV_64FC1 FCVImageType::GRAY_F64
CV_8UC3 FCVImageType::PKG_BGR_U8
FCVImageType::PKG_RGB_U8
CV_8UC4 FCVImageType::PKG_BGRA_U8
FCVImageType::PKG_RGBA_U8
CV_32FC3 FCVImageType::PKG_BGR_F32
FCVImageType::PKG_RGB_F32
CV_32FC4 FCVImageType::PKG_BGRA_F32
FCVImageType::PKG_RGBA_F32
CV_64FC3 FCVImageType::PKG_BGR_F64
FCVImageType::PKG_RGB_F64
CV_64FC4 FCVImageType::PKG_BGRA_F64
FCVImageType::PKG_RGBA_F64

迁移场景2:部分迁移至FlyCV(替换部分OpenCV方法)→ 提升性能

如果您遇到以下两种情况,可以选择进行部分迁移:

① 重度依赖OpenCV,迁移成本过高,但关键函数又急需性能优化。

② 部分依赖函数FlyCV尚未支持,但部分已支持,可以优化已支持函数的性能。

部分迁移是指用FlyCV的部分方法替换OpenCV的方法,这时不可避免的需要进行OpenCV数据和FlyCV数据的相互转换。

下面同样以resize为例进行介绍。

// OpenCV的mat数据
cv::Mat src(320, 640, CV_8UC1);
cv::Mat dst(160, 320, CV_8UC1);

// 转为FlyCV的mat数据
fcv::Mat fcv_src(640, 320, FCVImageType::GRAY_U8, src.data);
fcv::fcv_dst(320, 160, FCVImageType::GRAY_U8, dst.data);;

// 调用FlyCV的resize方法
fcv::resize(fcv_src, fcv_dst, fcv::Size(320, 160));

OpenCV的数据指针和FlyCV的数据指针可以复用,这样没有内存拷贝的开销,使用FlyCV的处理性能收益依然会很明显。

以上就是从OpenCV迁移至FlyCV的方法介绍,如遇问题可以提交 issue 进行反馈,感谢您的支持。