Windows下 CLion中,配置 OpenCV、LibTorch

首先按照win下C++部署深度学习模型之clion配置pytorch+opencv教程记录 步骤配置。

LibTorch 部分

在测试LibTorch时会出现类似 c10.dll not found 的问题(Debug才有):

在这里插入图片描述

参考C++部署Pytorch(Libtorch)出现问题、错误汇总
如何在windows10上使用cmake配置libtorch(vs2022版)

主要是MSVC需要这些 dll文件 。 可以如下修改CmakeList.txt让它找到:

cmake_minimum_required(VERSION 3.12)
project(opencv_test)

set(CMAKE_CXX_STANDARD 17)

#set(CMAKE_PREFIX_PATH C:/Libraries/libtorch-win-shared-with-deps-2.3.0+cu118/libtorch)
list(APPEND CMAKE_PREFIX_PATH C:/Libraries/libtorch-win-shared-with-deps-2.3.0+cu118/libtorch)		# 这里指定的话不必将Torch的路径加入环境变量
#set(Torch_DIR "E:/libtorch/share/cmake/Torch")
#include_directories("E:/libtorch/include")
#include_directories("E:/libtorch/include/torch/csrc/api/include")
find_package(Torch REQUIRED)
message(STATUS "torch status: ${TORCH_FOUND}")
message(STATUS "torch library: ${TORCH_LIBRARIES}")
message(STATUS "TORCH_INSTALL_PREFIX: ${TORCH_INSTALL_PREFIX}")


add_executable(opencv_test main.cpp)
target_link_libraries(opencv_test ${TORCH_LIBRARIES})

if (MSVC)
    file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
    add_custom_command(TARGET opencv_test
            POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${TORCH_DLLS}
            $<TARGET_FILE_DIR:opencv_test>)
endif (MSVC)

if (CMAKE_VERSION VERSION_GREATER 3.12)
    set_property(TARGET opencv_test PROPERTY CXX_STANDARD 17)
endif()

OpenCV 部分

clion编译OpenCV时,install的位置在这(更多参考):
在这里插入图片描述

不能用clion编译,还是会出现找不到 dll文件的问题!!!

参考如下链接用VS编译:

Windows 下使用 CMake + Visual Studio 2022 编译 OpenCV 4.8.1 及其扩展模块 (主要参考)

vs2019编译opencv

注: Opencv_world勾选后后面build可能会出问题,不知道怎么解决建议别勾。

之后记得把 D:\prj\opencv\opencv4\out\install\x64-Debug\x64\vc17\bin添加到环境变量。

之后在camke时你可能又出现了问题

CMake Warning at C:/Libraries/opencv-4.8.1/cmake-build-release/install/OpenCVConfig.cmake:190 (message):
  Found OpenCV Windows Pack but it has no binaries compatible with your
  configuration.

  You should manually point CMake variable OpenCV_DIR to your build of OpenCV
  library.
Call Stack (most recent call first):
  CMakeLists.txt:8 (find_package)


CMake Error at CMakeLists.txt:8 (find_package):
  Found package configuration file:

    C:/Libraries/opencv-4.8.1/cmake-build-release/install/OpenCVConfig.cmake

  but it set OpenCV_FOUND to FALSE so package "OpenCV" is considered to be
  NOT FOUND.

这是因为OpenCV_DIR 应当精确到lib!!! 故意的还是不小心的???

set(OpenCV_DIR C:/Libraries/opencv-4.8.1/cmake-build-release/install/lib)

完整工程文件

CmakeList.txt

cmake_minimum_required(VERSION 3.12)
project(opencv_test)
set(CMAKE_CXX_STANDARD 17)

set(CMAKE_BUILD_TYPE "Release")


set(OpenCV_DIR C:/Libraries/opencv-4.8.1/build/install/lib)  # 这里要精确到lib!
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
message(STATUS "OpenCV status:" ${OpenCV_FOUND})
message(STATUS "OpenCV Libs:" ${OpenCV_LIBS})


set(CMAKE_PREFIX_PATH C:/Libraries/libtorch-win-shared-with-deps-2.3.0+cu118/libtorch)
#set(Torch_DIR "E:/libtorch/share/cmake/Torch")
#include_directories("E:/libtorch/include")
#include_directories("E:/libtorch/include/torch/csrc/api/include")
find_package(Torch REQUIRED)
message(STATUS "torch status: ${TORCH_FOUND}")
message(STATUS "torch library: ${TORCH_LIBRARIES}")
message(STATUS "TORCH_INSTALL_PREFIX: ${TORCH_INSTALL_PREFIX}")



add_executable(opencv_test main.cpp)
target_link_libraries(opencv_test
        ${TORCH_LIBRARIES}
        ${OpenCV_LIBS}
)

if (MSVC)
    file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
    file(GLOB OpenCV_DLLS "${OpenCV_DIR}/../bin/*.dll")
    add_custom_command(TARGET opencv_test
            POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${TORCH_DLLS} ${OpenCV_DLLS}
            $<TARGET_FILE_DIR:opencv_test>)
endif (MSVC)

main.cpp

#include <iostream>
#include <torch/script.h>
#include <torch/torch.h>

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>



void test_libtorch_version() {
    if (torch::cuda::cudnn_is_available())
    {
        std::cout << "cuDNN is available." << std::endl;
    }
    else
    {
        std::cout << "cuDNN is not available." << std::endl;
    }
    if (torch::cuda::is_available())
    {
        std::cout << "CUDA is available." << std::endl;
    }
    else
    {
        std::cout << "CUDA is not available." << std::endl;
    }
    std::cout << "Device count : " << torch::cuda::device_count() << std::endl;

}

int main(int, char**)  {
    torch::Tensor a = torch::rand({2, 3});
    std::cout << a << std::endl;


    test_libtorch_version();
    torch::Tensor b = torch::randint(10, 20, { 3, 2 });
    std::cout << b << std::endl;


    std::string path = "C:\\Users\\THM\\Documents\\Projects\\test_openvins_py\\data\\coco_bike.jpg";
    cv::Mat im = cv::imread(path);
    cv::imshow("image", im);
    cv::waitKey(0);
    return 0;
}

还有问题! – 不能debug???

是的,上面只是编译了OpenCV的Release版本,想要debug你还得编译一遍debug版的!

怎么编呢?
你应该记得我们在编译时,将VS的编译模式改成了release模式,现在只需要调回debug模式,

在这里插入图片描述
然后再分别Build ALL_BUILD和INSTALL即可。
在这里插入图片描述

期间会遇到的编译问题是:

Debug build error: LNK1104: cannot open file ‘python311_d.lib’

不会有人还装了debug版的python吧?!
如果你也没有,可以参照论坛, 找到你python路径下的PATH_TO_PYTHON_DIST/include/pyconfig.h, 修改:

pragma comment(lib,"pythonxx_d.lib")

to

pragma comment(lib,"pythonxx.lib")

and

#       define Py_DEBUG

to

//#       define Py_DEBUG

还是不行???

另外创建一个转为debug而设置的文件夹build_debug,从Cmake开始再重走一遍流程。
在这里插入图片描述
最后可将build_debug里的东西复制到之前的build文件夹内(重复文件直接跳过)。

当然不嫌麻烦的话不复制也行,可以在CMakeList.txt里根据CMAKE_BUILD_TYPE指定对应build内的lib。

Last

最后附一个:Build OpenCV (including Python) with CUDA on Windows

### STM32C8T6 单片机喇叭驱动示例代码 对于STM32C8T6单片机来说,要实现对喇叭的驱动通常会涉及到PWM信号生成以及DAC输出等功能来产生音频信号。下面是一个简单的例子,展示如何利用STM32CubeMX配置并编写一段用于播放简单音调的程序。 #### PWM方式生成方波作为基础频率源 ```c // 初始化TIM3定时器为PWM模式, 输出到PA6引脚上 __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; htim3.Init.Prescaler = 79; // 设置预分频系数使得计数频率=APB1时钟/80 (假设系统主频72MHz) htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 999; // 自动重装载值决定周期长度 if (HAL_TIM_PWM_Init(&htim3) != HAL_OK){ Error_Handler(); } // 配置通道1(PA6)为PWM输出 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; // 初始占空比设置 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){ Error_Handler(); } ``` #### 使用DAC转换模拟电压给扬声器供电 为了获得更好的音质效果,还可以考虑使用内部DAC配合外部低通滤波电路来代替纯数字式的PWM方法: ```c // DAC初始化函数 static void MX_DAC_Init(void) { DAC_ChannelConfTypeDef sConfig; hdac.Instance = DAC; if (HAL_DAC_Init(&hdac) != HAL_OK) Error_Handler(); sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK) Error_Handler(); } void Play_Tone(uint16_t frequencyHz,uint16_t durationMs) { uint32_t i,j; float t,freqScale,sampleValue; freqScale=(float)(SystemCoreClock)/(frequencyHz*2); // 计算每次改变幅度所需循环次数 for(i=0;i<durationMs*freqScale;i++) { sampleValue=sin(2*M_PI*(i%((int)freqScale))/freqScale)*127+128; __HAL_DAC_SET_VALUE(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,(uint32_t)sampleValue); for(j=0;j<(SystemCoreClock/(1000/frequencyHz));j++); } } ``` 上述代码片段展示了两种不同的方案来驱动喇叭发声,分别是通过PWM生成特定频率的声音[^1] 和借助DAC输出正弦波形以提高声音质量[^2] 。这两种技术都可以应用于基于STM32系列MCU的产品开发当中,在实际应用中可根据具体需求选择合适的方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昼行plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值