PROJ4编译与使用(Windows平台)-32位库

最近一直忙于做项目,每天也在码代码,所以就没有每天一发编程联系,目前项目大的框架已写好,在这里总结一下项目中的一点东西。

做的是遥感影像的项目,要用的坐标的转换,我不是遥感专业的,所以对于一些概念的理解不那么准确。因为大框架用的是GDAL库,查找资料后,确定了其中的坐标转换,即地理坐标与投影坐标的转换,要用的proj.4库。

Proj.4库是开源GIS最著名的地图投影库,著名的开源图像库gdal中的投影转换函数也是动态调用该库函数的,目前的最新版本是proj-4.9.2。proj4库的下载地址是:https://github.com/OSGeo/proj.4

下载解压后,编译方式跟GDAL库的基本一样,命令行的选取请查看之前文章中的特别说明部分。

1、库目录的设置

在proj4目录下,编辑nmake.opt文件,修改INSTDIR的值即可。 如果不修改库的生成路径。编译完后,会默认值在C盘的根目录下,创建PROJ文件夹,里面有四个文件夹,分别是bin,lib,include以及share四个文件夹,其中include和lib是用来做二次开发使用,bin存放的是dll和exe文件,share里面存储的是PROJ4所定义的一些投影文件等,在发布程序的时候,share文件夹需要一同进行发布,否则在做投影转换的时候可能因为找不到其中的文件而导致转换失败。
2、根据本机情况编译
首先配置vs到用户环境变量
这里写图片描述
在开始种输入cmd
这里写图片描述
这里写图片描述
然后按压缩包中的readme,执行命令:
执行脚本in\VCVARS32.BAT(这个很关键,否则会编译失败,找不到相应函数解析)
nmake /f makefile.vc
nmake /f makefile.vc install-all

2、32位RELEASE版proj4库的编译

打开VS的32位命令行工具,然后将其工作目录切换到proj4的目录,然后输入
nmake /f makefile.vc
nmake /f makefile.vc install-all

3、32位DEBUG版proj4库的编译

打开VS的x86命令行工具,然后将其工作目录切换到proj4的目录,然后输入
nmake /f makefile.vc
nmake /f makefile.vc install-all DEBUG=1

4、64位proj4库的编译

打开VS的64位命令行工具,然后将其工作目录切换到proj4的目录,然后输入
nmake /f makefile.vc
nmake /f makefile.vc install-all

5、在VS中调用

将生成的文件中include和lib库分别包含到工程文件中,添加proj.lib和proj_i.lib,并且把bin下的dll文件拷到工程目录下面。

6、测试栗子

#include <proj_api.h>
#include <iostream>

int main(int argc, char **argv)
{
    projPJ pj_merc, pj_latlong;
    double x, y;

    if (!(pj_merc = pj_init_plus("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")))
    exit(1);
    if (!(pj_latlong = pj_init_plus("+proj=longlat +datum=WGS84 +no_defs")))
    exit(1);

    x = -9.866554;
    y = 7.454779;
    x *= DEG_TO_RAD;
    y *= DEG_TO_RAD;
    pj_transform(pj_latlong, pj_merc, 1, 1, &x, &y, NULL);

    std::cout.precision(12);
    std::cout << "(" << x << " , " << y << ")" << std::endl;

    return 0;
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,要使用 C++ 编写支持多模型调用的动态连接,需要使用一些,比如 OpenCV 和 ONNX Runtime。以下是一个基本的示例代码: ```c++ #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include <onnxruntime_cxx_api.h> class YOLOv5Detector { public: YOLOv5Detector(const std::string& model_path) { // Initialize ONNX Runtime Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(1); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_BASIC); session_ = std::make_unique<Ort::Session>(env, model_path, session_options); // Get model input and output information auto input_info = session_.get()->GetInputTypeInfo(0); auto output_info = session_.get()->GetOutputTypeInfo(0); input_name_ = input_info.GetOnnxName(); output_name_ = output_info.GetOnnxName(); input_dims_ = input_info.GetTensorTypeAndShapeInfo().GetShape(); output_dims_ = output_info.GetTensorTypeAndShapeInfo().GetShape(); } std::vector<cv::Rect> detect(const cv::Mat& image) { // Preprocess image cv::Mat resized_image; cv::resize(image, resized_image, cv::Size(input_dims_[3], input_dims_[2])); cv::Mat float_image; resized_image.convertTo(float_image, CV_32FC3, 1.0 / 255.0); std::vector<float> input_data(float_image.ptr<float>(), float_image.ptr<float>() + float_image.total() * float_image.channels()); // Initialize input and output tensors Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtDeviceAllocator, OrtMemTypeCPU); std::vector<int64_t> input_shape = {1, 3, input_dims_[2], input_dims_[3]}; std::vector<int64_t> output_shape = {1, static_cast<int64_t>(output_dims_[1]), static_cast<int64_t>(output_dims_[2]), static_cast<int64_t>(output_dims_[3])}; Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_data.data(), input_data.size(), input_shape.data(), input_shape.size()); Ort::Value output_tensor = Ort::Value::CreateTensor<float>(memory_info, nullptr, output_shape.data(), output_shape.size()); // Run inference std::vector<const char*> input_names = {input_name_.c_str()}; std::vector<const char*> output_names = {output_name_.c_str()}; session_.get()->Run(Ort::RunOptions{nullptr}, input_names.data(), &input_tensor, 1, output_names.data(), 1, &output_tensor); // Postprocess output const float* output_data = output_tensor.GetTensorMutableData<float>(); std::vector<cv::Rect> detected_rects; for (int i = 0; i < output_dims_[1]; i++) { float score = output_data[5 * i + 4]; if (score >= 0.5) { float x_center = output_data[5 * i]; float y_center = output_data[5 * i + 1]; float width = output_data[5 * i + 2]; float height = output_data[5 * i + 3]; int x_left = static_cast<int>((x_center - width / 2) * image.cols); int y_top = static_cast<int>((y_center - height / 2) * image.rows); int rect_width = static_cast<int>(width * image.cols); int rect_height = static_cast<int>(height * image.rows); detected_rects.emplace_back(x_left, y_top, rect_width, rect_height); } } return detected_rects; } private: std::unique_ptr<Ort::Session> session_; std::string input_name_; std::string output_name_; std::vector<int64_t> input_dims_; std::vector<int64_t> output_dims_; }; ``` 此代码创建了一个名为 `YOLOv5Detector` 的类,该类使用 ONNX Runtime 加载 YOLOv5 模型,并在给定图像上运行检测。检测结果是矩形的列表,表示在图像中检测到的对象。 要将此类编译为 DLL,您需要使用 Visual Studio 或其他支持 Windows DLL 编译的 IDE。以下是一个示例项目文件: ```xml <?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup Label="ProjectConfigurations"> <ProjectConfiguration Include="Debug|Win32"> <Configuration>Debug</Configuration> <Platform>Win32</Platform> </ProjectConfiguration> <ProjectConfiguration Include="Release|Win32"> <Configuration>Release</Configuration> <Platform>Win32</Platform> </ProjectConfiguration> </ItemGroup> <PropertyGroup Label="Globals"> <VCProjectVersion>16.0</VCProjectVersion> <ProjectGuid>{GUID}</ProjectGuid> <Keyword>Win32Proj</Keyword> <RootNamespace>YOLOv5Detector</RootNamespace> <WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> <PlatformToolset>v142</PlatformToolset> <CharacterSet>Unicode</CharacterSet> <CLRSupport>true</CLRSupport> <WholeProgramOptimization>false</WholeProgramOptimization> <UseOfMfc>false</UseOfMfc> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <UseDebugLibraries>false</UseDebugLibraries> <PlatformToolset>v142</PlatformToolset> <CharacterSet>Unicode</CharacterSet> <CLRSupport>true</CLRSupport> <WholeProgramOptimization>false</WholeProgramOptimization> <UseOfMfc>false</UseOfMfc> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <ImportGroup Label="ExtensionSettings"> </ImportGroup> <ImportGroup Label="Shared"> </ImportGroup> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> </ImportGroup> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> </ImportGroup> <PropertyGroup Label="UserMacros" /> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <Optimization>Disabled</Optimization> <AdditionalIncludeDirectories>$(OPENCV_DIR)\include;$(ONNXRUNTIME_DIR)\include;</AdditionalIncludeDirectories> <PreprocessorDefinitions>_DEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> <PrecompiledHeader>Create</PrecompiledHeader> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderOutputFile>$(IntDir)\$(TargetName).pch</PrecompiledHeaderOutputFile> <WarningLevel>Level3</WarningLevel> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <CompileAs>Default</CompileAs> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <EnableEnhancedInstructionSet>AdvancedVectorExtensions2</EnableEnhancedInstructionSet> <TreatWarningAsError>true</TreatWarningAsError> <LanguageStandard>c++17</LanguageStandard> </ClCompile> <Link> <AdditionalDependencies>onnxruntime.lib;opencv_world450d.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>$(OPENCV_DIR)\x64\vc15\lib;$(ONNXRUNTIME_DIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <TargetMachine>MachineX64</TargetMachine> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>NDEBUG;_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> <PrecompiledHeader>Create</PrecompiledHeader> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderOutputFile>$(IntDir)\$(TargetName).pch</PrecompiledHeaderOutputFile> <WarningLevel>Level3</WarningLevel> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <CompileAs>Default</CompileAs> <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> <EnableEnhancedInstructionSet>AdvancedVectorExtensions2</EnableEnhancedInstructionSet> <TreatWarningAsError>true</TreatWarningAsError> <LanguageStandard>c++17</LanguageStandard> </ClCompile> <Link> <AdditionalDependencies>onnxruntime.lib;opencv_world450.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>$(OPENCV_DIR)\x64\vc15\lib;$(ONNXRUNTIME_DIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <TargetMachine>MachineX64</TargetMachine> </Link> </ItemDefinitionGroup> <ItemGroup> <ClCompile Include="detector.cpp" /> <ClCompile Include="pch.cpp"> <PrecompiledHeader Condition=" '$(Configuration)|$(Platform)'=='Debug|Win32' ">Create</PrecompiledHeader> <PrecompiledHeader Condition=" '$(Configuration)|$(Platform)'=='Release|Win32' ">Create</PrecompiledHeader> </ClCompile> <ClInclude Include="detector.h" /> <ClInclude Include="pch.h" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> </Project> ``` 将此项目文件保存为 `YOLOv5Detector.vcxproj`,然后使用 Visual Studio 打开该文件并构建解决方案。这将生成一个名为 `YOLOv5Detector.dll` 的 DLL 文件。您可以在其他 C++ 程序中使用此 DLL 文件,并调用 `YOLOv5Detector` 类来运行目标检测算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值