#include<opencv2/opencv.hpp>
#include<iostream> using namespace cv;
using namespace std; Rect roi;
Mat frame, mask;
void processFrame(Mat &binary, Rect &rect); int main(int argc, char* argv) {
VideoCapture capture();//打开摄像头
if (!capture.isOpened()) {
printf("Could not find Video data..");
return -;
} Mat kernel1 = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -));
Mat kernel2 = getStructuringElement(MORPH_RECT, Size(, ), Point(-, -)); namedWindow("input_Video", CV_WINDOW_AUTOSIZE);
namedWindow("mask_Video", CV_WINDOW_AUTOSIZE);
while (capture.read(frame))//读取当前帧
{ inRange(frame, Scalar(, , ), Scalar(, , ), mask);//过滤得到Scalar1到Scalar2之间的图像 //形态学操作
morphologyEx(mask, mask, MORPH_OPEN, kernel1, Point(-, -));//开操作,去掉噪声
dilate(mask, mask, kernel2, Point(-, -), );//膨胀,填补空洞
imshow("mask_Video", mask); processFrame(mask, roi); // 轮廓发现与位置标定
rectangle(frame, roi, Scalar(, , ), , , );//画出外接矩形
imshow("input_Video", frame); char c = waitKey();//延时100ms
if (c == ) //等待“Esc”
{
break;
}
}
capture.release();//释放视频的内存
waitKey();
return ; } //binary:输入图像
//rect:返回的ROI区域
void processFrame(Mat &binary, Rect &rect) {
Point p, center;
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
//发现最外层轮廓
findContours(binary, contours, hireachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(, )); if (contours.size() > ) //判断是否有轮廓被找到
{
double maxArea = 0.0;
for (size_t t = ; t < contours.size(); t++) {
double area = contourArea(contours[static_cast<int>(t)]);//获取轮廓的面积
if (area > maxArea)//面积筛选,只画出最大的轮廓
{
maxArea = area;
rect = boundingRect(contours[static_cast<int>(t)]);//获取最小外界矩形 //计算并输出坐标
center.x = rect.x + cvRound(rect.width / 2.0);
center.y = rect.y + cvRound(rect.height / 2.0);
center.x = center.x - frame.cols / ;
center.y = center.y - frame.rows / ; cout << center.x << "," << center.y << endl;
}
} }
else {
rect.x = rect.y = rect.width = rect.height = ;
} }

 inRange()函数 :

此函数作用:可实现二值化功能(这点类似threshold()函数),更关键的是可以同时针对多通道进行操作,使用起来非常方便! 主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。

void inRange(InputArray src, InputArray lowerb,
InputArray upperb, OutputArray dst);

参数解释:

参数1:输入要处理的图像,可以为单通道或多通道。

参数2:包含下边界的数组或标量。

参数3:包含上边界数组或标量。

参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。

请注意:该函数输出的dst是一幅二值化之后的图像。

OpenCV (C++) 颜色跟随的更多相关文章

  1. OpenCV——视频颜色识别

    #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace c ...

  2. android——字体颜色跟随状态改变

    TextView的字体颜色也可以和ImageView的background一样,跟随状态发生改变.只需要自定义一下字体颜色.在color文件夹下面,新建一个颜色文件的xml. OK ,这就完成 了. ...

  3. opencv之颜色过滤只留下图片中的红色区域

    如图,这次需要在图片中找到卷尺的红色刻度,所以需要对图像做过滤,只留下红色部分. 一开始的想法是分别找到RGB值,然后找到红色区域的部分保留就可以了,不过好像很难确定红色区域的RGB取值范围,所以要把 ...

  4. opencv::基于颜色跟踪检测

    基于颜色跟踪 inRange过滤 形态学操作提取 轮廓查找 外接矩形获取 位置标定

  5. OpenCV随机颜色,用于画图调试

    static Scalar randomColor(int64 seed) { RNG rng(seed); int icolor = (unsigned)rng; return Scalar(ico ...

  6. opencv颜色识别代码分享

    android 平台 opencv 实现颜色识别代码:http://www.eyesourcecode.com/thread-40682-1-1.htmlopencv的颜色识别简单实现的代码:http ...

  7. 【Windows 10 应用开发】跟随系统主题颜色

    有些时候,希望应用程序中的某些颜色可以与系统的主题颜色相同,并且当系统主题色改变时进行同步. 实现过程并不复杂,主要用到 UISettings 类,它公开一个 GetColorValue 方法,访问这 ...

  8. OpenCV成长之路(3):模仿PhotoShop中魔术棒工具

    本文的主题实际上是图像的颜色空间的转换,借助一个颜色选取程序来说明OpenCV中颜色转换函数的用法以及一些注意事项. 一.几种常见的颜色空间: RGB颜色空间:RGB采用加法混色法,因为它是描述各种“ ...

  9. 批量分割视频opencv

    前言 视频处理过程中,会用到对等长的视频进行处理,此时要对大视频进行分割. 实现步骤 1.批量读取视频集: 2.视频分割: 测试代码 1.批量读取视频集: /********************* ...

随机推荐

  1. 【高并发解决方案】7、一致性hash解读

       一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 ...

  2. 项目开发版本控制----Git

    版本控制的工具我早之前用的svn,后来换成了git.同样是版本控制,为什么要换呢?肯定是有原因的啦~ 一.Git和SVN的比较 svn的优缺点 优点: 1.管理方便,逻辑明确,符合一般人思维习惯. 2 ...

  3. thinkphp链接多个数据库时怎么调用M方法?

    老项目tp3.1.3,有N个数据库,thinkphp好久没用了,不知道怎么用M方法了,代码测验成功! 数据库名称: 2.直接上代码 $custom = M('base','branch_','shop ...

  4. 关于wsgi协议的理解

    基础概念 首先要了解 WSGI 规范的概念,WSGI(Web Server Gateway Interface)规范描述了web server(Gunicorn,uWSGI等)如何与web appli ...

  5. 【读书笔记】iOS-iOS视频

    视频多媒体文件主要是存放视频数据信息,视频数据量要远远大于音频数据文件,而且视频编码和解码算法非常复杂,因此早期的计算机由于CPU处理能力差,要采用视频解压卡硬件支持,视频采集和压缩也要采用硬件卡.按 ...

  6. 使用fiddle处理跨域

    认真的用fiddle处理跨域 相信很多前端的同学都或多或少被跨域这个问题烦恼过,网上很多处理的方式其实都是要后端处理, 用fiddle来处理 ,就不必看后端的脸色了,自己安安心心的倒腾接口,何乐而不为 ...

  7. linux上用newman+postman进行自动化测试

    第一步:导出postman文件 Postman就是根据collection和enviroment这两个json文件来自动化运行的! 所以从Postman中导出collection和enviroment ...

  8. [IDEA] IntelliJ IDEA 安装教程

    原文地址:https://www.cnblogs.com/memento/p/9147477.html 下载地址:https://www.jetbrains.com/idea/ 本文以 64 位的 U ...

  9. SQL Server 2012 读写分离设置 - AlsoIn

    原文转至:http://www.tuicool.com/articles/a6rmiam/ 引用: http://technet.microsoft.com/zh-cn/library/jj16176 ...

  10. 安装office2010提示要安装MSXML6.10.1129.0解决方法

    系统win7 32位 安装office2010出现了错误,提示要安装MSXML6.10.1129.0解决方法 1.下载MSXML6.10.1129.0进行安装 2.若本机已安装过不管用: a.在运行里 ...