-
Notifications
You must be signed in to change notification settings - Fork 63
快速开始
我们支持大多数主流的操作系统,这里以android和armlinux为例,从一个简单的demo开始。
步骤 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流程就走通了。
步骤 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流程就跑通了。
步骤 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.jpg
和flycv.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,为了方便大家快速迁移,下面用简单的例子介绍一下两种迁移场景的迁移方法。
如果您期望不仅提升性能,也要缩小体积,那么完全替换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 |
如果您遇到以下两种情况,可以选择进行部分迁移:
① 重度依赖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 进行反馈,感谢您的支持。