详解c++ 对‘cv::waitKey(int)’未定义的引用

举报
皮牙子抓饭 发表于 2024/02/10 23:34:26 2024/02/10
【摘要】 详解C++ 对 'cv::waitKey(int)' 未定义的引用在使用OpenCV库进行图像处理和计算机视觉任务时,很多人可能会遇到一个常见的编译错误,即对 cv::waitKey(int) 的未定义引用错误。本文将详细介绍这个错误的原因以及如何解决它。错误原因错误代码通常如下所示:cppCopy codeundefined reference to `cv::waitKey(int)'这...

详解C++ 对 'cv::waitKey(int)' 未定义的引用

在使用OpenCV库进行图像处理和计算机视觉任务时,很多人可能会遇到一个常见的编译错误,即对 cv::waitKey(int) 的未定义引用错误。本文将详细介绍这个错误的原因以及如何解决它。

错误原因

错误代码通常如下所示:

cppCopy code
undefined reference to `cv::waitKey(int)'

这个错误的原因是链接器未能找到对 cv::waitKey(int) 函数的定义。这是因为 cv::waitKey(int) 函数属于OpenCV库,而链接器无法找到与该函数相关的实现。

解决方法

要解决这个错误,我们需要确保正确设置了项目的编译和链接选项,以便链接器能够找到OpenCV库并正确地链接它。 下面是一些可能的解决方法:

1. 检查OpenCV库的链接

首先,确保已经正确安装了OpenCV库,并且在项目的编译和链接选项中包含了正确的库路径和库文件。具体来说,需要在链接选项中添加 -lopencv_core-lopencv_highgui-lopencv_imgproc 等OpenCV库的链接指令。 例如,在使用GNU编译器的情况下,可以在编译命令中添加以下链接选项:

bashCopy code
g++ your_code.cpp -o your_executable -lopencv_core -lopencv_highgui -lopencv_imgproc

2. 更新OpenCV版本

如果确认OpenCV库的链接设置没有问题,但仍然遇到这个错误,可能是因为当前使用的OpenCV版本不支持 cv::waitKey(int) 函数。在较旧的OpenCV版本中,waitKey() 函数没有参数,而在较新的版本中,增加了一个整数参数。 因此,如果你的代码中使用了 cv::waitKey(int) 函数而你当前使用的是较旧的OpenCV版本,请尝试更新到较新的版本,并检查是否解决了问题。

3. 包含正确的头文件

确保在你的代码文件中包含了正确的OpenCV头文件,即 #include <opencv2/opencv.hpp>。 这个头文件包含了OpenCV的核心模块,其中包含了 cv::waitKey(int) 函数的定义。

4. 使用命名空间

如果在你的代码中使用了 cv::waitKey(int) 函数而没有显式地使用OpenCV命名空间,可以尝试在代码文件中添加以下语句:

cppCopy code
using namespace cv;

这将使得 cv::waitKey(int) 函数在代码中可见,避免了对未定义引用的错误。



下面是一个示例代码,演示了如何使用cv::waitKey(int)函数来实现一个简单的图像查看器:

cppCopy code
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
    // 读取图像文件
    Mat image = imread("image.jpg", IMREAD_COLOR);
    // 检查是否成功加载图像
    if (image.empty()) {
        std::cout << "无法读取图像文件" << std::endl;
        return -1;
    }
    // 创建一个窗口
    namedWindow("Image Viewer", WINDOW_NORMAL);
    // 在窗口中显示图像
    imshow("Image Viewer", image);
    // 等待用户按下键盘上的按键,返回按下键的ASCII码
    int key = waitKey(0);
    // 根据按键的ASCII码执行不同的操作
    if (key == 27) {
        // 如果按下的是ESC键(ASCII码为27),则退出程序
        return 0;
    } else if (key == 's') {
        // 如果按下的是字母's'键,则保存图像到文件
        imwrite("saved_image.jpg", image);
        std::cout << "图像已保存" << std::endl;
    } else {
        // 其他情况,默认显示按下的按键的ASCII码
        std::cout << "按下的按键ASCII码为:" << key << std::endl;
    }
    return 0;
}

上述示例代码通过使用OpenCV库中的 cv::waitKey(int) 函数,实现了一个简单的图像查看器。它加载一张图像并在一个窗口中显示出来,然后等待用户按下键盘上的按键。根据按键的不同,程序执行不同的操作:按下ESC键退出程序,按下字母's'键保存图像,其他的按键显示按下的按键的ASCII码。


waitKey()是OpenCV库中一个用于显示图像并等待键盘输入的函数。它在图像处理和计算机视觉应用中经常被使用。 函数签名:

cppCopy code
int waitKey(int delay = 0)

参数:

  • delay(可选):等待键盘输入的时间(以毫秒为单位)。默认值为0,表示无限期等待用户按键。如果设置为正整数,则表示等待指定的毫秒数后继续执行。如果设置为负整数,则表示等待直到用户按下键盘上的任意按键。 返回值:
  • int:表示用户按下的按键的ASCII码。如果没有按键输入,则返回-1。 waitKey()的主要作用是在显示图像或视频期间等待用户的键盘输入,并返回用户按下的按键的ASCII码。使用它可以实现与用户交互的功能,例如通过按下按键进行图像操作、执行特定的事件或选择不同的图像处理操作。 在图像或视频显示期间,waitKey()常常与imshow()函数一起使用。imshow()用于在窗口中显示图像或视频帧,而waitKey()用于等待键盘输入。这样,用户就可以通过按下不同的按键来触发不同的操作或控制图像的显示。 示例用法:
cppCopy code
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
    // 读取图像文件
    Mat image = imread("image.jpg", IMREAD_COLOR);
    // 检查是否成功加载图像
    if (image.empty()) {
        std::cout << "无法读取图像文件" << std::endl;
        return -1;
    }
    // 创建一个窗口
    namedWindow("Image Viewer", WINDOW_NORMAL);
    // 在窗口中显示图像
    imshow("Image Viewer", image);
    // 等待用户按下键盘上的按键,返回按下键的ASCII码
    int key = waitKey(0);
    // 根据按键的ASCII码执行不同的操作
    if (key == 27) {
        // 如果按下的是ESC键(ASCII码为27),则退出程序
        return 0;
    } else if (key == 's') {
        // 如果按下的是字母's'键,则保存图像到文件
        imwrite("saved_image.jpg", image);
        std::cout << "图像已保存" << std::endl;
    } else {
        // 其他情况,默认显示按下的按键的ASCII码
        std::cout << "按下的按键ASCII码为:" << key << std::endl;
    }
    return 0;
}

在上述示例代码中,waitKey(0)使程序暂停执行,等待用户按下键盘上的按键。根据不同的按键,程序执行不同的操作,例如按下ESC键退出程序,按下字母's'键保存图像,而其他按键则显示按键的ASCII码。通过这种方式,可以实现与用户的交互,增强图像处理应用的功能和用户体验。

结论

cv::waitKey(int) 未定义引用错误是一个常见的OpenCV编译错误。解决这个错误通常需要检查OpenCV库的链接设置、更新OpenCV版本、包含正确的头文件或使用OpenCV命名空间。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。