【Opencv图像处理】BGB转HSV与颜色检测

什么是HSV色彩空间?

HSV(色相、饱和度、值,也称为 HSB [色相、饱和度、亮度])是 RGB(红-绿-蓝)颜色模型的替代表示形式。它由计算机图形研究人员在20世纪70年代创建,旨在与我们的人类视觉解释颜色属性的方式更紧密地匹配。在这里插入图片描述
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
亮度V(I:明度)
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
在HSV颜色空间中颜色分量Hue对应不同颜色的灰度范围如下:
在这里插入图片描述 我们可以根据物体Hue分量的颜色类别来判断灰度范围,反过来,也可以根据Hue分量的灰度范围来判断物体的颜色种类。

Opencv代码

静态图片颜色检测

使用HSV色彩空间从图像和视频进行物体检测
我们有一个可调节的HSV掩码("设置掩码"窗口),该窗口遮罩原始图像并生成生成的遮罩图像。

void main()
{
    auto hmin = 0, smin = 0, vmin = 0;
    auto hmax = 0, smax = 0, vmax = 0;

    string path = "D:\\QT\\Opencv\\Resources\\shapes.png";  //"D:\QT\Opencv\Resources\cards.png"
    Mat img = cv::imread(path);
    Mat imgHSV, mask;
    cvtColor(img, imgHSV, COLOR_BGR2HSV);//将BGR转换到HSV空间
    namedWindow("Trackbars", (640, 200));

   //运行时,把3个min的都移到最小值,把3个max的都移到最大值,然后移动使其保持为白色
    createTrackbar("Hue Min", "Trackbars", &hmin, 179);
    createTrackbar("Hue Max", "Trackbars", &hmax, 179);
    createTrackbar("Sat Min", "Trackbars", &smin, 255);
    createTrackbar("Sat Max", "Trackbars", &smax, 255);
    createTrackbar("Val Min", "Trackbars", &vmin, 255);
    createTrackbar("Val Max", "Trackbars", &vmax, 255);
    //对于hue色相饱和度最大180,对于另外两个色相饱和度最大255
    while (true)
    {
       //检查数组元素是否位于其他两个数组的元素之间。
       //imgHSV为输入图像,mask为输出图像
        Scalar lower(hmin, smin, vmin);
        Scalar upper(hmax, smax, vmax);
        inRange(imgHSV, lower, upper, mask);
        //定义颜色下限和上限,因为由于照明和不同的阴影,颜色的值将不完全相同,会是一个值的范围

        imshow("Image", img);
        imshow("Image HSV", imgHSV);
        imshow("Image mask", mask);
       waitKey(1);
    }
    waitKey(0);
}

结果展示

原图
在这里插入图片描述
HSV空间
在这里插入图片描述
蓝色对应的HSV范围
在这里插入图片描述

在这里插入图片描述

视频颜色检测

void video_colorDection(){
    auto hmin = 0, smin = 0, vmin = 0;
    auto hmax = 0, smax = 0, vmax = 0;

    cv::VideoCapture cap(0);//打开电脑摄像机

    namedWindow("Trackbars", (640, 200));

    //运行时,把3个min的都移到最小值,把3个max的都移到最大值,然后移动使其保持为白色
    createTrackbar("Hue Min", "Trackbars", &hmin, 179);
    createTrackbar("Hue Max", "Trackbars", &hmax, 179);
    createTrackbar("Sat Min", "Trackbars", &smin, 255);
    createTrackbar("Sat Max", "Trackbars", &smax, 255);
    createTrackbar("Val Min", "Trackbars", &vmin, 255);
    createTrackbar("Val Max", "Trackbars", &vmax, 255);
    //对于hue色相饱和度最大180,对于另外两个色相饱和度最大255
    while(true){
        Mat imgHSV, mask, img;
        cap.read(img);
        cvtColor(img, imgHSV, COLOR_BGR2HSV);//将BGR转换到HSV空间

        //检查数组元素是否位于其他两个数组的元素之间。
        //imgHSV为输入图像,mask为输出图像
        Scalar lower(hmin, smin, vmin);
        Scalar upper(hmax, smax, vmax);
        inRange(imgHSV, lower, upper, mask);
        //定义颜色下限和上限,因为由于照明和不同的阴影,颜色的值将不完全相同,会是一个值的范围

        imshow("Image", img);
        imshow("Image HSV", imgHSV);
        imshow("Image mask", mask);
        waitKey(10);
    }
}

结果展示

查找视频中的白色结果
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云兔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值