OpenCV 学习笔记(mean shift 算法)

Mean shift 是一种机器学习算法,并不仅仅局限于图像上的应用。关于 Mean shift 算法介绍的书和文章很多,这里就不多介绍了。简单的说,Meanshift 算法是一种迭代算法,需要给一个初始的区域,然后这个算法会反复的调整这个区域,使得这个区域最吻合我们期望的特征。

OpenCV 中有两处用到了 Mean Shift 。分别是:

  • pyrMeanShiftFiltering

  • meanShift

这里只介绍第二个函数的使用方法。

我们的原始图像还是上次那个向日葵的图像,我们选中其中一朵向日葵来计算 Histogram,但是这次我们计算 Hue 通道的 Histogram:

之后用这个直方图数据在另外一个图像中用 Meanshift 算法去找向日葵。
下面是代码,首先加载原始图像。在原始图像中找到向日葵,计算向日葵区域的 Histogram。

    cv::Mat image = cv::imread("D:\\向日葵.jpg");cv::Mat imageROI = image(cv::Rect(130, 250, 75, 75));ColorHistogram hist;cv::Mat h = hist.getHueHistogram(imageROI, 65);cv::imshow("pic", image);ContentFinder finder;finder.setHistogram(h);finder.setThreshold(-1.0f);

之后加载我们要探测的图像,做 backproject,得到概率分布图。

    cv::Mat image2 = cv::imread("D:\\02.jpg");cv::Mat hsv;cv::cvtColor(image2, hsv, CV_BGR2HSV);int ch[1] = {0};cv::Mat probImage = finder.find(hsv, 0.0, 180, ch);cv::Mat img_color;cv::applyColorMap(probImage, img_color, cv::COLORMAP_JET);cv::imshow("backproject", img_color);


最后 Meanshift 就是在右图中找出概率最大的那个区域。对于这个问题来说,其实做个遍历就行。meanshift 相比遍历效率更高。但是如果初始区域选的不好,有可能会找不到向日葵所在的区域。所以meanshift 并不是万能的。

    cv::Rect rect(100, 100, 200, 200);cv::rectangle(image2, rect, cv::Scalar(255,0,0));
//    cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER, 30, 1);cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,10,1);cv::meanShift(probImage, rect, criteria);cv::rectangle(image2, rect, cv::Scalar(0,0,255));cv::imshow("image2", image2);

下面是输出结果,蓝框是我们随便选的初始区域,红框是得到的结果。可以看到准确的找到了向日葵所在区域。

如果我们初始区域选的不太好,就会找不到向日葵。比如下面的代码。

    cv::Rect rect(0, 0, 200, 200);cv::rectangle(image2, rect, cv::Scalar(255,0,0));cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,10,1);cv::meanShift(probImage, rect, criteria);cv::rectangle(image2, rect, cv::Scalar(0,0,255));cv::imshow("image2", image2);


可以看到迭代了10次,但是区域一点没动。一般来说我们可以随机选择初始区域,如果一个区域 meanshift失败了,就再随机选另一个区域。这样试几次就能得到不错的结果。

OpenCV 学习笔记(mean shift 算法)相关推荐

  1. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  2. 分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  3. Opencv学习笔记 - OpenCV 4机器学习算法简介

    在机器学习中,一些比较流行方法的包括:支持向量机(SVM).人工神经网络(ANN).聚类.k-最近邻.决策树和深度学习.OpenCV支持并实现几乎所有这些方法,并有详细的文档说明(包含在Main mo ...

  4. OpenCv学习笔记4--图像分割之GrabCut算法

    说明: 本文章是opencv学习笔记系列的第四篇小结,可能前几篇内容太多,排版也不甚合理,所以为了更好的观看体验,这次的内容会稍微少那么一点点,再次重申 所有代码在我的github主页https:// ...

  5. Opencv学习笔记 - 使用opencvsharp和Boosting算法处理分类问题

    决策树非常有用,但单独使用时它并不是表现最佳的分类器.改进的方法随机森林和Boosting算法.随机森林与Boosting算法都是在内部循环中使用决策树的,因此继承了决策树的许多优良属性,它们通常是机 ...

  6. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  7. opencv学习笔记(二):基于肤色的人手检测

    opencv学习笔记(二):基于肤色的人手检测 原文:http://blog.csdn.net/wzmsltw/article/details/50849810 先写了人手的检测程序,下一步基于检测程 ...

  8. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  9. OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五

    OpenCV学习笔记(五十一)--imge stitching图像拼接stitching stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitch ...

  10. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

最新文章

  1. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数
  2. Python之pandas:数据类型变换之object、category、bool、int32、int64、float64以及数据类型标准化之详细攻略
  3. matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc
  4. 关于c3样式在浏览器上的兼容问题
  5. iTunes降级操作
  6. 关于win10 无线网络不可用,网络适配器出现全感叹号
  7. dataset.padded_batch 用法案例
  8. dos下用move命令移动文件夹
  9. 【SQL自学打卡|DAY17】——多表查询
  10. Android 无需root实现apk的静默安装
  11. 教师计算机西沃培训心得,学习使用希沃电子白板的心得体会
  12. element-ui换肤,全局换肤
  13. 并行计算————计算机架构
  14. VMware虚拟机下安装RedHat Linux 9.0
  15. 其实书童是一个集算法、实践、论文以及Transformer于一身的公号(往期索引大全)...
  16. 第十二章 C语言调试_查看和修改变量的值
  17. (02) 任务(Jobs)和触发器(Triggers)
  18. ssdb写入mysql_ssdb使用笔记
  19. 简略版本MVC框架JWork的实现
  20. 基于Kubernetes/K8S构建Jenkins持续集成平台(一)

热门文章

  1. java中成员方法_java中的成员变量和方法
  2. python爬虫之数据提取、正则表达式、xml、XPath、etree、CSS选择器 BeautifulSoup4
  3. NLP-文本处理:词性消歧
  4. Dev C++ 源文件编译时,确实没问题,但是运行时,总是提示源文件 未编译
  5. BZOJ3110 K大数查询
  6. iOS文字颜色渐变透明
  7. proteus不能打开一直在开启界面转圈
  8. PM2.5数据的清洗,汇总与制作散点图(含源数据链接)
  9. adb命令刷机vivox20_vivo手机如何双清?vivo双wipe刷机教程
  10. 几种开源的网络流量监控软件