OpenCV色彩识别
彩色模型
数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。
HSV模型
HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
- 色调(H:hue):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
- 饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。
- 亮度(V:value):取值范围为0(黑色)~255(白色)。
RGB转HSV
设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者。设 min 等于这些值中的最小者。要找到在 HSV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度,计算为:
max=max(R,G,B)min=min(R,G,B)if R = max, H = (G-B)/(max-min)if G = max, H = 2 + (B-R)/(max-min)if B = max, H = 4 + (R-G)/(max-min)H = H * 60if H < 0, H = H + 360V=max(R,G,B)S=(max-min)/max
OpenCV下有个函数可以直接将RGB模型转换为HSV模型,注意的是OpenCV中H∈ [0, 180), S ∈ [0, 255], V ∈ [0, 255]。我们知道H分量基本能表示一个物体的颜色,但是S和V的取值也要在一定范围内,因为S代表的是H所表示的那个颜色和白色的混合程度,也就说S越小,颜色越发白,也就是越浅;V代表的是H所表示的那个颜色和黑色的混合程度,也就说V越小,颜色越发黑。经过实验,识别蓝色的取值是 H在100到140,S和V都在90到255之间。一些基本的颜色H的取值可以如下设置:
Orange 0-22Yellow 22- 38Green 38-75Blue 75-130Violet 130-160Red 160-179
OpenCV实现
首先我们读取一张图片或从视频读取一帧图像,用下面的函数转为HSV模型。
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);
然后我们对彩色图像做直方图均衡化
//因为我们读取的是彩色图,直方图均衡化需要在HSV空间做split(imgHSV, hsvSplit);equalizeHist(hsvSplit[2],hsvSplit[2]);merge(hsvSplit,imgHSV);
接着就是进行颜色检测,我们用void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);函数进行颜色检测,这个函数的作用就是检测src图像的每一个像素是不是在lowerb和upperb之间,如果是,这个像素就设置为255,并保存在dst图像中,否则为0。
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image
通过上面的函数我们就可以得到目标颜色的二值图像,接着我们先对二值图像进行开操作,删除一些零零星星的噪点,再使用闭操作,连接一些连通域,也就是删除一些目标区域的白色的洞。
//开操作 (去除一些噪点)Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);//闭操作 (连接一些连通域)morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
整个代码实现
#include <iostream>#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"using namespace cv;using namespace std;int main( int argc, char** argv ){VideoCapture cap(0); //capture the video from web camif ( !cap.isOpened() ) // if not success, exit program{cout << "Cannot open the web cam" << endl;return -1;}namedWindow("Control", CV_WINDOW_AUTOSIZE); //create a window called "Control"int iLowH = 100;int iHighH = 140;int iLowS = 90;int iHighS = 255;int iLowV = 90;int iHighV = 255;//Create trackbars in "Control" windowcvCreateTrackbar("LowH", "Control", &iLowH, 179); //Hue (0 - 179)cvCreateTrackbar("HighH", "Control", &iHighH, 179);cvCreateTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255)cvCreateTrackbar("HighS", "Control", &iHighS, 255);cvCreateTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255)cvCreateTrackbar("HighV", "Control", &iHighV, 255);while (true){Mat imgOriginal;bool bSuccess = cap.read(imgOriginal); // read a new frame from videoif (!bSuccess) //if not success, break loop{cout << "Cannot read a frame from video stream" << endl;break;}Mat imgHSV;vector<Mat> hsvSplit;cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV//因为我们读取的是彩色图,直方图均衡化需要在HSV空间做split(imgHSV, hsvSplit);equalizeHist(hsvSplit[2],hsvSplit[2]);merge(hsvSplit,imgHSV);Mat imgThresholded;inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image//开操作 (去除一些噪点)Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);//闭操作 (连接一些连通域)morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);imshow("Thresholded Image", imgThresholded); //show the thresholded imageimshow("Original", imgOriginal); //show the original imagechar key = (char) waitKey(300);if(key == 27)break;}return 0;
}
实验结果图:
颜色识别的应用
经典的颜色识别的经典应用就是车牌定位了,因为中国的车牌无非就是蓝色和黄色,还有就是交通标志定位也是个应用。比如下面两张图片,有很明显的颜色区分。
OpenCV色彩识别相关推荐
- opencv车牌识别入门资料汇总
使用OpenCV和C++实现的车牌识别系统. http://download.csdn.net/detail/u014743238/7204477 使用VC++6.0做开发工具, 采用简单的SDI框架 ...
- opencv 全志_移植opencv人脸识别到全志A10开发板上 +linux3.0内核
移植opencv人脸识别 libz: zlib-1.2.3 libjpeg: jpegsrc.v6b libpng: libpng-1.2.18 libyasm: yasm-0.7. ...
- OpenCV字母识别letter recognition的实例(附完整代码)
OpenCV字母识别letter recognition的实例 OpenCV字母识别letter recognition的实例 OpenCV字母识别letter recognition的实例 #inc ...
- OpenCV条形码识别
OpenCV条形码识别 条形码识别 目标 基本 EAN 13 条码检测器 初始化 探测 解码 结果 原始图片 detectAndDecode的结果 条形码识别 目标 在这一章当中, 我们将熟悉Open ...
- python人脸照片分类_Python OpenCV 人脸识别(一)
前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...
- opencv +数字识别
现在很多场景需要使用的数字识别,比如银行卡识别,以及车牌识别等,在AI领域有很多图像识别算法,大多是居于opencv 或者谷歌开源的tesseract 识别. 由于公司业务需要,需要开发一个客户端程序 ...
- android opencv 银行卡识别,NDK 开发之使用 OpenCV 实现银行卡号识别
前言 在日常的开发中,我们有时会遇到添加银行卡的需求,这时候,产品可能会让你仿一下支付宝之类的相机扫描识别银行卡号.很多时候,做这样的需求会去找找稳定的第三方,本文通过 OpenCV 结合识别的需求带 ...
- OpenCv色彩通道分离与融合
OpenCv色彩通道分离与融合 1.函数介绍 split–分离 merge-融合 2.代码 import numpy as npimport cv2image=cv2.imread('cat1.jpg ...
- OpenCV - 汽车识别
一:参考博客 opencv 环境搭建:https://blog.csdn.net/qq_33508087/article/details/83310357 opencv手掌识别:https://blo ...
最新文章
- java精确测量文本高度_Android精确测量文本宽高及基线位置的方法
- 字符指针+结构体排序(后缀子串排序)
- [NOIP2001] 提高组 洛谷P1024 一元三次方程求解
- 课时20:内嵌函数和闭包
- html怎么让图片在左侧文字在右边,网页设计 怎么让图片在左 文字在右
- 555定时器+74系列芯片搭建八路抢答器,30s倒计时,附Proteus仿真等
- 小学身高体重测试软件,儿童身高体重在线测评
- 一元函数积分学基本计算例题
- 论文参考文献尾注引用方法
- HANA中临时表查询DUMMY
- 安卓修改软件安装时间_[地质勘察]理正工程地质勘察CAD9.0PB3软件安装教程
- golang 实现微信授权
- Oracle数据库PL/SQL块-存储函数和过程
- upupoo启动不了 mysql_【upupoo动态桌面壁纸和MySQL API 中文手册哪个好用】upupoo动态桌面壁纸和MySQL API 中文手册对比-ZOL下载...
- 比较TTL集成电路与CMOS集成电路
- SQL SERVER 对象被BLOCK跟踪
- C语言经典例题及答案3
- Oculus Rift S 399美元,真香
- 转载天涯一高人:理解黑话
- 【翻译】Adventuring to Spur Creativity at Work【通过探险激发工作中的创造力】