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

2019-07-25 11:29:38 浏览数 (1)

前言

当我们视频分析时可能图像中需要有一个文字说明,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-

0 人点赞