Skip to content

立即开发

taotianran edited this page Dec 5, 2022 · 6 revisions
English | 简体中文

在开始贡献代码之前


现在让我们来看看如何开发一个模块:

源码目录结构

首先,我们需要理解FlyCV的代码组织方式。

benchmark                        // 性能测试
cmake                            // cmake配置文件夹
  ├── external                   // 依赖库cmake配置文件夹
  ├── platform                   // 平台相关cmake配置文件夹
  └── ......
docs
  └── assets                     // 资源文件夹
include
  ├── flycv.h.in                 // 面向用户的接口头文件
  ├── flycv_namespace.h.in       // 命名空间记录头文件
  └── version.h.in               // 版本记录头文件
modules                          // 功能模块文件夹          
  ├── img_transform              // 一级模块A文件夹
  │      ├── color_convert       // 功能 ①
  │      ├── resize              // 功能 ②
  │      ├── warp_affine         // 功能 ③
  │      └── ......              // 其他功能
  ├── fusion_api                 // 一级模块B文件夹
  ├── img_calculation            // 一级模块C文件夹
  └── ......                     // 其他一级模块
scripts                          // 不同平台编译脚本
samples                          // 不同平台demo
tests                            // 单测文件夹
third_party                      // 依赖库文件夹
tools                            // 辅助开发工具文件夹
  └── add_module                 // 快速模块模板生成工具


如何添加一个新功能

为了方便每一个人开发,我们提供了一个快速模块生成工具可以生成模块模板,你可以使用它去快速新增一个功能模块。

脚本位置 tools/add_module/add_module.py

按照下面步骤调用该脚本:

1. 安装python依赖

sudo pip3 install Jinja2

2. 添加新功能

python3 tools/add_module.py modules/<parent_module>/<child_module> <ON|OFF>

parent_module: 对应一级模块文件夹名称。

child_module: 对应具体功能文件夹名称。

ON|OFF: 指定新增模块默认是开启还是关闭。

举例:

python3 tools/add_module/add_module.py modules/img_transform/blur OFF

执行完上述命令之后,可以通过 git status 查看文件变化。

On branch my-work
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   cmake/FCVBuildList.cmake
	modified:   include/flycv.h.in

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	benchmark/modules/img_transform/blur_bench.cpp
	modules/img_transform/blur/
	tests/modules/img_transform/blur_test.cpp

下面简单介绍一下上述文件:

  1. cmake/FalconCVBuildList.cmake : 自动将新增模块添加到cmake配置中。
option(WITH_FCV_BLUR "Build module blur" OFF)
  1. include/falconcv.h.in : 对外头文件自动添加引用。
#cmakedefine WITH_FCV_BLUR

#ifdef WITH_FCV_BLUR
#include "modules/img_transform/blur/interface/blur.h"
#endif
  1. 查看生成的功能目录结构。
modules/img_transform/blur
    ├── include
    │   └── blur_common.h
    ├── interface
    │   └── blur.h
    └── src
        ├── blur.cpp
        └── blur_common.cpp

interface: 面向用户的接口文件
include:   内部的接口文件
src:       接口定义文件
  1. tests/modules/img_transform/blur_test.cpp : 单测文件。

  2. benchmark/modules/img_transform/blur_bench.cpp : 性能测试文件。


接下来你就可以专注于具体功能开发,不需要修改任何cmake配置


编译

请参考 编译手册,我们提供了不同平台的编译方式。


单测

和很多其他开源项目一样,我们使用 GoogleTest 作为单测框架, 聊几句 GoogleTest

模块新增工具生成了一个简单的单测,下面是一个例子:

class BlurTest : public ::testing::Test {
    void SetUp() override {
        // (optional) prepare test data for every case
    }
};

TEST_F(BlurTest, PositiveInput) {
    // add your test code here
}

只需要添加一下调用代码就可以跑通一个单测了。


性能测试

我们使用 googlebenchmakr作为性能测试框架,了解 benchmark

模块新增工具生成了一个简单的benchmark case,下面是一个例子:

class BlurBench : public benchmark::Fixture {
public:
    void SetUp(const ::benchmark::State& state) {
        set_thread_num(G_THREAD_NUM);

        // (optional) prepare test data for every case
    }
};

BENCHMARK_DEFINE_F(BlurBench, PlaceHolder)
        (benchmark::State& state) {
    // add your code here
    // don't forget to replace the PlaceHolder with a meaningful one
};

// don't forget to replace the PlaceHolder with a meaningful one
BENCHMARK_REGISTER_F(BlurBench, PlaceHolder)
        ->Unit(benchmark::kMicrosecond)
        ->Iterations(100)
        ->DenseRange(55, 255, 200);

只需要添加一下调用代码就可以跑通性能单测。