文章目录

  • 说明
  • Code
  • 效果

说明

1、在HSV颜色空间下进行颜色追踪,RGB颜色空间每个通道分量受亮度影响大,HSV颜色空间受亮度影响较小;
2、EmguCV与OpenCV的HSV取值: H:0-180 ; S: 0-255; V: 0-255(注意取值范围);

3、常用的HSV参考值:

4、使用Inrange()函数在HSV空间中寻找HSV在某一范围内的值,输出掩膜,作为寻找结果。

Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;using Emgu.CV;
using Emgu.CV.Util;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.Util;
using System.Drawing;namespace lesson28_console
{class Program{static void Main(string[] args){///图片颜色识别//Mat srcImg = CvInvoke.Imread(@"C:\Users\hello\Desktop\EmguCVDemo\lesson28\lesson28_console\bin\Debug\opencv-logo-white.png");//CvInvoke.Imshow("input", srcImg);//Mat hsvImg = new Mat();//Mat mask = new Mat();//double h_min = 0, s_min = 43, v_min = 46;//double h_max = 10, s_max = 255, v_max = 255;//ScalarArray hsv_min = new ScalarArray(new MCvScalar(h_min, s_min, v_min));//ScalarArray hsv_max = new ScalarArray(new MCvScalar(h_max, s_max, v_max));//CvInvoke.CvtColor(srcImg, hsvImg, ColorConversion.Bgr2Hsv);//CvInvoke.InRange(hsvImg, hsv_min, hsv_max, mask);   //输出为符合要求的图像掩膜//CvInvoke.MedianBlur(mask, mask, 5);//CvInvoke.Imshow("mask", mask);//VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();//VectorOfRect hierarchy = new VectorOfRect();发现轮廓//CvInvoke.FindContours(mask, contours,hierarchy, RetrType.External, ChainApproxMethod.ChainApproxNone);//VectorOfVectorOfPoint contours_approx = new VectorOfVectorOfPoint(contours.Size);//Rectangle rect = new Rectangle();//for (int i =0; i < contours.Size;i++)//{//    CvInvoke.ApproxPolyDP(contours[i], contours_approx[i], 3, true);//    CvInvoke.DrawContours(srcImg, contours_approx, i, new MCvScalar(255, 0, 0), 1, LineType.EightConnected, hierarchy, 0);//    CvInvoke.Imshow("red", srcImg);//    rect = CvInvoke.BoundingRectangle(contours_approx[i]);//    CvInvoke.Rectangle(srcImg, rect, new MCvScalar(0, 0, 255), 1);//    CvInvoke.PutText(srcImg, "red", new Point(rect.X, rect.Y), FontFace.HersheyComplexSmall, 1.2, new MCvScalar(0, 255, 0));//}//CvInvoke.WaitKey(0);///视频绿色物体追踪//VideoCapture cap = new VideoCapture("1.mp4");//if(!cap.IsOpened)     //打开文件失败//{//    Console.WriteLine("Open video failed!");//    return;//}//Mat frame = new Mat();//while(true)//{//    //frame = cap.QueryFrame();//    cap.Read(frame);//    if(frame.IsEmpty)//    {//        Console.WriteLine("frame is empty...");//        break;//    }//    Mat hsvimg = new Mat();//    Mat mask = new Mat();//    double h_min = 35, s_min = 110, v_min = 106;//    double h_max = 77, s_max = 255, v_max = 255;//    ScalarArray hsv_min = new ScalarArray(new MCvScalar(h_min, s_min, v_min));//    ScalarArray hsv_max = new ScalarArray(new MCvScalar(h_max, s_max, v_max));//    CvInvoke.CvtColor(frame, hsvimg, ColorConversion.Bgr2Hsv);//    CvInvoke.InRange(hsvimg, hsv_min, hsv_max, mask);//    CvInvoke.MedianBlur(mask, mask, 5);//    CvInvoke.Imshow("mask", mask);//    VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();//    VectorOfRect hierachy = new VectorOfRect();//    CvInvoke.FindContours(mask, contours, hierachy, RetrType.External, ChainApproxMethod.ChainApproxNone);//    for(int i = 0; i< contours.Size; i++)//    {//        Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);//        if (rect.Width < 10 || rect.Height < 10)                //对于太小的外接矩形,删除掉//            continue;//        CvInvoke.Rectangle(frame, rect, new MCvScalar(255, 0, 0), 1);//        CvInvoke.PutText(frame, "green", new Point(rect.X, rect.Y - 5), FontFace.HersheyComplexSmall, 1.2, new MCvScalar(0, 255, 0));//    }//    CvInvoke.Imshow("hsv_track", frame);//    if(CvInvoke.WaitKey(30) == 27)//    {//        break;//    }//}///蓝色物体追踪//VideoCapture cap = new VideoCapture("1.mp4");//if (!cap.IsOpened)     //打开文件失败//{//    Console.WriteLine("Open video failed!");//    return;//}//Mat frame = new Mat();//while (true)//{//    //frame = cap.QueryFrame();   //实验读取到最后一帧有异常//    cap.Read(frame);//    if (frame.IsEmpty)//    {//        Console.WriteLine("frame is empty...");//        break;//    }//    Mat hsvimg = new Mat();//    Mat mask = new Mat();//    double h_min = 81, s_min = 77, v_min = 93;//    double h_max = 125, s_max = 255, v_max = 255;//    ScalarArray hsv_min = new ScalarArray(new MCvScalar(h_min, s_min, v_min));//    ScalarArray hsv_max = new ScalarArray(new MCvScalar(h_max, s_max, v_max));//    //!!!因为图像某一部分存在干扰,所以设置感兴趣区域,只追踪在规定范围内的颜色物体//    Mat frameROI = new Mat(frame, new Rectangle(0, 0, 350, 353));  //将干扰区域切除//    CvInvoke.CvtColor(frameROI, hsvimg, ColorConversion.Bgr2Hsv);//    CvInvoke.InRange(hsvimg, hsv_min, hsv_max, mask);//    CvInvoke.MedianBlur(mask, mask, 5);//    CvInvoke.Imshow("mask", mask);//    VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();//    VectorOfRect hierachy = new VectorOfRect();//    CvInvoke.FindContours(mask, contours, hierachy, RetrType.External, ChainApproxMethod.ChainApproxNone);//    for (int i = 0; i < contours.Size; i++)//    {//        Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);//        if (rect.Width < 10 || rect.Height < 10)                //对于太小的外接矩形,删除掉//            continue;//        CvInvoke.Rectangle(frame, rect, new MCvScalar(255, 0, 0), 1);//        CvInvoke.PutText(frame, "blue", new Point(rect.X, rect.Y - 5), FontFace.HersheyComplexSmall, 1.2, new MCvScalar(0, 255, 0));//    }//    CvInvoke.Imshow("hsv_track", frame);//    if (CvInvoke.WaitKey(30) == 27)//    {//        break;//    }//}///红色绿色同时追踪//VideoCapture cap = new VideoCapture("1.mp4");//if (!cap.IsOpened)     //打开文件失败//{//    Console.WriteLine("Open video failed!");//    return;//}//Mat frame = new Mat();//while (true)//{//    //frame = cap.QueryFrame();   //实验读取到最后一帧有异常//    cap.Read(frame);//    if (frame.IsEmpty)//    {//        Console.WriteLine("frame is empty...");//        break;//    }//    Mat hsvimg = new Mat();//    Mat mask_red = new Mat();//    Mat mask_green = new Mat();//    double h_min_red = 0, s_min_red = 127, v_min_red = 128;//    double h_max_red = 10, s_max_red = 255, v_max_red = 255;//    double h_min_green = 35, s_min_green = 110, v_min_green = 106;//    double h_max_green = 77, s_max_green = 255, v_max_green = 255;//    ScalarArray hsv_min_red = new ScalarArray(new MCvScalar(h_min_red, s_min_red, v_min_red));//    ScalarArray hsv_max_red = new ScalarArray(new MCvScalar(h_max_red, s_max_red, v_max_red));//    ScalarArray hsv_min_green = new ScalarArray(new MCvScalar(h_min_green, s_min_green, v_min_green));//    ScalarArray hsv_max_green = new ScalarArray(new MCvScalar(h_max_green, s_max_green, v_max_green));               //    CvInvoke.CvtColor(frame, hsvimg, ColorConversion.Bgr2Hsv);//    CvInvoke.InRange(hsvimg, hsv_min_red, hsv_max_red, mask_red);//    CvInvoke.InRange(hsvimg, hsv_min_green, hsv_max_green, mask_green);//    CvInvoke.MedianBlur(mask_red, mask_red, 5);//    CvInvoke.MedianBlur(mask_green, mask_green, 5);//    Mat mask = new Mat();//    CvInvoke.Add(mask_red, mask_green, mask);  //掩膜相加//    CvInvoke.Imshow("mask", mask);          //显示合在一起的掩膜//    VectorOfVectorOfPoint contours_red = new VectorOfVectorOfPoint();//    VectorOfRect hierachy_red = new VectorOfRect();//    CvInvoke.FindContours(mask_red, contours_red, hierachy_red, RetrType.External, ChainApproxMethod.ChainApproxNone);//    for (int i = 0; i < contours_red.Size; i++)//    {//        Rectangle rect = CvInvoke.BoundingRectangle(contours_red[i]);//        if (rect.Width < 10 || rect.Height < 10)                //对于太小的外接矩形,删除掉//            continue;//        CvInvoke.Rectangle(frame, rect, new MCvScalar(255, 0, 0), 1);//        CvInvoke.PutText(frame, "red", new Point(rect.X, rect.Y - 5), FontFace.HersheyComplexSmall, 1.2, new MCvScalar(0, 255, 0));//    }//    VectorOfVectorOfPoint contours_green = new VectorOfVectorOfPoint();//    VectorOfRect hierachy_green = new VectorOfRect();//    CvInvoke.FindContours(mask_green, contours_green, hierachy_green, RetrType.External, ChainApproxMethod.ChainApproxNone);//    for (int i = 0; i < contours_green.Size; i++)//    {//        Rectangle rect = CvInvoke.BoundingRectangle(contours_green[i]);//        if (rect.Width < 10 || rect.Height < 10)                //对于太小的外接矩形,删除掉//            continue;//        CvInvoke.Rectangle(frame, rect, new MCvScalar(255, 0, 0), 1);//        CvInvoke.PutText(frame, "green", new Point(rect.X, rect.Y - 5), FontFace.HersheyComplexSmall, 1.2, new MCvScalar(0, 255, 0));//    }//    CvInvoke.Imshow("hsv_track", frame);//    if (CvInvoke.WaitKey(30) == 27)//    {//        break;//    }//}///手掌肤色提取Mat src = CvInvoke.Imread("2.bmp");double h_min = 0, s_min = 70, v_min = 70;       //手的HSV颜色分布double h_max = 15, s_max = 255, v_max = 255;ScalarArray hsv_min = new ScalarArray(new MCvScalar(h_min, s_min, v_min));ScalarArray hsv_max = new ScalarArray(new MCvScalar(h_max, s_max, v_max));Mat hsvimg = new Mat();Mat mask = new Mat();CvInvoke.CvtColor(src, hsvimg, ColorConversion.Bgr2Hsv);CvInvoke.InRange(hsvimg, hsv_min, hsv_max, mask);CvInvoke.MedianBlur(mask, mask, 5);VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();VectorOfRect hierarchy = new VectorOfRect();//发现轮廓CvInvoke.FindContours(mask, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxNone);for(int i = 0; i< contours.Size;i++){Rectangle rect = CvInvoke.BoundingRectangle(contours[i]);if (rect.Width < 10 || rect.Height < 10)continue;CvInvoke.Rectangle(src, rect, new MCvScalar(255, 0, 0));CvInvoke.PutText(src, "hand", new Point(rect.X, rect.Y - 5), FontFace.HersheyComplexSmall, 1.2, new MCvScalar(0, 0, 255));}CvInvoke.Imshow("hsv_track", src);CvInvoke.WaitKey(0);}}
}

效果

1、寻找图像红色部分:

掩膜:

2、寻找红色部分:

3、寻找视频中的绿色部分:


4、寻找视频中红色与绿色物体:

5、根据手的HSV特征寻找手:

EmguCV实现颜色物体识别与追踪(CvInvoke.InRange()函数)相关推荐

  1. opencv 图像颜色空间转换和特定颜色物体追踪

    颜色空间转换 HSV简介 HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色.H表示色调(Hue),S表示饱和度(Saturation),V表示明度(Value). OpenCV中色调H范围为[ ...

  2. STM32 OV7725摄像头模块的颜色处理和简单物体识别(串口输出图片)

    目录 前言 一.摄像头采集数据流程 二.如何将图像显示到电脑上 三.图像二值化 1.什么是RGB? 2.RGB565转RGB888 I.RGB565和RGB888的区别 II.代码 3.RGB转HSL ...

  3. 颜色和移动物体识别系统

    颜色和移动物体识别系统 1.开发工具 Python版本:Anaconda 的python环境3.8版本 开发软件:Pycharm社区版 识别模型:深度学习模型,普通学习模型 相关模块:opencv-p ...

  4. 基于ROS机器人的3D物体识别与三维重建(一) 介绍篇

    基于ROS机器人的3D物体识别与三维重建(一) 介绍篇 由来:清理电脑硬盘,发现了当时做毕设的一些资料,所以打算整理一下资料和代码写成专栏,记录下当时的暗金岁月,尽管现在实验室的做的项目已经不是这个方 ...

  5. Udacity机器人软件工程师课程笔记(二十二) - 物体识别 - 色彩直方图,支持向量机SVM

    物体识别 1.HSV色彩空间 如果要进行颜色检测,HSV颜色空间是当前最常用的. HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一 ...

  6. 一文教会你三维网格物体识别

    本文由「图普科技」(微信公众号 tuputech)编译,原作者 Vladimir Tsyshnatiy,链接:https://medium.com/@vtsyshnatiy 2017 年 3 月,当时 ...

  7. 李飞飞:物体识别之后,计算机视觉的进展、目标和前景何在?

    来源:AI科技评论 本文长度为4170字,建议阅读6分钟 本文为你解读机器计算机视觉的进展与前景. 9 月 26 日,机器人领域的顶级学术会议 IROS 2017 进入第二日.上午,著名华人计算机视觉 ...

  8. 开发物体识别桌、_【课程总结】AR系统开发“秘籍”大揭秘!

    导读:AR技术飞速发展,被广泛应用于游戏.医疗.旅游.电商等行业.那么对于AR系统的整体设计和应用是如何操作的呢?商汤泰坦公开课第006期联合"SLAM技术及应用"暑期学校与研讨会 ...

  9. 李飞飞:在物体识别之后,计算机视觉还要多久才能理解这个世界?

    9 月 26 日,著名华人计算机视觉专家.斯坦福副教授李飞飞,在温哥华会议中心面向全体与会专家学者作了长达一小时的专题报告. 李飞飞与大家讨论了计算机视觉的下一步目标:丰富场景理解,以及计算机视觉与语 ...

  10. 计算机视觉物体识别的过程,(物体识别过程.doc

    (物体识别过程 在计算机视觉领域,一个典型的物体识别系统往包含以下几个阶段预处理特征特征选择建模匹配定位 1.2.3预处理 预处理几乎是所有计算机视觉算法的第一步动机是尽可能在不改变图像承载的本质信息 ...

最新文章

  1. python读取一个文件夹/子文件夹下的所有文件名字
  2. 解决eclipse中egit中的cannot open git-upload-pack问题
  3. 如何使用vscode安装和调试Java程序
  4. Java—正整数分解成质因数
  5. JavaScript 开发者年度调查报告(2016-01)
  6. 数据结构——图-有向带权图的邻接表基础
  7. [dp]leetcode 746. Min Cost Climbing Stairs
  8. 设计素材模板丨极简风简历模板
  9. 接口测试--apipost中cookie管理器的使用
  10. [ubuntu] duplicated values in $PATH
  11. No boot device avalible,Press any key to reboot the system
  12. Java并发包的理解
  13. html网页随机抽奖怎么制作,html简单易懂的随机抽奖
  14. android keep倒计时,Android仿Keep运动休息倒计时圆形控件
  15. 小白都能看懂的java虚拟机内存区域划分
  16. 数据结构教程(c语言)(已完结)
  17. linux路由器还原,openwrt路由器恢复出厂设置的方法
  18. 基于ICP算法计算点集之间的变换矩阵(旋转、平移)
  19. 真人语音朗读软件_讯飞语音云助力移动“和阅读”,打造个性化听书应用
  20. 开发一个可以查询并显示数据库内容的微信小程序

热门文章

  1. 51单片机项目设计——价格猜猜猜
  2. 学习笔记--古月居ROS入门21讲
  3. 用python实现带界面的数独小游戏
  4. [VB.NET]请问在WINCE中如何实现输入法的自动切换呢?
  5. 《暗黑世界V1.6》服务器代码执行图
  6. HP Compaq 510 拆机图解
  7. 三步,学习运用JMP分析股票的小技巧
  8. 小飞鱼 OA工作流定制设计开发(图文)
  9. 迄今为止最优的Eclipse运行性能调优 ,含eclipse.ini
  10. MATLAB绘制卫星返回地球示例