Pixy原理

Pixy的基本思想其实是简单的:利用颜色空间来除去所有用户不感兴趣的背景,提取出前景。但是在实际的环境下却并不好做,特别是摄像头看到的颜色会受到光线的影响,导致颜色的变化(对于这一点,笔者觉得确实是没有办法的,比如红色在黑暗的条件下确实看起来是红色,那么依靠任何颜色空间看到的其实都是黑色,无法区别),因此,对于Pixy这样神奇的产品来讲,他的识别也需要颜色尽量鲜艳,饱和度尽量好的物体,对于背景来讲,也尽量是光线较好、不突变的环境。否则Pixy是“学习”不来的。

在笔者看到的Pixy的对于颜色处理的源码中,其核心思想有2个部分,这也是笔者借鉴最多的地方:

1、对像素点的处理
Pixy接收到摄像头的信息格式应该是YUV格式的,在源码的colorlut.cpp的nextHelper函数中,Pixy做了两件事:1、将YUV转为RGB的;2、处理该像素值得到U和V的值,这里的U和V并不是YUV中的UV通道,而是经过了处理,具体处理的代码如下:其中CL_LUT_ENTRY_SCALE变量为15

        if (uv){c = r+g1+b;if (c<miny){m_x += 2;continue;}u = ((r-g1)<<CL_LUT_ENTRY_SCALE)/c;c = r+g2+b;if (c<miny){m_x += 2;continue;}v = ((b-g2)<<CL_LUT_ENTRY_SCALE)/c;uv->m_u = u;uv->m_v = v;}
    这样做的好处是在U和V的值中,加入亮度的影响,这样得到的U和V值就考虑到了光线亮度对于物体颜色的影响。

2、对感兴趣域的比较统计
对于得到的U和V,Pixy将其作为“学习”的依据,即下面的学习算法均是依靠此处的U和V来进行的,在colorlut.cpp的calcRatios函数中,Pixy对于得到的U和V值进行了如下处理:其中sig是个结构体,其中的元素代表该感兴趣前景的U和V的上下阈值

    while(ip->next(&uv)){if (uv.m_u>sig->m_uMin)counts[0]++;if (uv.m_u<sig->m_uMax)counts[1]++;if (uv.m_v>sig->m_vMin)counts[2]++;if (uv.m_v<sig->m_vMax)counts[3]++;n++;}// calc ratiosratios[0] = (float)counts[0]/n;ratios[1] = (float)counts[1]/n;ratios[2] = (float)counts[2]/n;ratios[3] = (float)counts[3]/n;// calc mean (because it's cheap to do it here)sig->m_uMean = (sig->m_uMin + sig->m_uMax)/2;sig->m_vMean = (sig->m_vMin + sig->m_vMax)/2;
    在上段代码中,Pixy对用户给出区域的像素点与上下阈值进行比较统计,得到的统计值决定了“学习”的方向。

3、根据统计进行“学习”
由上部分得到的ratios数组表征了用户给定区域的像素在该阈值左右的分布,假定给定一个该分布情况的界限,则阈值就可以根据当前分布与给定分布之间的大小进行自动调整(Pixy默认的界限是80%,即该阈值可以提取出图像区域80%的像素值):以U值为例,当图像在该阈值作用下,大于U阈值最小值的像素点有90%,则说明U阈值的最小值过小,此时应该向下调整,使该阈值增大,反之则反之。具体的代码见下: 其中m_ratio为0.8

for (scale=1<<30, sig->m_uMin=sig->m_uMax=sig->m_vMin=sig->m_vMax=0; scale!=0; scale>>=1){calcRatios(ip, sig, ratios);if (ratios[0]>m_ratio)sig->m_uMin += scale;elsesig->m_uMin -= scale;if (ratios[1]>m_ratio)sig->m_uMax -= scale;elsesig->m_uMax += scale;if (ratios[2]>m_ratio)sig->m_vMin += scale;elsesig->m_vMin -= scale;if (ratios[3]>m_ratio)sig->m_vMax -= scale;elsesig->m_vMax += scale;}
    根据上述代码可以看到,Pixy在学习的过程中对一幅图像(用户感兴趣)学习了30次,最终根据反馈得到了较好的阈值。

Opencv实现

其实知道了原理之后,想用Opencv对一幅图像进行处理并得到较好的阈值是比较容易的,笔者也对该算法进行了尝(chao)试(xi),但是效果十分不好,1、不能进行较好的前景提取;2、处理速度十分慢。对于以上两个问题,个人认为还是对于YUV的格式没有把握好,导致中间运算出现问题(悼念三分钟尝试失败)。

但是笔者并没有放弃,把该算法移植到了HSV空间上,说是移植,其实中间去掉了一些处理,比如移植的算法没有考虑亮度对颜色的影响(> <),但是确实可以给定一个区域进行自“学习”了,收获还是不小,想要进行参考的同学可以到该地址进行下载http://download.csdn.net/detail/wubaobao1993/9745837

最后上两个图,是该算法的实际效果

Pixy原理及Opencv实现相关推荐

  1. java求sobel算子代码_sobel算子原理及opencv源码实现

    sobel算子原理及opencv源码实现 简要描述 sobel算子主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测. 原理 算子使用两个33的矩阵(图1)算子使用两个33的矩阵(图1)去 ...

  2. 双目相机标定以及立体测距原理及OpenCV实现

    转载 双目相机标定以及立体测距原理及OpenCV实现 http://blog.csdn.net/dcrmg/article/details/52986522?locationNum=15&fp ...

  3. RANSAC(随机采样一致算法)原理及openCV代码实现

    <RANSAC(随机采样一致算法)原理及openCV代码实现> 原文: http://www.lai18.com/content/1046939.html  本文转自:http://b ...

  4. 角点检测(Harris Shi-Tomas)的原理及OpenCV API 的应用

    角点检测(Harris & Shi-Tomas)的原理及OpenCV API 的应用 这篇博客的内容主要时对参考中多篇博客的总结. 1. 角点 在现实世界中,角点对应于物体的拐角,道路的十字路 ...

  5. 利用霍夫变换做直线检测的原理及OpenCV代码实现

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 霍夫变换的原理大家可以参考博文 霍夫变换_tie ...

  6. 利用Canny边缘检测算子进行边缘检测的原理及OpenCV代码实现

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 Canny算子是John Canny在1986年 ...

  7. 利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 对图像进行旋转矫正,关键是要获取旋转角度是多少! ...

  8. Camshift算法原理及其Opencv实现

    Camshift原理 camshift利用目标的颜色直方图模型将图像转换为颜色概率分布图,初始化一个搜索窗的大小和位置,并根据上一帧得到的结果自适应调整搜索窗口的位置和大小,从而定位出当前图像中目标的 ...

  9. 引导图滤波(Guided Image Filtering)原理以及OpenCV实现

    引导图滤波器是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献<Guided Image Filtering>以及matlab源码:Guided Im ...

最新文章

  1. 简易而又灵活的Javascript拖拽框架(四)
  2. splitpane如何设置竖条的宽度_页面中有间隔的方格布局如何完美实现?
  3. 教程:Hibernate,JPA –第1部分
  4. Spring-data-jpa常用方法
  5. java 静态与非静态之间的访问规则简述
  6. WeUI 为微信 Web 服务量身设计-h5前端框架
  7. python调试神器_你必须拥有的Python调试神器
  8. xml2 交叉编译移植
  9. 在 Linux 下使用 RAID(九):如何使用 ‘Mdadm’ 工具管理软件 RAID
  10. ATL之深入浅出书评(转)
  11. Django使用orm创建数据表字段常用命令
  12. matlab后处理保存avi动画
  13. skyline软件_正射影像、倾斜摄影测量相关软件汇总
  14. JS生成二维码图片并下载,可带logo
  15. JQuery UI Layout
  16. sqlite 多条件查询
  17. 活动图中创建泳道(UML2活动框图创建泳道图例和操作流程)
  18. Android和风SDK,Android 和风天气SDK获取天气
  19. 基于NMF的推荐系统实例
  20. 什么是重绘,重排?如何解决?

热门文章

  1. 科技云报道:重塑增长新动能,“数智融合”捷径该如何走?
  2. [英语语法]词法之动词:虚拟语气
  3. ADSL 虚拟拨号常见问题
  4. 2018初春带妈妈逛苏州上海
  5. Fvwm新手入门不完全手册(原创)
  6. 安恒信息HWS计划2021硬件冬令营 物联网安全课堂笔记 2021.1.10
  7. Python爬取豆瓣Top250电影排名
  8. spwm调制仿真matlab,三相SPWM逆变器的调制建模和仿真详解
  9. 想让照片更闪耀?20个金色光效景色Lightroom预设不能错过
  10. Lightroom显示无法打开Lightroom 目录“LightroomCatalog“,因为已经在另一个应用程序中打开了该目录。解决方案