zoukankan      html  css  js  c++  java
  • 图像加文字与运行时间——opencv

    本文转自:https://blog.csdn.net/you_big_father/article/details/90604390

    使用opencv处理图像,有时需要实时处理,并将处理结果或者相关信息直接显示在图像上。例如显示帧率,物体标签等。

    加文字:putText() 函数

    此函数在opencv的 imgproc 模块中的 Drawing Functions 中,同样一同存在的有:画线函数(line)、画矩形框函数(rectangle)、画圆函数(circle)等。

    //函数各项参数如下
    void cv::putText(
        InputOutputArray     img,
        const String &     text,
        Point     org,
        int     fontFace,
        double     fontScale,
        Scalar     color,
        int     thickness = 1,
        int     lineType = LINE_8,
        bool     bottomLeftOrigin = false 
    )
    //函数各参数的介绍如下
    img        图片
    text    要绘制的文本字符串
    org        图像中文本字符串的左下角
    fontFace    字体类型, 类型参看HersheyFonts
    fontScale    字体比例因子乘以字体特定的基本大小
    color    文字颜色
    thickness    用于绘制文本的线条的粗细
    lineType    线型。请参见LineTypes
    bottomLeftOrigin    如果为true,则图像数据原点位于左下角。否则,它位于左上角
     

    字体类型:

    enum HersheyFonts {
        FONT_HERSHEY_SIMPLEX        = 0, //!< 常规大小 没有衬线的字体
        FONT_HERSHEY_PLAIN          = 1, //!< 小号 没有衬线的字体
        FONT_HERSHEY_DUPLEX         = 2, //!< 常规大小 复杂的没有衬线的字体
        FONT_HERSHEY_COMPLEX        = 3, //!< 常规大小 衬线字体
        FONT_HERSHEY_TRIPLEX        = 4, //!< 常规大小 复杂的衬线字体
        FONT_HERSHEY_COMPLEX_SMALL  = 5, //!< 小号 衬线字体
        FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< 手写风格的字体
        FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< 复杂的手写风格的字体
        FONT_ITALIC                 = 16 //!< 斜体字体
    };

    另外可见百科:

    西方国家字母体系分为两类:衬线字体(serif)以及无衬线体(sans serif)。

    衬线字体,意思是在字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。

    无衬线体是无衬线字体,没有这些额外的装饰,而且笔画的粗细差不多。

    中文字体中的宋体就是一种最标准的衬线字体,衬线的特征非常明显。字形结构也和手写的楷书一致。因此宋体一直被做为最适合的正文字体。

    线型:

    enum LineTypes {
        FILLED  = -1,
        LINE_4  = 4, //!< 4-connected line
        LINE_8  = 8, //!< 8-connected line
        LINE_AA = 16 //!< antialiased line
    };

    值越大字体越圆滑。

    运行时间的函数:所用函数为 getTickCount() 和 getTickFrequency() 

    getTickCount():返回CPU自某个时间(如启动电脑)以来走过的时钟周期数。

    getTickFrequency():返回CPU一秒中所走的时钟周期数。所以可以以秒为单位对某运算时间计时。

    使用方法:

        //记录当前时间
        double start = static_cast<double>(getTickCount());
     
        /*
            中间为耗时程序
        */
     
        //再次获取时间减去上一次记录的时间,即为运行时间
        double time = ((double)getTickCount() - start) / getTickFrequency();
        cout << "所用时间为:" << time << "" << endl;

    也可用函数cvGetTickCount()和cvGetTickFrequency()。但注意,此时得到的单位是us级的统计时间。

        double start = static_cast<double>(cvGetTickCount());
        double time = ((double)cvGetTickCount() - start) / cvGetTickFrequency();
        cout << "所花费时间为:" << time << "us" << endl;

    综合:

    在输出图片上打印出运行时间,代码大致如下:

    //得到函数的运行时间,并打印到输出图像左上角
     
        cv::Mat imageIn, imageOut;
        stringstream buffer;
        double start = static_cast<double>(getTickCount());
     
        imageIn = imread("picture.jpg");
        imageOut = dosomething(imageIn);
     
        double time = ((double)getTickCount() - start) / getTickFrequency();
        buffer << time;
     
        std::string str = "Time : " + buffer.str() + "s";
        cv::putText(imageOut , str, cv::Point(0.1*imageOut.cols,0.1*imageOut.rows), cv::FONT_HERSHEY_DUPLEX, 1, cv::Scalar(0, 255,0 ), 2, 16);
     
        cv::imshow("sb", imageOut);
        cv::waitKey(10);

    参考:

    https://blog.csdn.net/yzhang6_10/article/details/51126789

    https://blog.csdn.net/guyuealian/article/details/77870983?locationNum=7&fps=1

    https://www.cnblogs.com/lyggqm/p/4562727.html

  • 相关阅读:
    .NET设计模式(19):观察者模式(Observer Pattern)
    漂亮的信息提示
    工厂方法模式(Factory Method)
    .NET设计模式(16):模版方法(Template Method)
    通过序列化实现深拷贝
    C#委托的妙文,让你知道如何发挥委托的作用
    .NET设计模式(12):外观模式(Façade Pattern)
    动态方法DynamicMethod简例
    ado.net中的自动获取存储过程参数
    设计模式之——简单工厂模式
  • 原文地址:https://www.cnblogs.com/eve612/p/14105531.html
Copyright © 2011-2022 走看看