1、概述
案例:基于颜色来实现视频对象的跟踪,本案例跟踪的是一个橙子。
使用到的关键方法:hsv+inRange,区间内白色不再区间内黑色
实现该算法的步骤:
1.创建VideoCapture
2.使用其open方法打开视频
3.while循环读取视频帧frame
4.将frame转hsv色彩空间
5.根据hsv色彩空间提取橙子的颜色区间,并生成colorMask
6.对colorMask做形态学开操作(为了取出多余的白色噪点)
7.对colorMask做腐蚀操作(为了让橙子区域更加圆润)
8.使用findContours执行轮廓查找
9.过滤出出每一个colorMask中的最大轮廓,并找出最大轮廓的外接矩形(roiRect)
10.将roiRect绘制到frame上查看效果
11.完成
2、代码示例
VideoCapture capture;
capture.open(filePath);
if(!capture.isOpened()){
qDebug()<<"无法打开视频";
return;
}
Mat frame,hsv;
Mat colorMask;
Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));
while(capture.read(frame)){
cvtColor(frame,hsv,COLOR_BGR2HSV);
inRange(hsv,Scalar(11, 43, 46),Scalar(25, 255, 255),colorMask);
//使用形态学开操作消除白点
morphologyEx(colorMask,colorMask,MORPH_OPEN,kernel,Point(-1,-1),1);
//使用形态学膨胀操作填充白色区间
dilate(colorMask,colorMask,kernel,Point(-1,-1),1);
//轮廓发现
vector<vector<Point>> contours;
vector<Vec4i> hir;
Rect roi;
findContours(colorMask,contours,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
if(contours.size()>0){
//过滤轮廓
double maxArea = 0.0;
for(size_t i = 0;i<contours.size();i++){
double area = contourArea(contours[i]);
if(area>maxArea){
maxArea = area;
roi = boundingRect(contours[i]);
}
}
}
//在原图上绘制轮廓
rectangle(frame,roi,Scalar(0,0,255),3,LINE_8);
imshow("frame",frame);
imshow("colorMask",colorMask);
int key = waitKey(100);
qDebug()<<"key:"<<key;
if(key==27){//ese键
break;
}
}
capture.release();
3、演示图像
(视频就不传了,大家随便找个橙子然后移动橙子用相机拍照一段时间做测试就行,用手机拍摄就行)
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓