1. 程式人生 > 其它 >android讀取本地yaml檔案_opencv從yaml檔案中讀取矩陣(c++)

android讀取本地yaml檔案_opencv從yaml檔案中讀取矩陣(c++)

技術標籤:android讀取本地yaml檔案

PS:由於我是新手,因此記錄的比較羅裡吧嗦,本文也屬於一個沒有任何技術的程式設計積累。

在SLAM系統中,經常需要從配置檔案中讀取引數檔案,讀取整型,浮點型都是比較常見的操作,在讀取矩陣卡了一下,記錄一下讀取的注意事項。

為此我寫了一個測試檔案,下面是各個檔案的內容。

1.CMakeLists.txt檔案

cmake_minimum_required(VERSION 2.8)
project(read_from_yaml)

set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )
############### OpenCV dependencies ######################
find_package( OpenCV 3 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

add_executable(read_yaml_mat read_yaml_mat_test.cpp)
target_link_libraries(read_yaml_mat ${OpenCV_LIBS})

2.c++主檔案(read_yaml_mat_test.cpp)

//
// Created by weihao on 2020/6/3.
//
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;

// Main function
int main(int argc, char** argv)
{
    if(argc != 2)
    {
        cerr << endl << "Usage: ./read_yaml_mat path_to_settings" << endl;
        return 1;
    }
    // read config file
    cv::FileStorage file_settings(argv[1], cv::FileStorage::READ);
    std::cout << "config file path: " << argv[1] << std::endl;

    // read camera instrinc
    int test_data = file_settings["test_data"];
    std::cout << "test data :" << test_data << std::endl;
    // read bool value
    bool test_bool;
    file_settings["test_bool"] >> test_bool;
    std::cout << "test_bool :" << test_bool << std::endl;
    // read OpenCV Mat
    cv::Mat cam_k;
    file_settings["cam_k"] >> cam_k;
    std::cout << "camera instrinc matrix :" << std::endl << cam_k << std::endl;
    return 0;
}

3. 引數檔案(read_mat.yaml)

%YAML:1.0
test_data: 10
test_bool: 0
cam_k: !!opencv-matrix
  rows: 3
  cols: 3
  dt:   u
  data: [6, 2, 2, 2, 6, 2, 2, 2, 6]

重點:

  1. 矩陣讀取時程式碼不能寫成如下形式(型別無法轉換,無法編譯)
 cv::Mat cam_k = file_settings["cam_k"]

2. 讀取bool變數時程式碼也不能寫成如下形式,同時要注意引數檔案中bool變數用0/1表示,不能用true/false(true/false都會返回1)

 bool data_bool = file_settings["test_bool"]

最後放一下執行結果:

33197ae351b4d2a968de665e0060089d.png