前言
標注數據導出文件是json格式的,也就是python的dict格式,需要讀取標注結果,可以使用c++或者python,本文使用c++實現的。
JsonCpp簡介
JsonCpp是一種輕量級的數據交換格式,是個跨平台的開源庫,可以從github和sourceforge上下載源碼。查找資料的過程中發現另一個開源庫RapidJson,有時間可以了解一下。
JsonCpp使用
1.安裝JsonCpp開源庫;
$ sudo apt-get install libjsoncpp-dev
2.根據json文件編輯測試程序讀取json數據;
/read_json$ ls eye_state_20181102_20181106_095415.json read_json.cpp
3.編譯調試測試程序;
/read_json$ g++ -o read_json read_json.cpp -ljsoncpp /read_json$ ./read_json
測試程序

/* * AMY * read_json.cpp * Date: 20181106 */ #include <iostream> #include <fstream> #include <jsoncpp/json/json.h> int main() { Json::Reader reader; Json::Value root; std::ifstream ifs; ifs.open("eye_state_20181102_20181106_095415.json", std::ios::binary); std::string line; while(std::getline(ifs, line)) { if(!reader.parse(line, root)) return -1; std::string url_image = root["url_image"].asString(); std::cout << "root.size(): " << root.size() << std::endl; std::size_t pos = url_image.find("/zrj_close"); std::string image_name = url_image.substr(pos); std::cout << "image_name: " << image_name << std::endl; std::cout << "data: " << std::endl; for(int i=0; i<root["result"].size(); i++) { Json::Value data = root["result"][i]["data"]; std::cout << "val: " << std::endl; for(int j=0; j<data.size(); j++) { int val = data[j].asInt(); std::cout << val << "---" ; } std::cout << "\n"; } line.clear(); } ifs.close(); return 0; }
問題
1.
fatal error: json/json.h: No such file or directory compilation terminated.
原因:沒有正確安裝JsonCpp開源庫,或者頭文件的路徑不匹配。
2.
[100%] Linking CXX executable read_json CMakeFiles/read_json.dir/read_json.cpp.o: In function `main': read_json.cpp:(.text.startup+0x2a): undefined reference to `Json::Reader::Reader()' read_json.cpp:(.text.startup+0x34): undefined reference to `Json::Value::Value(Json::ValueType)'
參照here的方法實現的,將源碼中的json和lib_json文件夾置於同一目錄,使用Cmake編譯過程中出現錯誤,即使添加了JsonCpp的include路徑和‘-ljsoncpp’,這個問題暫時還沒有解決,改用其他方法(g++直接編譯)完成。
CMakeLists.txt

#1.cmake verson,指定cmake版本 cmake_minimum_required(VERSION 2.8) set(CMAKE_CXX_COMPILER "g++") list(APPEND CMAKE_CXX_FLAGS "-O3 -DNDEBUG -ffast-math -Wall -pthread -fopenmp -std=c++11 -ljsoncpp") #2.project name,指定項目的名稱,一般和項目的文件夾名稱對應 project(read_json) SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) #3.head file path,頭文件目錄 INCLUDE_DIRECTORIES(include; /lib/opencv2413/opencv-2.4.13.4/build/include; /usr/include) #aux_source_directory("src/include" SOURCES_FILE) #4.source directory,源文件目錄 AUX_SOURCE_DIRECTORY(src DIR_SRCS) #5.set environment variable,設置環境變量,編譯用到的源文件全部都要放到這里,否則編譯能夠通過,但是執行的時候會出現各種問題,比如"symbol lookup error xxxxx , undefined symbol" #SET(TEST_MATH${DIR_SRCS}) SET(OpenCV_DIR /lib/opencv2413/opencv-2.4.13.4/build) FIND_PACKAGE(OpenCV REQUIRED) #6.add executable file,添加要編譯的可執行文件 #ADD_EXECUTABLE(${PROJECT_NAME} ${DIR_SRCS}) #7.add link library,添加可執行文件所需要的庫,比如我們用到了libm.so(命名規則:lib+name+.so),就添加該庫的名稱 ADD_EXECUTABLE(read_json read_json.cpp) TARGET_LINK_LIBRARIES(read_json ${OpenCV_LIBS})
使用Cmake的方法編譯調試有問題,以后有時間遇到再解決。
3.注意json文件每條數據的層級關系,以及如何層層獲取數據信息。
4.如果對JsonCpp庫的某個函數調用有疑問可以查看源碼學習。
參考
1.從文件提取json數據;
2.How to install and use Jsoncpp library on Ubuntu;
3.Jsoncpp詳解;
5.JSON文件的讀取和生成;
6.open-source-parsers-jsoncpp-github;
完