diff --git a/Cpp_example/C08_Apriltag/CMakeLists.txt b/Cpp_example/C08_Apriltag/CMakeLists.txt index bace036d46e80a61e62df7b123e1a10ae6c787d7..704f22cdf800f16e35bf6bd1a71c4131723a9300 100644 --- a/Cpp_example/C08_Apriltag/CMakeLists.txt +++ b/Cpp_example/C08_Apriltag/CMakeLists.txt @@ -37,6 +37,17 @@ include_directories( # 创建可执行文件 add_executable(Test_Apriltag Apriltag.cc) +# 告诉 Eigen 使用最大 8 字节对齐(armv7l 平台限制) +target_compile_definitions(Test_Apriltag PRIVATE EIGEN_MAX_ALIGN_BYTES=8) +add_definitions(-DEIGEN_MAX_ALIGN_BYTES=8) + +# 消除 Eigen 的 alignment 警告 +target_compile_definitions(Test_Apriltag PRIVATE EIGEN_MAX_ALIGN_BYTES=8) + +# 可选:关闭 attributes 警告 +target_compile_options(Test_Apriltag PRIVATE -Wno-attributes) + + # 链接库文件 target_link_libraries(Test_Apriltag diff --git a/Cpp_example/T01_jsoncpp/CMakeLists.txt b/Cpp_example/T01_jsoncpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..70c426e28c91a9121883ffd653dc44b7d33ebb5d --- /dev/null +++ b/Cpp_example/T01_jsoncpp/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.10) + +project(jsontest) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# 定义项目根目录路径 +set(PROJECT_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../..") +message("PROJECT_ROOT_PATH = " ${PROJECT_ROOT_PATH}) + +include("${PROJECT_ROOT_PATH}/toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake") + +# 定义 OpenCV SDK 路径 +set(OpenCV_ROOT_PATH "${PROJECT_ROOT_PATH}/third_party/opencv-mobile-4.10.0-lockzhiner-vision-module") +set(OpenCV_DIR "${OpenCV_ROOT_PATH}/lib/cmake/opencv4") +find_package(OpenCV REQUIRED) +set(OPENCV_LIBRARIES "${OpenCV_LIBS}") + +# 定义 LockzhinerVisionModule SDK 路径 +set(LockzhinerVisionModule_ROOT_PATH "${PROJECT_ROOT_PATH}/third_party/lockzhiner_vision_module_sdk") +set(LockzhinerVisionModule_DIR "${LockzhinerVisionModule_ROOT_PATH}/lib/cmake/lockzhiner_vision_module") +find_package(LockzhinerVisionModule REQUIRED) + + +# 定义 jsoncpp 路径 +set(JSONCPP_ROOT_PATH "${PROJECT_ROOT_PATH}/third_party/lockzhiner_vision_module_sdk/third_party/jsoncpp") +set(JSONCPP_INCLUDE_DIRS "${JSONCPP_ROOT_PATH}/include/") +set(JSONCPP_LIBRARIES "${JSONCPP_ROOT_PATH}/lib/libjsoncpp.a") + +message("JSONCPP_INCLUDE_DIRS = " ${JSONCPP_INCLUDE_DIRS}) + +add_executable(jsontest jsontest.cc) +target_include_directories(jsontest PRIVATE ${LOCKZHINER_VISION_MODULE_INCLUDE_DIRS} ${JSONCPP_INCLUDE_DIRS}) +target_link_libraries(jsontest PRIVATE ${OPENCV_LIBRARIES} ${LOCKZHINER_VISION_MODULE_LIBRARIES} ${JSONCPP_LIBRARIES}) + +install( + TARGETS jsontest + RUNTIME DESTINATION . +) \ No newline at end of file diff --git a/Cpp_example/T01_jsoncpp/README.md b/Cpp_example/T01_jsoncpp/README.md new file mode 100644 index 0000000000000000000000000000000000000000..85720038c427463dcae954cde1d2bf3dcdabe8dd --- /dev/null +++ b/Cpp_example/T01_jsoncpp/README.md @@ -0,0 +1,34 @@ +# jsoncpp 测试例程 +## 简介 + +JSON 是一种轻量级数据交换格式。它可以表示数据、字符串、有序的值序列以及名称/值对的集合。 + +jsoncpp 是一个 C++ 库,允许操作 JSON 值,包括字符串之间的序列化和反序列化。它还可以在反序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的方便格式。 + +JsonCpp 目前在 github 上托管。为方便使用将改项目继承到 SDk 中。 + +官方网址:https://github.com/open-source-parsers/jsoncpp + +## 编译项目 + +使用 Docker Destop 打开 LockzhinerVisionModule 容器并执行以下命令来编译项目 + +```bash +# 进入Demo所在目录 +cd /LockzhinerVisionModuleWorkSpace/LockzhinerVisionModule/Cpp_example/E01_find_number +# 创建编译目录 +rm -rf build && mkdir build && cd build +# 配置交叉编译工具链 +export TOOLCHAIN_ROOT_PATH="/LockzhinerVisionModuleWorkSpace/arm-rockchip830-linux-uclibcgnueabihf" +# 使用cmake配置项目 +cmake .. +# 执行编译项目 +make -j8 && make install +``` + +在执行完上述命令后,会在build目录下生成可执行文件。 +拷贝到视觉模块上运行: +```bash +chmod 777 ./jsontest +./jsontest + 具体的任务 +``` \ No newline at end of file diff --git a/Cpp_example/T01_jsoncpp/images/E02.png b/Cpp_example/T01_jsoncpp/images/E02.png new file mode 100644 index 0000000000000000000000000000000000000000..b71a6c4ffc10b2dfc86fc22ca76542967818bf78 Binary files /dev/null and b/Cpp_example/T01_jsoncpp/images/E02.png differ diff --git a/Cpp_example/T01_jsoncpp/jsontest.cc b/Cpp_example/T01_jsoncpp/jsontest.cc new file mode 100644 index 0000000000000000000000000000000000000000..31db4927ae56acf746ff9c82b32b7f8c5c15c939 --- /dev/null +++ b/Cpp_example/T01_jsoncpp/jsontest.cc @@ -0,0 +1,154 @@ +#include "json/json.h" +#include +#include +#include +#include + +// 打印帮助信息 +void printUsage(const std::string& progName) { + std::cout << "Usage: " << progName << " [option]\n"; + std::cout << "Options:\n"; + std::cout << " write - Write sample JSON to stdout\n"; + std::cout << " writestr - Write JSON to string\n"; + std::cout << " readstr - Read JSON from string\n"; + std::cout << " writefile - Write JSON to file (example.json)\n"; + std::cout << " readfile - Read JSON from file (example.json)\n"; +} + +// 将 Json::Value 转换为字符串输出 +std::string writeToJsonString(const Json::Value& root) { + Json::StreamWriterBuilder builder; + std::ostringstream oss; + std::unique_ptr writer(builder.newStreamWriter()); + writer->write(root, &oss); + return oss.str(); +} + +// 构建一个测试用的 JSON 对象 +Json::Value createSampleJson() { + Json::Value root; + root["Name"] = "robin"; + root["Age"] = 20; + + Json::Value hobbies(Json::arrayValue); + hobbies.append("reading"); + hobbies.append("coding"); + hobbies.append("hiking"); + + root["Hobbies"] = hobbies; + + Json::Value address; + address["City"] = "Beijing"; + address["ZipCode"] = "100000"; + root["Address"] = address; + + return root; +} + +// 从字符串解析 JSON +bool parseJsonFromString(const std::string& jsonStr, Json::Value& root) { + Json::CharReaderBuilder builder; + std::string errs; + std::istringstream jsonStream(jsonStr); + bool ok = Json::parseFromStream(builder, jsonStream, &root, nullptr); + if (!ok) { + std::cerr << "Failed to parse JSON string." << std::endl; + return false; + } + return true; +} + +// 写入 JSON 到文件 +bool writeJsonToFile(const std::string& filename, const Json::Value& root) { + std::ofstream ofs(filename); + if (!ofs.is_open()) { + std::cerr << "Failed to open file for writing: " << filename << std::endl; + return false; + } + + Json::StreamWriterBuilder builder; + std::unique_ptr writer(builder.newStreamWriter()); + writer->write(root, &ofs); + ofs.close(); + return true; +} + +// 从文件读取 JSON +bool readJsonFromFile(const std::string& filename, Json::Value& root) { + std::ifstream ifs(filename); + if (!ifs.is_open()) { + std::cerr << "Failed to open file for reading: " << filename << std::endl; + return false; + } + + // 使用 JsonCpp 提供的 parseFromStream 方法更简洁 + Json::CharReaderBuilder builder; + std::string errs; + bool ok = Json::parseFromStream(builder, ifs, &root, nullptr); + ifs.close(); + + if (!ok) { + std::cerr << "Failed to parse JSON from file." << std::endl; + return false; + } + + return true; +} + +int main(int argc, char* argv[]) { + std::string operation = "write"; // 默认操作 + if (argc > 1) { + operation = argv[1]; + } else { + printUsage(argv[0]); + return EXIT_FAILURE; + } + + if (operation == "write") { + // 直接写入到 stdout + Json::Value root = createSampleJson(); + std::cout << "=== Writing JSON to stdout ===\n"; + std::cout << writeToJsonString(root) << std::endl; + + } else if (operation == "writestr") { + // 写入 JSON 到字符串 + Json::Value root = createSampleJson(); + std::string jsonStr = writeToJsonString(root); + std::cout << "=== JSON as string ===\n" << jsonStr << std::endl; + + } else if (operation == "readstr") { + // 测试从字符串解析 JSON + std::string jsonStr = R"({"Name":"jack","Age":30,"Hobbies":["music","travel"],"Address":{"City":"Shanghai"}})"; + Json::Value root; + if (parseJsonFromString(jsonStr, root)) { + std::cout << "=== Parsed JSON from string ===\n"; + std::cout << "Name: " << root["Name"].asString() << "\n"; + std::cout << "Age: " << root["Age"].asInt() << "\n"; + std::cout << "First Hobby: " << root["Hobbies"][0].asString() << "\n"; + std::cout << "City: " << root["Address"]["City"].asString() << "\n"; + } + + } else if (operation == "writefile") { + // 写入 JSON 到文件 + Json::Value root = createSampleJson(); + if (writeJsonToFile("example.json", root)) { + std::cout << "JSON written to example.json\n"; + } + + } else if (operation == "readfile") { + // 从文件中读取并解析 JSON + Json::Value root; + if (readJsonFromFile("example.json", root)) { + std::cout << "=== Read JSON from file ===\n"; + std::cout << "Name: " << root["Name"].asString() << "\n"; + std::cout << "Age: " << root["Age"].asInt() << "\n"; + std::cout << "City: " << root["Address"]["City"].asString() << "\n"; + } + + } else { + printUsage(argv[0]); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake b/toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake index 4442bf2181af6784b93cbe9bcf14756f0245d608..ab1ecd61e240522a74645e4df02da08ab75d5b46 100644 --- a/toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake +++ b/toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake @@ -22,3 +22,4 @@ set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon") # cache flags set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi") \ No newline at end of file