编译
环境:Ubuntu20.04
-
如果系统中预先有一些旧依赖。首先会碰到 cmake 的 include 目录正确,但是 lib 寻找目录错误的问题。详见这个 issue。根据这篇文章,通过设置 CMake 搜索的优先级,可以解决路径查询问题。解决方案。
-
编译 aliceVision,为了省时,可以将项目分为两部分编译。
-
使用 CMakeLists 里面的内置方法对依赖进行编译。
-
在 CMakeLists 中关闭依赖编译后,再对项目进行单独编译。
-
-
Ubuntu20.04 默认版本为 3.16 尝试使用代理失败。但是换成官网源码编译的 3.22 后代理能正常工作了。
-
不确定问题:将
CMAKE_PREFIX_PATH
设置成依赖安装目录后,CMake 会出现以下warning
:CMake Warning (dev) in src/CMakeLists.txt: Policy CMP0111 is not set: An imported target missing its location property fails during generation. Run "cmake --help-policy CMP0111" for policy details. Use the cmake_policy command to set the policy and suppress this warning. IMPORTED_LOCATION not set for imported target "assimp::assimp" configuration "Debug".
进而导致 make 的规则中找不到
assimp
的依赖。Linux-x86_64/libaliceVision_mesh.so.2.4: assimp::assimp-NOTFOUND
解决办法:按照
warning
提示添加IMPORTED_LOCATION
# /home/chunibyo/workspace/AliceVision/src/aliceVision/mesh/CMakeLists.txt set_target_properties(assimp::assimp PROPERTIES IMPORTED_LOCATION "${ASSIMP_LIBRARY_DIRS}/${ASSIMP_LIBRARIES}")
调试
后端编译得到一系列可执行二进制文件,可以通过命令行调用,默认生成在 /home/chunibyo/workspace/AliceVision/build/Linux-x86_64
路径下。
前端通过 subprocess.Popen
对后端的二进制文件进行调用。
因为对 c++ 的调用方式子进程,所以很难直接 gdb 进 python 进程后对 c++ 进行 debug。解决办法是设法使后端的进程停住,然后在 CLion 中直接 attach 进去。
aliceVision_cameraInit
处理照片的元信息。
命令:
aliceVision_cameraInit --sensorDatabase "/home/chunibyo/workspace/AliceVision/src/aliceVision/sensorDB/cameraSensors.db" --defaultFieldOfView 45.0 --groupCameraFallback folder --allowedCameraModels pinhole,radial1,radial3,brown,fisheye4,fisheye1,3deanamorphic4,3deradial4,3declassicld --useInternalWhiteBalance True --viewIdMethod metadata --verboseLevel info --output "/home/chunibyo/workspace/meshroom_cache/tmp/MeshroomCache/CameraInit/db58d443c068acdfe5245d3670f4ba016ff52160/cameraInit.sfm" --allowSingleView 1 --input "/home/chunibyo/workspace/meshroom_cache/tmp/MeshroomCache/CameraInit/db58d443c068acdfe5245d3670f4ba016ff52160/viewpoints.sfm"
参数:
-
sensorDatabase:拍摄设备的先验硬件信息 txt 数据库。
-
groupCameraFallback:
-
global
-
folder
-
image
-
rig:https://github.com/alicevision/meshroom/wiki/Multi-Camera-Rig
同时支持输入初始位姿。
aliceVision_featureExtraction
主要计算代码
The SIFT detector is controlled mainly by two parameters: the peak threshold and the (non) edge threshold.
The peak threshold filters peaks of the DoG scale space that are too small (in absolute value). Peak_thresh 越大,特征点越少。
The edge threshold eliminates peaks of the DoG scale space whose curvature is too small (such peaks yield badly localized frames). edge_thresh 越大,特征越多。
- 可选特征点
std::string EImageDescriberType_informations()
{
return "Describer types used to describe an image:\n"
"* sift: Scale-invariant feature transform.\n"
"* sift_float: SIFT stored as float.\n"
"* sift_upright: SIFT with upright feature.\n"
"* akaze: A-KAZE with floating point descriptors.\n"
"* akaze_liop: A-KAZE with Local Intensity Order Pattern descriptors.\n"
"* akaze_mldb: A-KAZE with Modified-Local Difference Binary descriptors.\n"
#if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_CCTAG)
"* cctag3: Concentric circles markers with 3 crowns.\n"
"* cctag4: Concentric circles markers with 4 crowns.\n"
#endif
#if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_APRILTAG)
"* tag16h5: AprilTag family tag16h5.\n"
#endif
#if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_OPENCV)
#if ALICEVISION_IS_DEFINED(ALICEVISION_HAVE_OCVSIFT)
"* sift_ocv: OpenCV implementation of SIFT describer.\n"
#endif
"* akaze_ocv: OpenCV implementation of A-KAZE describer.\n"
#endif
"";
}
- ConfigurationPreset: 特征点预设,默认 NORMAL
/**
* @brief The preset to control the number of detected regions
*/
enum class EImageDescriberPreset
{
LOW = 0
, MEDIUM
, NORMAL
, HIGH
, ULTRA
};
-
maxNbFeatures:手动设置特征点数目的方法
-
describerQuality: 手动设置特征点的质量。提高质量后会增加scale层数。It’s a trade-off between performance and precision.
-
contrastFiltering: 默认是 static,根据某种标准对关键点进行权重排序
/**
* @brief The method used to filter out features with too low constrast (that can be considered as noise).
*/
enum class EFeatureConstrastFiltering
{
/// Use a fixed threshold for all the pixels
Static = 0,
/// Use a threshold for each image based on image statistics
AdaptiveToMedianVariance,
/// Disable contrast filtering
NoFiltering,
/// Grid sort by peak value per octave and by scale at the end
GridSortOctaves,
/// Grid sort by scale*peakValue per octave and at the end
GridSort,
/// Grid sort per scale steps and at the end (scale and then peak value)
GridSortScaleSteps,
/// Grid sort per octaves and at the end (scale and then peak value)
GridSortOctaveSteps,
/// Filter non-extrema peak values
NonExtremaFiltering
};
-
relativePeakThreshold:
dynPeakTreshold = relativePeakThreshold * medianOfGradiants
-
gridFiltering: 指的是尽量不使得某个格子内的特征点过于密集。首先会根据 scale 或者 peak 等进行排序。分为留下的和舍弃两部分特征点。