cv::imread无法读取图片以及cv::glob报错

问题描述:使用opencv读取图片发生错误,图片路径正确的情况下,imread无法读取图片,glob无法读取文件夹下的文件名。

Exception has occurred: W32/0xC0000409
Unhandled exception at 0x00007FF80834C408 (ucrtbase.dll) in bstitchts.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.

解决思路:代码没有问题,编译也没有问题,报错显示的内容极不相关。刚开始怀疑ucrtbase.dll这个库出现了问题,其实并不是。

  1. 我的电脑里面有一个opencv2.4以及一个opencv4.5。opencv2.4和4.5都能使用,然后使用opencv2.4的代码是在debug模式下报错。
  2. 问题在于opencv是在debug和release模式下是需要不同的库,分别是xxxd.dll和xxx.dll。而在我的电脑对应的opencv库里面,通过.cmake文件可以看出opencv2.4只有release版本,并且没有xxxd.dll这种形式的库。

图片说明

图1 opencv4/x64/vc14/lib下的.cmake文件

image-20210701180625951

图2 opencv2413/x64/vc14/lib下的.cmake文件
  1. 两种库可以公用吗?不可以,因为opencv的源代码是包含stl库函数的,而stl库在debug和release版本下则有不同的表现。比如std::string 在debug 和 release 环境中的内存大小是不一致的。 如果混用,会出现内存奔溃现象。

  2. 两种库的使用方式是同样的。可以通过find_package来查找对应版本的库(前提是存在两个版本的库

    set(OpenCV_DIR "D:/opencv/cv24136m")
    # OpenCV 
    FIND_PACKAGE(OpenCV REQUIRED)
    if(OpenCV_FOUND)
        include_directories(${OpenCV_INCLUDE_DIRS})
        link_directories(${OpenCV_LIBRARY_DIRS})
    endif()
    target_link_directories(${PROJECT_NAME} ${source_code})