ISP 【一】————boost标准库使用——批量读取保存文件 /boost第三方库的使用及其cmake添加,图像gramma
CMakeLists.txt文件中需要添加第三方庫,并企鵝在CMakeLists.txt中添加
include_directories(${PROJECT_SOURCE_DIR}/../3party/gflags-2.2.2/include)
link_directories(${PROJECT_SOURCE_DIR}/../3party/boost-1.73.0/lib-import)
target_link_libraries(
?? ?gramma_ir
?? ?opencv_world343?? ?
?? ?gflags_static(看情況添加,具體指向靜態庫,或者動態庫)
)
對應的cmake?
cmake_minimum_required(VERSION 3.1)project(gramma_ir)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})include_directories(${PROJECT_SOURCE_DIR}/../3party/boost-1.73.0/include)include_directories(${PROJECT_SOURCE_DIR}/../3party/gflags-2.2.2/include)include_directories(${PROJECT_SOURCE_DIR}/../include)
include_directories(${PROJECT_SOURCE_DIR}/../include/opencv)
include_directories(${PROJECT_SOURCE_DIR}/../include/opencv2)link_directories(${PROJECT_SOURCE_DIR}/../lib)
link_directories(${PROJECT_SOURCE_DIR}/../3party/boost-1.73.0/lib-import)
link_directories(${PROJECT_SOURCE_DIR}/../3party/gflags-2.2.2/lib-static)add_executable(gramma_ir gramma_ir.cc)
target_link_libraries(gramma_iropencv_world343 gflags_staticgflags_nothreads_staticgflags_nothreads_static_debuggflags_static_debug#boost_filesystem-vc140-mt-x64-1_73#libboost_regex-vc140-mt-s-x64-1_73
)
調用boost庫,批量處理圖片或者單張圖片處理?
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
#include <cxcore.h>
#include <cvaux.h>
#include <stdlib.h>
#include <imgproc.hpp>
#include <opencv2/imgproc/imgproc.hpp> ? ?
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui_c.h>#include <boost/filesystem.hpp>
#include <boost/regex.hpp>
#include <gflags/gflags.h>using namespace std;
using namespace cv;void GetGammaCorrection(Mat& src, Mat& dst, const float fGamma)
{unsigned char bin[256];for (int i = 0; i < 256; ++i){bin[i] = saturate_cast<uchar>(pow((float)(i / 255.0), fGamma) * 255.0f);}dst = src.clone();uchar* ptr = dst.ptr<uchar>(0);for (int i = 0; i < 400 * 640; ++i){ptr[i] = bin[ptr[i]];}
}void ProcessImage(const std::string& path, float Gamma, cv::Mat& output) {//const std::string path_ir = path;cv::Mat src = cv::imread(path, IMREAD_UNCHANGED);std::cout << src.channels() << std::endl;if (src.empty()){cout << "Error: Could not load image" << endl;}int fGamma = Gamma;cv::Mat gamma_dst;GetGammaCorrection(src, gamma_dst, fGamma);output = gamma_dst;
}int main(int argc, char** argv)
{ boost::filesystem::path input_path(argv[1]);cv::Mat dst;float fGamma = 1 / 1.8;int count = 0;if (boost::filesystem::is_regular_file(input_path)) {cv::Mat src = cv::imread(input_path.string(), IMREAD_UNCHANGED);GetGammaCorrection(src, dst, fGamma);imshow("dst", dst);cv::imwrite("../result/ir.png", dst);}else{boost::filesystem::path dir_path = input_path.parent_path();boost::regex filter(input_path.filename().string());boost::filesystem::directory_iterator end_itr; for (boost::filesystem::directory_iterator itr(dir_path); itr != end_itr; itr++) {//directory_iterator(p)就是迭代器的起點,無參數的directory_iterator()就是迭代器的終點。if (!boost::filesystem::is_regular_file(itr->status()))// is_regular_file 判斷是否是普通文件continue;boost::smatch what;if (!boost::regex_match(itr->path().filename().string(), what, filter))continue;cv::Mat src = cv::imread(itr->path().string(), IMREAD_UNCHANGED);GetGammaCorrection(src, dst, fGamma);imshow("dst", dst); count++;string dstPath;dstPath = "../result/"+ std::to_string(count) + ".png";cv::imwrite(dstPath.c_str(),dst);std::cout << count << std::endl;} } //cv::waitKey(0);return 0;
}
如果在編譯的過程中出現如下問題,那么可能出現的問題以及對應的解決情況如下所示:
?
Opencv生成exe可執行文件于opencv_world343.dll文件在同一個目錄下面。或者cmakelists添加尋找opencv_world343.dll的絕對路徑。否則則是報錯如下。
?
Cmakelists具體內容如下:
cmake_minimum_required(VERSION 3.1)project(fill_test)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})include_directories(${PROJECT_SOURCE_DIR}/../include)include_directories(${PROJECT_SOURCE_DIR}/../include/opencv)include_directories(${PROJECT_SOURCE_DIR}/../include/opencv2)link_directories(${PROJECT_SOURCE_DIR}/../lib)add_executable(fill_test complete_test.cc) //待測試主程序target_link_libraries(fill_test //鏈接庫,主程序opencv_world343 fill_test需要鏈接的第三方庫)
文件目錄如下:
總文件:
Build
Example:
CMakeLists.txtcomplete_test.cc
2.bmp()
注:RelWithDebInfo生成文件將opencv_world343.dll放到生成的.exe同級目錄下
Include:
Opencv(原生,可復用)
Opencv2(原生,可復用)
Lib:
Opencv_world343.lib(可復用)
Opencv_world343d.lib(可復用)
其他lib
比如:deptrum_depth.lib內含接口文件
補充:
今日增加AE封裝接口?,通過cnake調用,對該工程有進一步認識。
總體的調用架構如下:
cmakelists調用,3rdparty種Dependencies.cmake,然后Dependencies.cmake部分調用各個調用庫對應的FindBoost.cmake,FindEigen3.cmake,FindOpenCV.cmake。這樣整個架構就很顯然類似與一個三級目錄cmakelist——》Dependencies.cmake——》FindOpenCV.cmake(一類)。
其次,類的調用可以像下面這樣寫:
add_library(AE STATIC ? ? ? ?//名稱 ? 生成庫類型
? automatic_exposure.h
?automatic_exposure.cc
)
將接口編譯成靜態庫AE,然后將生成的靜態庫AE鏈接到對應的需要的主函數deptrum_camera中,
#link_libraries(deptrum_camera_static)
? if (MSVC)
? ? target_link_libraries(${targetname}
? ? ? deptrum_camera
?? ? ?AE ? ? ? ? ? ? ? ? ? ?
? ? ? ${OpenCV_LIBS}
? ? ? ${Zlib_LIBS}
? ? ? loguru
? ? ? visualizer?? ? ?
? ? )
全部camkelists如下:
cmake_minimum_required(VERSION 3.10)
# deptrum_camera_test
include_directories(..)
include_directories(include)
include_directories(${Deptrum_SOURCE_DIR}/base)
add_library(AE STATIC
? automatic_exposure.h
?automatic_exposure.cc
)
#add_library(AE STATIC
#AutomaticExposure.h
#AutomaticExposure.cpp
#)
function(add_test_case ? ? ? targetname ? ?srcs) ? ? //function函數(名稱 ? 形參 ?)
? add_executable(${targetname} ${srcs})
? link_directories(${targetname} BEFORE
? ? PRIVATE ${OpenCV_SHARED_LIBRARY_DIRS}
? )
? #link_libraries(deptrum_camera_static)
? if (MSVC) ? ?//MSVC表示windows系統
? ? target_link_libraries(${targetname}
? ? ? deptrum_camera
?? ? ?AE
? ? ? ${OpenCV_LIBS}
? ? ? ${Zlib_LIBS}
? ? ? loguru
? ? ? visualizer?? ? ?
? ? )
? endif()
? if(${SYSTEM_PLATFORM} STREQUAL "linux-aarch64")
? ? target_link_libraries(${targetname}
? ? ? X11
? ? )
? ? add_definitions(-D BUILD_WITH_X11)
? endif()
? set_target_properties(${targetname} PROPERTIES FOLDER "camera-demo-test")
endfunction()
add_test_case(deptrum_camera_tof_test ? tof_main.cc)
add_test_case(deptrum_camera_thinman_mini_test ? ?thinman_mini_main.cc)
add_test_case(deptrum_camera_fatman_mini_test ? ? fatman_mini_main.cc)
?
總結
以上是生活随笔為你收集整理的ISP 【一】————boost标准库使用——批量读取保存文件 /boost第三方库的使用及其cmake添加,图像gramma的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猪脚饭做法的全部过程,正宗猪脚饭怎么做好
- 下一篇: MATLAB【八】———— matlab