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));


  //创建高斯混合显示的Mat
  cv::Mat bsmMOG2;
  cv::Ptr<cv::BackgroundSubtractor> pMOG2 = 
    cv::createBackgroundSubtractorMOG2();


  //创建KNN显示的Mat
  cv::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随机增加销售数据的脚本编写(附脚本下载地址)


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

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值