opencv_java import org.opencv.highgui.Highgui,提示错误

本文介绍了解决OpenCV 3.0版本中图像读取问题的方法,由于opencv.highgui.Highgui包及其中的imread、imwrite等方法已被移除,文章提供了新的导入方式及替代代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因:1、OpenCV-3.0版本的库中已经没有opencv.highgui.Highgui这个包,

2、opencv.highgui.Highgui包中的类imread, imwrite,等都移到import org.opencv.imgcodecs.Imgcodecs里面。

3、只需导入import org.opencv.imgcodecs.Imgcodecs;然后把Mat image = Highgui.imread(“”)改为Mat image = Imgcodecs.imread(“”),就OK啦。

<think>我们正在解决一个关于使用CMake和OpenCV时出现的链接错误问题。用户提供的CMake配置和代码中调用了OpenCV函数,但出现了未定义的引用错误,如`undefined reference to cv::Mat::~Mat()`等。根据用户描述,在打印OpenCV版本时正常,但在实际调用函数时出现链接错误。 分析用户提供的CMake配置: 1. 使用`find_package(OpenCV REQUIRED)`查找OpenCV包,并打印版本信息,这一步正常说明找到了OpenCV。 2. 使用`include_directories(${OpenCV_INCLUDE_DIRS})`添加头文件路径。 3. 添加可执行文件`untitled4`,源文件为`main.cpp`。 4. 链接OpenCV库:`target_link_libraries(makecsv ${OpenCV_LIBS})` 这里存在明显问题:可执行文件名为`untitled4`,但链接的目标却是`makecsv`。 因此,问题可能在于`target_link_libraries`命令中指定的目标名称错误。应该将`makecsv`改为`untitled4`(即`add_executable`中指定的目标名称)。 修改后的链接命令应为: ```cmake target_link_libraries(untitled4 ${OpenCV_LIBS}) ``` 这样,链接器就会将OpenCV库链接到`untitled4`可执行文件上。 另外,用户还提到另一个错误信息:`CMake OpenCV test_qrcode linking error with mingw32-make and collect2.exe ld returned 1`。这通常也是链接错误,可能的原因包括: 1. 库路径没有正确设置,导致链接器找不到库文件。 2. 链接的库名称不正确或缺少某个库。 3. 编译器与库的版本不兼容(比如32位和64位混合)。 但是,根据用户提供的CMake配置,我们已使用`find_package`来获取OpenCV的库,所以通常`${OpenCV_LIBS}`变量会包含所有需要的库。因此,主要问题可能是目标名称写错。 因此,建议用户修改CMakeLists.txt中的目标名称,然后重新生成构建系统并编译。 步骤: 1. 修改CMakeLists.txt,将`target_link_libraries`中的目标改为`untitled4`。 2. 删除之前的构建目录(或者重新创建一个构建目录)以避免缓存问题。 3. 运行CMake生成构建文件。 4. 使用make(或mingw32-make)进行编译。 如果问题仍然存在,需要检查: - OpenCV是否被正确安装?可以通过运行OpenCV自带的示例程序测试。 - 确保CMake找到的OpenCV版本是用户期望的版本(通过打印的版本信息确认)。 - 检查编译器的位数(32位或64位)和OpenCV库的位数是否一致。 此外,用户提供的另一个错误信息(test_qrcode的链接错误)可能与当前问题无关,因为当前项目是`untitled4`,而不是`test_qrcode`。如果用户有多个项目,需要分别检查每个项目的CMake配置。 综上所述,主要修复目标名称错误,然后重新编译。 生成相关问题: 1. 如何正确配置CMake来链接OpenCV库? 2. 在CMake中,`target_link_libraries`命令的正确用法是什么? 3. 如何解决编译OpenCV程序时出现的未定义引用错误? 4. 如何检查CMake找到的OpenCV库的路径和版本? 5. 如何确保编译器与第三方库的兼容性(例如32位和64位)?</think>### 解决 OpenCV 与 CMake 的链接错误分析 根据您描述的 `undefined reference to cv::Mat::~Mat()` 错误和 CMake 配置,问题核心在于 **目标名称不一致** 和 **链接顺序问题**。以下是具体分析和解决方案: --- ### 错误原因分析 1. **目标名称不匹配** 您的可执行文件名为 `untitled4`,但链接库时却指向 `makecsv`: ```cmake add_executable(untitled4 main.cpp) # 目标名 untitled4 target_link_libraries(makecsv ${OpenCV_LIBS}) # 错误的目标名 makecsv ``` 2. **链接顺序问题** OpenCV 库需要按特定顺序链接(如 `opencv_core` 必须在 `opencv_imgproc` 之前)。直接使用 `${OpenCV_LIBS}` 变量可自动处理此问题,但目标名称错误导致该机制失效。 3. **编译器兼容性问题** MinGW 的 GCC 编译器对符号解析更严格,若库文件缺失或版本不匹配(如 32/64 位冲突),会触发 `collect2.exe: error: ld returned 1`。 --- ### 修复方案 修改您的 `CMakeLists.txt`: ```cmake cmake_minimum_required(VERSION 3.28) project(untitled4 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) # 查找OpenCV(重要:REQUIRED确保未找到时报错) find_package(OpenCV REQUIRED) message(STATUS "OpenCV version: ${OpenCV_VERSION}") message(STATUS "OpenCV libs: ${OpenCV_LIBS}") # 打印库路径验证 # 添加可执行文件(名称与链接目标一致) add_executable(untitled4 main.cpp) # 正确链接目标(使用TARGET名称untitled4) target_link_libraries(untitled4 PRIVATE ${OpenCV_LIBS}) # 现代CMake推荐使用target_include_directories替代include_directories target_include_directories(untitled4 PRIVATE ${OpenCV_INCLUDE_DIRS}) ``` --- ### 关键修复点说明 1. **目标名称统一** `add_executable()` 和 `target_link_libraries()` 中的目标名必须一致(此处均为 `untitled4`)。 2. **使用现代 CMake 语法** `target_include_directories()` 和 `PRIVATE` 作用域能更精确地控制依赖传递[^1]。 3. **验证 OpenCV 路径** 通过 `message()` 输出 `${OpenCV_LIBS}` 确保路径有效,例如: ``` -- OpenCV libs: opencv_core;opencv_highgui;... ``` --- ### 附加检查步骤 若修复后仍报错,请检查: 1. **环境变量冲突** 删除 MinGW 和 CMake 的缓存文件(`build/` 目录),重新生成: ```bash cd build cmake --build . --clean-first ``` 2. **OpenCV 版本兼容** 确认安装的 OpenCV 是否包含 MinGW 编译的库(官方预编译版通常只有 MSVC 支持),建议用 MinGW 重新编译 OpenCV。 3. **路径含中文或空格** 确保项目路径和 OpenCV 安装路径不含中文或空格(可能导致链接器路径解析失败)。 --- ### 相关问题 1. 如何验证 CMake 是否正确找到了 OpenCV 库? 2. MinGW 编译 OpenCV 时需要哪些特殊配置? 3. 除了 `target_link_libraries`,还有哪些方法解决 C++ 的未定义引用错误? 4. CMake 中 `PRIVATE`、`PUBLIC` 和 `INTERFACE` 依赖传递有什么区别?[^1] [^1]: CMake 官方文档指出:`PRIVATE` 依赖仅影响当前目标,`PUBLIC` 影响当前目标及依赖它的目标,`INTERFACE` 仅影响依赖项。正确使用可避免链接污染。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值