前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ OpenCV视频操作之图像输出文字

C++ OpenCV视频操作之图像输出文字

作者头像
Vaccae
发布2019-07-25 11:29:38
4K0
发布2019-07-25 11:29:38
举报
文章被收录于专栏:微卡智享微卡智享

前言

当我们视频分析时可能图像中需要有一个文字说明,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,所以我们也分别做了两个不同的输出文字,一个是随我们手势实时显示,一个是固定显示位置。

随手势实时显示

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

固定位置显示

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

完整代码

代码语言:javascript
复制
#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-

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档