opencv图像加文字与运行时间

使用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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值