前言

当我们视频分析时可能图像中需要有一个文字说明,OpenCV中本身也有这个API,我们就来看看OpenCV中的图像文字输出。

视频效果

函数API

void putText( Mat& img, const string& text, Point org, int fontFace,double fontScale,  Scalar color, int thickness=1, int lineType=8 );

参数说明:

Mat& img:待写字的图片,我们写在img图上
const string& text:待写入的字,我们下面写入Hello
Point org:第一个字符左下角坐标,我们设定在图片的Point(50,60)坐标。表示x = 50,y = 60。
int fontFace:字体类型,FONT_HERSHEY_SIMPLEX ,FONT_HERSHEY_PLAIN ,FONT_HERSHEY_DUPLEX 等等等。
double fontScale:字体大小,我们设置为2号
Scalar color:字体颜色,颜色用Scalar()表示,不懂得去百度。
int thickness:字体粗细,我们下面代码使用的是4号
int lineType:线型,我们使用默认值8.


代码演示

这次我们用的还是最开始我们用的背景消除建模的那个DEMO《C++ OpenCV视频操作之背景消除建模(BSM)-1》,在这个基础上我们加入文字输出,看看效果。

在这个例子中,因为我们有两个建模的类型,分别是MOG2和KNN,所以我们也分别做了两个不同的输出文字,一个是随我们手势实时显示,一个是固定显示位置。

随手势实时显示

这个显示的原理就是,首先根据图像寻找轮廓,然后根据找到的轮廓获取它的外接矩形,最后在矩形的启点上输出文字。

固定位置显示

固定位置显示就非常简单了,我们直接在图像上输出文字即可。

完整代码

#include <iostream>
#include <opencv2/opencv.hpp>int main(int agrc, char** argv)
{cv::VideoCapture video;video.open("E:/KK_Movies/test3.mp4");if(!video.isOpened()){printf("could not read the video....");getchar();return -1;}cv::Mat frame;//定义一个开操作cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(3, 3), cv::Point(-1, -1));//创建高斯混合显示的Matcv::Mat bsmMOG2;cv::Ptr<cv::BackgroundSubtractor> pMOG2 = cv::createBackgroundSubtractorMOG2();//创建KNN显示的Matcv::Mat bsmKNN;cv::Ptr<cv::BackgroundSubtractor> pKNN =cv::createBackgroundSubtractorKNN();//创建寻找轮廓std::vector<std::vector<cv::Point>> contours;while (video.read(frame)){cv::resize(frame, frame, cv::Size(300, 600));imshow("srcvideo", frame);//运用高斯混合存放到bsmMOG2中pMOG2->apply(frame, bsmMOG2);//运用开操作去掉部分干扰cv::morphologyEx(bsmMOG2, bsmMOG2, cv::MORPH_OPEN, kernel);cv::resize(bsmMOG2, bsmMOG2, cv::Size(300, 600));//寻找轮廓cv::findContours(bsmMOG2, contours, CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);for (int i = 0; i < contours.size(); ++i){//判断轮廓大小,当大于1000时进入if(cv::contourArea(contours[i])>1000){//获取轮廓矩形cv::Rect rect=cv::boundingRect(contours[i]);//在矩形的左上角点输出文字cv::putText(bsmMOG2, "MOG2", cv::Point(rect.x,rect.y),CV_FONT_HERSHEY_PLAIN, 2, cv::Scalar(255, 255, 255));}}cv::imshow("MOG2", bsmMOG2);//运用KNN存放到bsmKNN中pKNN->apply(frame, bsmKNN);//运用开操作去掉KNN的干扰cv::morphologyEx(bsmKNN, bsmKNN, cv::MORPH_OPEN, kernel);cv::resize(bsmKNN, bsmKNN, cv::Size(300, 600));//输出的文字点固定在图像的50,100的点上cv::putText(bsmKNN, "KNN", cv::Point(50, 100),CV_FONT_HERSHEY_PLAIN, 2, cv::Scalar(255, 255, 255));cv::imshow("KNN", bsmKNN);char c = cvWaitKey(20);if(c==27){break;}}video.release();cvWaitKey(0);return 0;}

视频中的截图

-END-

Vaccae的往期经典


OpenCV

《C++ OpenCV案例实战---卡号获取》

《C++ OpenCV案例实战---卡片截取(附代码)》

《C++ OpenCV透视变换---切换手机正面图片》

《C++ OpenCV实战---获取数量》

《C++ OpenCV实战---利用颜色分割获取数量》


Android

《Android利用SurfaceView结合科大讯飞修改语音实别UI》

《Android关于语音识别的功能实现分析(一)---结构化思维》

《Android关于语音识别的功能实现分析(二)---语义解析》

《Android根据类生成签名字符串》

《Android碎片化布局fragment的实战应用》


.Net C#

《C#自定义特性(Attribute)讲解与实际应用》

《C#根据类生成签名字符串(附DEMO下载地址)》

《C++创建动态库C#调用》

《C#与三菱PLC(型号FX2N)串口通讯类》


数据库及其它

《Oracel存储过程写报表实战》

《Delphi轮播视频和图片程序(用于双屏显示程序)》

《SQL随机增加销售数据的脚本编写(附脚本下载地址)》


长按下方二维码关注微卡智享

C++ OpenCV视频操作之图像输出文字相关推荐

  1. openCV视频操作(C++版本)

    openCV视频操作(C++版本) VideoCapture类详解 opencv的视频操作主要用到 VideoCapture类,有三个构造函数: VideoCapture::VideoCapture( ...

  2. opencv 视频操作入门

    打开摄像头并捕获照片 要使用摄像头,需要使用cv2.VideoCapture(0)创建VideoCapture对象,参数0指的是摄像头的编号,如果你电脑上有两个摄像头的话,访问第2个摄像头就可以传入1 ...

  3. C++ OpenCV视频操作之CamShift跟踪算法

    前言 CamShift算法,全称是 Continuously AdaptiveMeanShift,顾名思义,它是对Mean Shift 算法的改进,能够自动调节搜索窗口大小来适应目标的大小,可以跟踪视 ...

  4. OpenCV 视频操作

    一.视频读写 1. 从文件中读取视频并播放 在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象,指定你要读取的视频文件: (1)创建读取视频的对象 cap = cv.Vide ...

  5. openCV视频处理与图像转换

    1.视频处理 视频中包含的信息要远远大于图片,对视频的分析也成为计算机视觉的主流,而本质上视频是由一帧帧的图像组成,所以视频处理最终还是要归结于图像处理,但在视频处理中,有更多的时间维的信息可以利用. ...

  6. 【opencv】(1) 基础操作:图像视频读取、图像截取、颜色通道

    主要内容有:图像及视频的读取和保存.图像显示.转换灰度图.图像截取.颜色通道提取和组合 那我们开始吧. 1. 图像操作 首先我们导入opencv库,彩色图像一般都是由RGB(红绿蓝)三颜色通道构成,灰 ...

  7. 【OpenCV】矩阵和图像的操作总结查询

     矩阵和图像操作 表3-3列出了一些操作矩阵图像的函数,其中的大部分对于图像处理非常有效.它们实现了图像处理中的基本操作,例如对角化.矩阵变换以及一些更复杂的诸如计算图像的统计操作.        ...

  8. OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))

    Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...

  9. OpenCV中视频操作及人脸识别案例

    目录 OpenCV中视频操作及人脸识别案例 视频操作 视频读写 从文件中读取视频并播放 保存视频 小结 视频追踪 meanshift Camshift 算法总结 小结 案例:人脸案例 人脸识别基础 实 ...

最新文章

  1. 企业的六种数据存储合规性策略
  2. 最古老的100个.com域名
  3. 深入浅出之-route命令实战使用指南
  4. 互联网基础知识_数字化工业网络—工业互联网的网络技术.pptx
  5. python爬取国内代理ip_Python语言爬取代理IP
  6. TTL转485电路设计
  7. assert函数的作用
  8. 异同点 模拟退火 遗传算法 邻域搜索_遗传算法与模拟退火算法比较
  9. 序列每天从0开始_序列化、反序列化原理和Protobuf实现机制
  10. NVIDIA驱动版本、Pytorch版本、Cuda版本三者之间对应的版本关系
  11. STM32驱动W25Q64读写数据
  12. 修改域名dns服务器地址,易名中国域名如何修改DNS设置方法
  13. 【Android】_干货_制作透明背景icon
  14. 【AUTOSAR】:功能安全(HSM与HOST的配置)
  15. Broken Necklace(USACO官方)
  16. 2021年度训练联盟热身训练赛第五场
  17. abaqus中英文切换
  18. ssm整合笔记(1)-curd
  19. 没有可用的软件包 mongodb,但是它被其它的软件包引用了。这可能意味着这个缺失的软件包可能已被废弃,或者只能在其他发布源中找到E: 软件包 mongodb 没有可安装候选
  20. 机器视觉相机镜头的选择

热门文章

  1. Revit二次开发之CAD线的翻模--梁的翻模
  2. ubuntu 18.04装ftp服务器+外网访问
  3. [Android6.0][RK3399] PWM Backlight 驱动分析
  4. jqgrid基于onSelectRow和onSelectAll实现选中行汇总合计
  5. ibm750服务器维护,IBM服务器IBM Power 750
  6. 金融量化分析基础知识
  7. python学习笔记连载
  8. 智能化市场「分层」开始,软硬「解耦」进入深水区
  9. 文储研习社第14期 | 区块链骗局避坑指南
  10. ps中图层放到顶层的快捷键是什么?