opencv 颜色识别

#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); //创建一个视频cap,cap内为文件地址,为0时为摄像头


if (!cap.isOpened())  // if not success, exit program
{
cout << "Cannot open the web cam" << endl;
return -1;
}


namedWindow("Control", CV_WINDOW_AUTOSIZE); //创建窗口


int iLowH = 90;
int iHighH = 100;


int iLowS = 0; 


int iHighS = 255;


int iLowV = 255;
int iHighV = 255;


//创建控制条
cvCreateTrackbar("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;
//Mat M(7,7,CV_32FC2,Scalar(1,3));解释如下:创建一个M矩阵,7行7列,类型为CV_32F,C2表示有2个通道。
//Scalar(1,3)是对矩阵进行初始化赋值。第一个通道全为1,第2个通道全为3。


bool bSuccess = cap.read(imgOriginal); // read a new frame from video


if (!bSuccess) //if not success, break loop
{
cout << "Cannot read a frame from video stre2am" << endl;
break;
}


Mat imgHSV;
vector<Mat> hsvSplit;
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //颜色空间转换 BGR to HSV


//因为我们读取的是彩色图,直方图均衡化需要在HSV空间做
split(imgHSV, hsvSplit); //分离通道到hsvSplit(h s v)
equalizeHist(hsvSplit[2], hsvSplit[2]);//直方图均衡化,增加对比度,使亮的更亮,暗的更暗
merge(hsvSplit, imgHSV);//通道合成,将多个通道合成到一个mat中
Mat imgThresholded;
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); 
//检测imgHSV图像的每一个像素是不是在Scalar(iLowH, iLowS, iLowV)和Scalar(iHighH, iHighS, iHighV)之间,
//如果是,这个像素就设置为255,并保存在imgThresholded图像中,否则为0
//Scalar结构体是赋初值的,如Scalar(iLowH, iLowS, iLowV)则表示有三通道,第一个通道为iLowH,第二个通道为iLowS,第三个通道为iLowV


//开操作 (去除一些噪点)
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));//获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。
//MORPH_RECT, MORPH_ELLIPSE, MORPH_CROSS
morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);
//morphologyEx的内部实现都是调用腐蚀erode与膨胀dilate函数。


//闭操作 (连接一些连通域)
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);


imshow("Thresholded Image", imgThresholded); //showthe thresholded image
imshow("Original", imgOriginal); //show the original image


char key = (char)waitKey(30);
if (key == 27)
break;
}


return 0;


}

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之间。

Orange  0-22
Yellow 22- 38
Green 38-75
Blue 75-130
Violet 130-160
Red 160-179








  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值