[18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪

Opencv_CUDA应用之 基于颜色的对象检测与跟踪

  • 使用颜色作为特征来检测特定颜色的对象
  • 当要检测的对象具有特定颜色且该颜色与背景颜色不同时此方法很有用
  • 本方法不适用于对象与背景颜色相近的情况

蓝色对象检测与跟踪

  • 首先肯定会想到如何将蓝色分割出来?该使用哪个色彩空间?
  • RGB颜色空间不会将颜色信息与强度信息分开,能将颜色信息与强度信息分开的颜色空间包括HSV和YCrCb(其中Y'是亮度分量,CB和CR是蓝色差异和红色差异色度分量,非常适合这种类型的色彩信息任务)
  • 每种颜色在色调通道中都有一个特定的范围,可用于检测该颜色
  • 用于启动网络摄像机,捕获帧以及上传GPU操作的设备显存的例程如下:
cpp 复制代码
#include <iostream>
#include "opencv2/opencv.hpp"
#include<opencv2/cudaimgproc.hpp>
#include<opencv2/cudaarithm.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    VideoCapture cap(0); //capture the video from web cam
    // if webcam is not available then exit the program
    if (!cap.isOpened())
    {
        cout << "Cannot open the web cam" << endl;
        return -1;
    }
    while (true)
    {
        Mat frame;
        // read a new frame from webcam
        bool flag = cap.read(frame);
        if (!flag)
        {
            cout << "Cannot read a frame from webcam" << endl;
            break;
        }

        cuda::GpuMat d_frame, d_frame_hsv, d_intermediate, d_result;
        cuda::GpuMat d_frame_shsv[3];
        cuda::GpuMat d_thresc[3];
        Mat h_result;
        d_frame.upload(frame);
        //Transform image to HSV
        cuda::cvtColor(d_frame, d_frame_hsv, COLOR_BGR2HSV);

        //Split HSV 3 channels 通道分离
        cuda::split(d_frame_hsv, d_frame_shsv);

        //Threshold HSV channels
        cuda::threshold(d_frame_shsv[0], d_thresc[0], 110, 130, THRESH_BINARY);
        cuda::threshold(d_frame_shsv[1], d_thresc[1], 50, 255, THRESH_BINARY);
        cuda::threshold(d_frame_shsv[2], d_thresc[2], 50, 255, THRESH_BINARY);

        //Bitwise AND the channels
        cv::cuda::bitwise_and(d_thresc[0], d_thresc[1], d_intermediate);
        cv::cuda::bitwise_and(d_intermediate, d_thresc[2], d_result);

        d_result.download(h_result);
        imshow("Thresholded Image", h_result);
        imshow("Original", frame);

        if (waitKey(1) == 'q')
        {
            break;
        }
    }
    return 0;
}
  • 如果想要检测蓝色,我们需要在HSV空间找到蓝色范围,三个通道的蓝色范围、色调、饱和度值如下所示:
cpp 复制代码
lower_range = [110,50,50]
upper_range = [130,255,255]
  • 此范围将用于过滤特定通道中的图像,以创建蓝色的掩码。如果此掩码再次与原始帧进行AND运算,则结果图像中只剩蓝色对象,代码如下:
cpp 复制代码
//Transform image to HSV
        cuda::cvtColor(d_frame, d_frame_hsv, COLOR_BGR2HSV);

        //Split HSV 3 channels 通道分离
        cuda::split(d_frame_hsv, d_frame_shsv);

        //Threshold HSV channels
        cuda::threshold(d_frame_shsv[0], d_thresc[0], 110, 130, THRESH_BINARY);
        cuda::threshold(d_frame_shsv[1], d_thresc[1], 50, 255, THRESH_BINARY);
        cuda::threshold(d_frame_shsv[2], d_thresc[2], 50, 255, THRESH_BINARY);

        //Bitwise AND the channels
        cv::cuda::bitwise_and(d_thresc[0], d_thresc[1], d_intermediate);
        cv::cuda::bitwise_and(d_intermediate, d_thresc[2], d_result);
  • 视频流中的帧将转换为HSV空间,蓝色在三个通道中具有不同的范围,因此每个通道必须单独设置阈值
  • 使用 split 方法分割通道,并使用 threshold 函数进行阈值处理
  • 每个通道的最小和最大范围用作下限和上限,此范围内的通道值将转换为白色,其他值将转换为黑色
  • 这三个阈值通道在逻辑上进行AND运算,以获得蓝色的最终掩码,以此掩码可用于检测和跟踪视频中具有蓝色的目标对象
相关推荐
桃花键神8 分钟前
AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
人工智能
野蛮的大西瓜30 分钟前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
CountingStars6191 小时前
目标检测常用评估指标(metrics)
人工智能·目标检测·目标跟踪
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习1 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
tangjunjun-owen1 小时前
第四节:GLM-4v-9b模型的tokenizer源码解读
人工智能·glm-4v-9b·多模态大模型教程
冰蓝蓝1 小时前
深度学习中的注意力机制:解锁智能模型的新视角
人工智能·深度学习
橙子小哥的代码世界1 小时前
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
人工智能·计算机视觉
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo1 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展