C++ OpenCV视频操作之图像输出文字
前言
当我们视频分析时可能图像中需要有一个文字说明,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视频操作之图像输出文字相关推荐
- openCV视频操作(C++版本)
openCV视频操作(C++版本) VideoCapture类详解 opencv的视频操作主要用到 VideoCapture类,有三个构造函数: VideoCapture::VideoCapture( ...
- opencv 视频操作入门
打开摄像头并捕获照片 要使用摄像头,需要使用cv2.VideoCapture(0)创建VideoCapture对象,参数0指的是摄像头的编号,如果你电脑上有两个摄像头的话,访问第2个摄像头就可以传入1 ...
- C++ OpenCV视频操作之CamShift跟踪算法
前言 CamShift算法,全称是 Continuously AdaptiveMeanShift,顾名思义,它是对Mean Shift 算法的改进,能够自动调节搜索窗口大小来适应目标的大小,可以跟踪视 ...
- OpenCV 视频操作
一.视频读写 1. 从文件中读取视频并播放 在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象,指定你要读取的视频文件: (1)创建读取视频的对象 cap = cv.Vide ...
- openCV视频处理与图像转换
1.视频处理 视频中包含的信息要远远大于图片,对视频的分析也成为计算机视觉的主流,而本质上视频是由一帧帧的图像组成,所以视频处理最终还是要归结于图像处理,但在视频处理中,有更多的时间维的信息可以利用. ...
- 【opencv】(1) 基础操作:图像视频读取、图像截取、颜色通道
主要内容有:图像及视频的读取和保存.图像显示.转换灰度图.图像截取.颜色通道提取和组合 那我们开始吧. 1. 图像操作 首先我们导入opencv库,彩色图像一般都是由RGB(红绿蓝)三颜色通道构成,灰 ...
- 【OpenCV】矩阵和图像的操作总结查询
矩阵和图像操作 表3-3列出了一些操作矩阵图像的函数,其中的大部分对于图像处理非常有效.它们实现了图像处理中的基本操作,例如对角化.矩阵变换以及一些更复杂的诸如计算图像的统计操作. ...
- OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))
Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机.扫描仪.CT或者磁共振成像.无论哪种方法,我们(人类)看到的是图像,而让数字设备来"看"的时候,则 ...
- OpenCV中视频操作及人脸识别案例
目录 OpenCV中视频操作及人脸识别案例 视频操作 视频读写 从文件中读取视频并播放 保存视频 小结 视频追踪 meanshift Camshift 算法总结 小结 案例:人脸案例 人脸识别基础 实 ...
最新文章
- 企业的六种数据存储合规性策略
- 最古老的100个.com域名
- 深入浅出之-route命令实战使用指南
- 互联网基础知识_数字化工业网络—工业互联网的网络技术.pptx
- python爬取国内代理ip_Python语言爬取代理IP
- TTL转485电路设计
- assert函数的作用
- 异同点 模拟退火 遗传算法 邻域搜索_遗传算法与模拟退火算法比较
- 序列每天从0开始_序列化、反序列化原理和Protobuf实现机制
- NVIDIA驱动版本、Pytorch版本、Cuda版本三者之间对应的版本关系
- STM32驱动W25Q64读写数据
- 修改域名dns服务器地址,易名中国域名如何修改DNS设置方法
- 【Android】_干货_制作透明背景icon
- 【AUTOSAR】:功能安全(HSM与HOST的配置)
- Broken Necklace(USACO官方)
- 2021年度训练联盟热身训练赛第五场
- abaqus中英文切换
- ssm整合笔记(1)-curd
- 没有可用的软件包 mongodb,但是它被其它的软件包引用了。这可能意味着这个缺失的软件包可能已被废弃,或者只能在其他发布源中找到E: 软件包 mongodb 没有可安装候选
- 机器视觉相机镜头的选择
热门文章
- Revit二次开发之CAD线的翻模--梁的翻模
- ubuntu 18.04装ftp服务器+外网访问
- [Android6.0][RK3399] PWM Backlight 驱动分析
- jqgrid基于onSelectRow和onSelectAll实现选中行汇总合计
- ibm750服务器维护,IBM服务器IBM Power 750
- 金融量化分析基础知识
- python学习笔记连载
- 智能化市场「分层」开始,软硬「解耦」进入深水区
- 文储研习社第14期 | 区块链骗局避坑指南
- ps中图层放到顶层的快捷键是什么?