• OpenCV 3-1.2-第一个程序


    OpenCV 提供了用于读取各种图像文件类型以及视频和相机的函数。这些函数是名为HighGUI的工具包的一部分。我们将使用其中的一些函数来创建一个简单的程序,该程序可以打开图像并将其显示在屏幕上

    #include <opencv2/opencv.hpp>
    
    int main(int argc, char const *argv[])
    {
        cv::Mat img = cv::imread(argv[1], -1);
        if (img.empty())
        {
            return -1;
        }
        cv::namedWindow("Example1", cv::WINDOW_AUTOSIZE);
        cv::imshow("Example1", img);
        cv::waitKey(0);
        cv::destroyAllWindows();
        
        return 0;
    }
    

    请注意,OpenCV 函数包含于名为cv的命名空间中。要调用 OpenCV 函数,必须通过将cv::前缀添加到每个函数前。如果不想这么麻烦,我们可以使用using namespace cv;指令,这会告诉编译器假设函数可能属于该名称空间。我们再写一个程序,注意这两个程序包含头文件的不同,我们只使用了必要的包含文件来缩短编译时间。

    #include <opencv2/highgui/highgui.hpp>
    
    int main(int argc, char const *argv[])
    {
        cv::Mat img = cv::imread(argv[1], -1);
        if (img.empty())
            return -1;
        cv::namedWindow("Example2", cv::WINDOW_AUTOSIZE);
        cv::imshow("Example2", img);
        cv::waitKey(0);
        cv::destroyWindow("Example2");
    
        return 0;
    }
    

    编译并从命令行运行带有一个参数的命令时,程序会将图像显示在屏幕上。然后,它会一直等待,直到用户按下某个键,此时它会关闭窗口并退出。让我们逐行浏览程序,了解每个命令都在做些什么。

    cv::Mat img = cv::imread( argv[1], -1 );
    

    此行加载图像。函数cv::imread()是基于文件名确定要加载的文件格式的函数;它还自动分配图像所需的内存。cv::imread()可以读取多种图像格式,包括 BMP、DIB、JPEG、JPE、PNG、PBM、PGM、PPM、SR、RAS 和 TIFF。返回cv::Mat类型的值。这种数据结构是最常见的 OpenCV 数据结构。OpenCV 使用此数据结构处理所有类型的图像:单通道、多通道、整数值、浮点值等等。紧随其后的一行:

    if (img.empty())
        return -1;
    

    检查图像是否成功读取。另一个函数cv::namedWindow()在屏幕上打开一个显示图像的窗口。

    cv::namedWindow("Example2", cv::WINDOW_AUTOSIZE);
    

    这个函数由 HighGUI 库提供,还为窗口指定名称(在本例中为"Example1")。将来与此窗口交互的 HighGUI 调用将使用此名称引用它。
    cv::namedWindow()的第二个参数定义窗口属性。它可以设置为0(默认值)或cv::WINDOW_AUTOSIZE。在前一种情况下,无论图像大小如何,窗口的大小都是相同的,并且图像将被缩放以适合窗口。在后一种情况下,当加载图像以适应图像的真实大小时,窗口将自动扩展或收缩。

    cv::imshow("Example2", img);
    

    只要cv::Mat结构中有图像数据,就可以使用cv::imshow()在现有窗口中显示它。如果窗口不存在(由cv::namedWindow()创建),则cv::imshow()函数会创建一个窗口。在调用cv::imshow()时,将使用适当的大小重新绘制窗口,如果窗口是使用cv::WINDOW_AUTOSIZE标志创建的,则窗口将根据需要调整自身大小。

    cv::waitKey(0);
    

    cv::waitKey()函数要求程序停止并等待按键。如果给出了一个正整数参数,程序将等待该毫秒数,然后即使没有按任何键也会继续。如果参数设置为0或负数,程序将一直等待按键。

    使用cv::Mat数据结构时,图像在超出作用域时会自动销毁释放,类似于 STL 的容器类。该自动释放由计算机控制。在很大程度上,这意味着我们不再需要担心图像的分配和释放。

    cv::destroyWindow("Example2");
    

    最后,我们可以销毁释放窗口。函数cv::destroyWindow()将关闭窗口并释放任何相关的内存使用。对于较短的程序,我们可以跳过此步骤。对于更长、更复杂的程序,程序员应该确保在窗口超出作用域之前将其销毁释放,以避免内存泄漏。

  • 相关阅读:
    八、总结
    第5章、Kafka监控
    十一、总结
    十、图形化的客户端和监控工具
    九、zookeeper四字监控命令
    八、zookeeper 开源客户端curator介绍
    七、Zookeeper原理
    六、zookeeper 事件监听机制
    五、zookeeper的javaApi
    四、zookeeper的Acl权限控制
  • 原文地址:https://www.cnblogs.com/thewaytotheway/p/12847235.html
Copyright © 2020-2023  润新知