视频中的颜色识别——opencv实现
颜色识别的原理
opencv中的颜色模型
RGB
RGB具有三个通道其,分别表示红色通道®,绿色通道(G),蓝色通道(B),3个通道在opencv中的取值均为0~255,它的颜色由3个通道的取值来共同决定,因此如果使用RGB图像来进行颜色的识别,会丢失很多的颜色。
HSV
HSV具有三个通道,其分别表示色调(H),饱和度(S),亮度(V),3个通道在opencv中的取值分别如下:
- H:0~180
- S:0~255
- V:0~255
其中H通道和S通道决定了颜色,V通道决定亮度
各种颜色对应的三个通道的取值表如下:
因此通过限制HSV通道中相对应的数值,就可以识别出对应的颜色
颜色识别的实现(c++)
- 读取摄像头的实时画面
VideoCapture capture(1);//0为电脑本身摄像头,1位外置摄像头
- 读取摄像头的当前一帧的数据并转换到HSV空间
capture >> frame; //读取当前帧 cvtColor(frame, imgHSV, COLOR_BGR2HSV);
- 对HSV图像进行直方图均衡化
在此处使用直方图均衡化是因为可以使用这种方法可以使原来比较少像素的灰度会被分配到别的灰度去,像素相对集中, 处理后灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。split(imgHSV,temporary); equalizeHist(temporary[2], temporary[2]); merge(temporary, imgHSV); //将HSV图像分割通道,并且做直方图的均衡化
使用equalizeHist()函数,其输入必须是单通道的,因此使用split函数将得到的HSV图像分割为三个通道之后,在进行直方图均衡化,然后再使用merge函数来合并三个通道。
此处仅对V通道进行了直方图均衡化,因为通过比对发现只对V通道进行效果最好,具体的原因还不清楚。 - 将直方图均衡化之后,使用inRange()函数来进行图像的识别
inRange(imgHSV, Scalar(H_W_L, S_W_L, V_W_L), Scalar(H_W_H, S_W_H, V_W_H), image);
其中H_W_L,H_W_L, S_W_L, V_W_L. . . 等数值分别为前面表格对应的颜色值的最小值和最大值。
此函数是将在范围内的像素值为255,其与为0,反映到图像上就是,选中的颜色为白色,其与的均为黑色。
操作到此颜色可以进行识别,但是效果可能不会很好,因此可以再使用开操作来消除噪点,去掉小的干扰快,再使用闭操作来填充闭合区域。 - 开操作
kernel = getStructuringElement(MORPH_RECT, Size(3, 3));//3*3的矩形卷积核,只要是奇数的都可以 morphologyEx(image,image,2,kernel);
- 闭操作
morphologyEx(image,image,3,kernel);
源代码
#include <opencv2\opencv.hpp> using namespace cv;
using namespace std;int main()
{Mat frame,imgHSV,image,kernel;vector<Mat>temporary;int H_W_L = 0, H_W_H = 180;int S_W_L = 0, S_W_H = 30;int V_W_L = 221, V_W_H = 255;VideoCapture capture(1);//读取视摄像头实时画面数据,0默认是笔记本的摄像头;如果是外接摄像头,这里改为1while (true){capture >> frame; //读取当前帧if (!frame.empty()){ //判断输入的视频帧是否为空的cvtColor(frame, imgHSV, COLOR_BGR2HSV);//threshold(gray, two_value, 125, 255, THRESH_BINARY);//二值图像split(imgHSV,temporary);equalizeHist(temporary[2], temporary[2]);/*equalizeHist(temporary[1], temporary[1]);equalizeHist(temporary[0], temporary[0]);*/merge(temporary, imgHSV); //将HSV图像分割通道,并且做直方图的均衡化inRange(imgHSV, Scalar(H_W_L, S_W_L, V_W_L), Scalar(H_W_H, S_W_H, V_W_H), image);kernel = getStructuringElement(MORPH_RECT, Size(3, 3));morphologyEx(image,image,2,kernel);morphologyEx(image,image,3,kernel);imshow("直方图", imgHSV);imshow("原图",frame);imshow("window", image); //在window窗口显示frame摄像头数据画面}if (waitKey(20) == 'q') //延时20ms,获取用户是否按键的情况,如果按下q,会推出程序 break;}capture.release(); //释放摄像头资源destroyAllWindows(); //释放全部窗口return 0;
}
##结果
视频中的颜色识别——opencv实现相关推荐
- python红色的颜色表达式_50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)...
目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...
- 50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...
- Python+OpenCV教程5:颜色空间转换 追踪视频中特定颜色的物体 消除票据中的红色印章
目标 颜色空间转换,如BGR↔Gray,BGR↔HSV等 追踪视频中特定颜色的物体 OpenCV函数:cv2.cvtColor(),cv2.inRange() 消除票据中的红色印章 教程 颜色空间转换 ...
- Python 计算机视觉(十六)—— 图像和视频中的人脸识别
参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起 ...
- 基于BP神经网络+HOG特征提取的视频中车辆车牌识别算法仿真
步骤一:定位和跟踪 这里,没有直接采用之前的方案,是因为在设计的时候,发现直接采用颜色等直接特征提取然后进行二值化处理的方法,如果视频中出现颜色类似的区域,则很有可能错误的定位,例如在公交车中车牌区域 ...
- 颜色识别opencv+trackbar调节目标颜色hsv的阈值
颜色识别opencv+trackbar调节目标颜色hsv的阈值 颜色识别,trackbar调节颜色阈值 #include <iostream> #include "opencv2 ...
- HyperLPR 对图片和视频中车牌的识别
一.概要 在上一篇文章中,主要介绍了HyperLPR开源车牌识别系统的配置和使用(链接:https://blog.csdn.net/oJiWuXuan/article/details/10733266 ...
- 人脸识别(四)视频中的人物识别
功能: 对视频中的演员进行识别标注 需要先建立演员的人脸编码库,才能识别出来额 # 视频中的人脸标注 #合照中的人脸标注 import numpy as np import cv2 import fa ...
- android opencv颜色识别,opencv学习(2)-简单颜色识别并跟踪
本次来我们用opencv来实现识别跟踪蓝色物体并返回位置坐标的功能. 该功能分为两部分,识别颜色,跟踪颜色. 要想实现颜色的识别,我们要打开摄像头,读取捕获的图像.将图像的颜色通道转化为HSV,设置选 ...
最新文章
- 2021-2027年中国室内定位市场研究及前瞻分析报告
- pandas 增加列
- Pandas基础复习-DataFrame
- 计划策略-20-订货型生产
- 【实战】MATLAB+神经网络+MNIST
- 2.监控软件zabbix-客户端安装
- 白话科普,10s 了解 API
- apriori算法代码_sklearn(九)apriori 关联规则算法,以及FP-growth 算法
- [转载] Java Formatter toString()方法与示例
- 慕课python第六周测验答案_中国大学慕课答案第八单元测试答案_Python语言程序设计考试测验答案...
- java 中括号中的语句,Java中是使用大括号括起来的语句块,用于完成一个相对独立的逻辑功能,这种语句被称作()。...
- 如何在win10搜索计算机,如何在win10电脑的任务栏搜索框中添加地址?
- sap代加工流程图_委外加工_SAP的两种典型委外处理方法
- 给随便一个字符串加单位
- mysql 从多个表中删除行,MySQL从多个表中删除行
- HTML 3d立体旋转相册
- 台湾--身份证(本国人)正则表达式
- 愚见——工大之软件工程
- Leetcode 组合总和II
- firewall-cmd --permanent --get-zone-of-interface=ens33显示no zone
热门文章
- Android使用Annotations注解优化代码
- 阿里云smtp 发邮件配置
- 第一次做topcoder
- iOS开发-植入广告(iAd, Admob实例)
- 标准化体系建设(下):如何建立基础架构标准化及服务化体系?
- Pipeline shell step aborts with -1 : Jenkins-48300
- python人工智能编程教程-清华大学出版社-图书详情-《人工智能基础教程:Python篇(青少版)》...
- Android开发杂草园
- javaSE类与对象(上篇)
- 网站评论系统的开源插件的使用