OpenCV 颜色追踪的示例代码
作者:Laniakea 发布时间:2023-01-19 05:20:31
标签:OpenCV,颜色追踪
FPS 每秒帧数
背景消除建模 BSM
Background SUbtraction
BS算法
图像分割(GMM-高斯混合模型)
机器学习(KNN-K临近)
#include <opencv2/core/utility.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include<opencv2/opencv.hpp>
#include <iostream>
#include <cstring>
using namespace std;
using namespace cv;
int main(){
VideoCapture cap;
cap.open("/media/laniakea/新加卷/ubuntu/board/train1.mp4");
if(!cap.isOpened()){
cout<<"no video";
return -1;
}
Mat frame;
Mat idontknoew;
namedWindow("input",CV_WINDOW_AUTOSIZE);
namedWindow("MOG2",CV_WINDOW_AUTOSIZE);
Ptr<BackgroundSubtractor> pMOG2 = createBackgroundSubtractorMOG2();
while (cap.read(frame))
{
imshow("input",frame);
pMOG2->apply(frame,idontknoew);
imshow("MOG2",idontknoew);
char c = waitKey(100);
if(c == 27){
break;
}
}
cap.release();
waitKey(0);
return 0;
}
一般应用于背景静止状态
基于颜色的对象跟踪
颜色范围过滤
标注与测量
颜色过滤
inRange过滤
形态学操作提取
轮廓查找
外界矩形获取
位置标定
#include<opencv2/opencv.hpp>
#include <iostream>
#include <string.h>
using namespace std;
using namespace cv;
Rect roi;
void processFrame(Mat &binary, Rect &rect)
{
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(binary,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point(0,0));
if (contours.size() > 0){
double maxArea = 0.0;
for (size_t t = 0; t < contours.size(); t++){
double area = contourArea(contours[static_cast<int>(t)]);//最大外接矩形
if (area > maxArea){
maxArea = area;
rect = boundingRect(contours[static_cast<int>(t)]);
}
}
}
else {
rect.x = rect.y = rect.width = rect.height = 0;
}
}
int main(){
VideoCapture cap;
cap.open("/media/laniakea/新加卷/ubuntu/board/train1.mp4");
if(!cap.isOpened()){
cout<<"no file to open \n";
return -1;
}
Mat frame,mask;
namedWindow("input",CV_WINDOW_AUTOSIZE);
namedWindow("mask",CV_WINDOW_AUTOSIZE);
Mat kernel1 = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));//(-1,-1) 默认中心位置
Mat kernel2 = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
while (cap.read(frame)){
inRange(frame,Scalar(0,0,107),Scalar(90,90,255),mask);
//2 形态学操作提取
morphologyEx(mask, mask, MORPH_OPEN, kernel1, Point(-1, -1), 1); // 开操作
//3 轮廓查找
dilate(mask, mask, kernel2, Point(-1, -1), 4);// 膨胀
imshow("mask",mask);
processFrame(mask,roi);
rectangle(frame,roi,Scalar(0,255,0),3,8,0);
//roi就是矩形
Point p = Point(roi.tl().x,roi.tl().y);
String s = to_string(roi.tl().x) + " ," + to_string(roi.tl().y);
putText(frame,s,p,FONT_HERSHEY_TRIPLEX,0.8,Scalar(255,0,0),2,CV_AA);
imshow("input",frame);
char c = waitKey(100);
if(c==27){
break;
}
}
cap.release();
waitKey(0);
return 0;
}
来源:https://segmentfault.com/a/1190000021583872
0
投稿
猜你喜欢
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 最近“全网域(Web Scale)”一词被炒得火热,人们也正在通过扩展他们的应用程序架构来使他们的系统变得更加“全网域”。但是究竟什么是全网
- 经过上一篇的介绍,相信小伙伴们已经按奈不住内心对springboot的向往,本篇我将继续向小伙伴介绍springboot配置文件的配置,已经
- 首先我们发现现在我们所用的android智能手机大部分都有当你在打电话时按power键来挂断电话,一般都是在设置中。 我主要是在原生源码中添
- 1、Java序列化与反序列化是什么?Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象
- G1 – Garbage First(垃圾优先算法)G1最主要的设计目标是: 将STW停顿的时间和分布变成可预期以及可配
- 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统对于资源有限的公司来说显然不太明智,国内已经有多家成熟的移动支付提供商
- 这篇文章主要介绍了SpringBoot使用Log4j过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 带你手把手,用 java swing实现抖音上的表白程序1.准备工作a.需要下载一个带着swing插件的eclipseb.需要配置好JDKc
- 前言最近在知乎上面看到一篇关于程序员面试的问题,面试官问我们一般有几种注入的方法,这几种注入的方法分别在什么时候运用比合理,当时我看到这个时
- 本文实例讲述了Java Web实现session过期后自动跳转到登陆页功能。分享给大家供大家参考,具体如下:通过过滤器的方式实现 sessi
- 原理解析:利用RandomAccessFile在本地创建一个随机访问文件,文件大小和服务器要下载的文件大小相同。 根据线程的数量(假设有三个
- Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式什么是Java线程同步
- 在使用springmvc的时候,后台@RequestBody接受的是一个json格式的字符串,一定是一个字符串。我们可以通过@Request
- PostMapping接收json参数后返回404问题描述js中传递json数据给后端,后端可以正常接收参数,但返回404。js
- 一、环境说明集群环境至少需要3个节点(也就是3台服务器设备):1个Master,2个Slave,节点之间局域网连接,可以相互ping通,下面
- <dependency> <groupId>org.projectlombok</g
- 需求:应用A(通常有多个)和应用B(1个)进行 socket通讯,应用A必须知道应用B的ip地址(在应用A的配置文件中写死的),这个时候就必
- 其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿。那么怎么让子线程去做主线程的事儿呢,
- Android EditText限制输入字符的方法总结最近项目要求限制密码输入的字符类型, 例如不能输入中文。 &nb