opencv4 c++ 提取图片中的白色区域_【从零学习OpenCV 4】分割图像——MeanShift分割算法...

点击上方“ 小白学视觉 ”,选择“ 星标 ”公众号
重 磅干货,第一时间送达

11acd8425e169b1b75085c7b9bdaea0e.png

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

Mean-Shift算法又被称为均值漂移法,是一种基于颜色空间分布的图像分割算法。该算法的输出是一个经过滤色的“分色”图像,其颜色会变得渐变,并且细纹纹理会变得平缓。

在Mean-Shift算法中每个像素点用一个五维的向量表示,前两个量是像素点在图像中的坐标,后三个量是每个像素点的颜色分量(蓝、绿、红)。在颜色分布的峰值处开始,通过滑动窗口不断寻找属于同一类的像素点并统一像素点的像素值。滑动窗口由半径和颜色幅度构成,半径决定了滑动窗口的范围,即坐标的范围,颜色幅度决定了半径内像素点分类的标准。这样通过不断地移动滑动窗口,实现基于像素点颜色的图像分割。由于分割后同一类像素点具有相同像素值,因此Mean-Shift算法的输出结果是一个颜色渐变、纹理平缓的图像。

OpenCV 4中提供了实现Mean-Shift算法分割图像的pyrMeanShiftFiltering()函数,该函数的函数原型在代码清单8-23中给出。

代码清单8-23 pyrMeanShiftFiltering()函数原型void cv::pyrMeanShiftFiltering(InputArray  src,                               OutputArray  dst,                               double  sp,                               double  sr,                               int  maxLevel = 1,                               TermCriteria  termcrit =                                TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1)  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义Meanshift跟踪算法的实现步骤如下: 1. 获取视频帧,并选择要跟踪的目标区域。 2. 将目标区域转换为HSV色彩空间,并计算出该区域的直方图。 3. 对于每个后续帧,首先将其转换为HSV色彩空间,然后使用反向投影算法将其与目标直方图进行比较。 4. 对于每个像素,计算该像素的概率,即它属于目标区域的概率。 5. 使用MeanShift算法来计算下一个目标位置。在此算法,计算出目标区域的质心,并将其用作新的目标位置。重复该过程,直到质心不再移动。 6. 将新的目标位置用矩形框标记在视频帧上,并将其显示出来。 下面是C++代码实现: ```c++ #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main(int argc, char** argv) { VideoCapture cap(0); if (!cap.isOpened()) { cout << "Error opening video stream or file" << endl; return -1; } // 选择目标区域 Rect trackWindow(0, 0, 0, 0); bool init = false; Mat frame, hsv, mask, hist, backproj; // 设置终止条件 TermCriteria termcrit(TermCriteria::EPS | TermCriteria::COUNT, 10, 1); // 设置HSV颜色范围 int hmin = 0, smin = 0, vmin = 0; int hmax = 180, smax = 255, vmax = 255; while (true) { cap >> frame; if (frame.empty()) break; // 将帧转换为HSV颜色空间 cvtColor(frame, hsv, COLOR_BGR2HSV); // 如果已经选择了初始目标区域,则执行跟踪 if (init) { // 计算反向投影 calcBackProject(&hsv, 1, 0, hist, backproj, &ranges); // 应用CAMShift算法来计算新的目标位置 meanShift(backproj, trackWindow, termcrit); // 绘制矩形框 rectangle(frame, trackWindow, Scalar(0, 0, 255), 3); } // 显示图像 imshow("Frame", frame); // 按下空格键来选择目标区域 if (waitKey(1) == ' ') { init = false; trackWindow = selectROI("Frame", frame, false, false); if (trackWindow.area() > 0) { Mat roi(hsv, trackWindow); calcHist(&roi, 1, 0, mask, hist, 1, &histSize, &ranges); normalize(hist, hist, 0, 255, NORM_MINMAX); init = true; } } } cap.release(); destroyAllWindows(); return 0; } ``` 需要注意的是,这个算法的效果可能不如OpenCVMeanShift算法,因为OpenCV算法使用了更复杂的技术来提高跟踪的准确性。但是,通过自定义算法,可以更好地理解MeanShift算法的原理和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值