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