使用颜色阈值提取跟踪目标。使用Meanshift 和Camshift 算法进行目标跟踪。首先,什么是Meanshift和Camshift算法?
均匀平移首先建立一个窗口,然后在窗口内不断移动目标进行搜索,并计算相关位置的最大值(也可以说是窗口内的概率密度)。如图所示,实心正方形是窗口的中心,实心圆是目标的质心。当目标移动时,其质心也会移动。我们的目的是计算出目标的质心,然后将窗口中心移动到质心的位置,从而完成对目标的跟踪。 opencv给出的例子表示窗口大小是固定的,而camshift窗口是自适应的。
详情请查看python-opencv手册
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_video/py_meanshift/py_meanshift.html#meanshift
meanshift_basics.jpg 其次,什么是颜色阈值分割?
目标的颜色是目标非常明显的特征,比较容易被检测到。彩色图像的三基色是红色(RED)、绿色(GREEN)和蓝色(BLUE)。在此基础上建立的模型就是RGB模型。然而,我们经常将RGB模型转换为HSV模型,H(亮色调),S(饱和度),V(明度)。色度决定图像的颜色,饱和度是颜色的深度,明度是图像的亮度。图像阈值分割就是利用HSV的这三个特征来设定一个范围来提取我们需要的目标颜色(与背景不同)。基于颜色阈值的分割的优点是易于理解且非常直观。缺点是阈值的选择比较麻烦,并且容易受到背景颜色的干扰。
3801213fb80e7beceb58f65c2f2eb9389a506b89.jpg python+opencv的方法给图像处理带来了极大的简单性。 Python是一种脚本语言,因此在进行图像处理操作时,可以将代码写成脚本,以便于理解。
接下来,我们就开始实验吧。
import numpy as np#导入numpy 库
import cv2#导入opencv库
cap=cv2.VideoCapture(0)#打开摄像头
ret,frame=cap.read()#读取视频第一帧
# 拍摄视频的第一帧
lower_blue=np.array([20,0,0]) #设置颜色阈值下限
upper_blue=np.array([50,200,200])#设置颜色阈值的上限。在此代码中,读取相机捕获的第一帧作为预处理图像。并设置我们需要捕捉的目标颜色的范围。这里我捕获黄色,范围约为(20-50)。根据HSV模型,彩色图像的色调(H)在8bit中为(0-180)。三基色的数值大致为红(0)、黄(30)、绿(60)、青(90)、蓝(120)。饱和度(H)的范围是(0-255),亮度(V)的范围是(0-255)。所以我给出的黄色杯盖的HSV范围如下H(20-50),S(0-200),V(0-200)。具体opencv颜色阈值选择详情请参考
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html#converting-colorspaces
mask=cv2.inRange(frame, lower_blue, upper_blue)#创建蒙版
kernel=np.ones((5,5),np.uint8)#创建核心
opening=cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)#打开
dilation=cv2.dilate(opening,kernel,iterations=1)#在这段代码中,dilation主要是遮盖我们相机获取的图像的第一帧。掩蔽的目的是提取图像的第一帧。目标。开运算和扩张都是形态学过程。 Opening用于过滤掉结构元素(可以理解为每个像素)的细小杂散,并剪掉细长的重叠部分,实现分离。膨胀用于扩大比背景亮的区域并压缩比背景暗的区域。内核创建一个大小为5 * 5 的结构元素。有关形态的更多信息,请参阅
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html
image,contours,hierarchy=cv2.findContours(dilation,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#获取轮廓
cnt=轮廓[1]#轮廓集合中的第二个轮廓
M=cv2.moments(cnt)#图像矩
#重心
cx=int(M["m10"]/M["m00"])
cy=int(M["m01"]/M["m00"]) 这段代码的作用是对打开膨胀后的目标图像进行轮廓操作,并获取图像的重心和中心所获得轮廓的矩。点坐标。轮廓是包含目标的轮廓点。由于获得的目标图像可能存在孔洞,因此应该有很多轮廓点集。这里cnt=轮廓[1]采用第二个点集。图像中计算的矩通常描述图像的不同类型的几何特征,例如大小、灰度、方向、形状、重心等特征。这里cx和cy是轮廓的重心。关于opencv提取轮廓,请参见[findContours]https://docs.opencv.org/3.0-last-rst/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=cv2.findcontour#cv2.findCont Ours关于图像矩等轮廓特征的更多信息,请参阅[CONTOUR_FEATURES]https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.html
r,h,c,w=np.int(np.abs(cy-250)),250,np.int(np.abs(cx-250)),250# 根据获得的重心创建窗口
track_window=(c,r,w,h)
roi=frame[r:r+h, c:c+w]#获取图像中的目标图像
hsv_roi=cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)#RGB模型转换为HSV模型
mask=cv2.inRange(hsv_roi, lower_blue, upper_blue)#创建掩模mask
roi_hist=cv2.calcHist([hsv_roi],[0],mask,[30],[0,30])#获取灰度直方图
cv2.normalize(roi_hist,roi_hist,0,30,cv2.NORM_MINMAX)#标准化处理
# 设置终止条件,迭代10 次或移动至少1 pt
term_crit=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)#设置起始条件。这段代码主要是以得到的轮廓重心为中心创建一个矩形窗口,并取这个窗口的灰度直方图并进行归一化。统一处理,并设置起始条件,为直方图逆映射做准备。什么是直方图逆映射?它用于图像分割或查找图像中感兴趣的对象。简而言之,它创建一个与我们的输入图像大小相同(但单通道)的图像,其中每个像素对应于该像素属于我们的对象的概率。在一个更简单的世界中,输出图像将使我们感兴趣的对象比其他对象更白。直方图反向映射原理参见
https://blog.csdn.net/michaelhan3/article/details/73550643
同时(1):
ret,frame=cap.read()#读取图片
如果ret==True:
hsv=cv2.cvtColor(帧, cv2.COLOR_BGR2HSV)
dst=cv2.calcBackProject([hsv],[0],roi_hist,[0,30],1)#直方图反向映射
# 应用meanshift来获取新位置
ret, track_window=cv2.CamShift(dst, track_window, term_crit)#自适应等移算法
# 将其绘制在图像上
pts=cv2.boxPoints(ret)
点=np.int0(点)
img2=cv2.polylines(frame, [pts], True, 255, 2)#绘制跟踪窗口
cv2.imshow("img2", img2)#显示图像
k=cv2.waitKey(60)0xff#设置按esc退出程序
ifk==27:
休息
cv2.destroyAllWindows()#销毁窗口
关于基于颜色阈值技术的图像分割与追踪方法分析到此分享完毕,希望能帮助到您。
【基于颜色阈值技术的图像分割与追踪方法分析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这个算法听起来蛮有意思!
有17位网友表示赞同!
不知道在实际应用中效果怎么样?
有6位网友表示赞同!
阈值选择影响结果大吗?
有16位网友表示赞同!
什么情况下会用到基于颜色阈值的视觉跟踪呢?
有7位网友表示赞同!
这种方法比其他跟踪算法更优越吗?
有17位网友表示赞同!
需要什么样的硬件设备才能实现这种跟踪?
有20位网友表示赞同!
这个研究是不是在计算机视觉领域很前沿的?
有17位网友表示赞同!
阈值分割会不会对物体形状有影响?
有6位网友表示赞同!
颜色信息是否能够足够精确地追踪目标?
有7位网友表示赞同!
这种方法适用于动态场景吗?
有12位网友表示赞同!
视频处理的速度怎么样?
有15位网友表示赞同!
图像分辨率会影响跟踪精度吗?
有11位网友表示赞同!
这个算法可以识别不同颜色、形状的目标吗?
有10位网友表示赞同!
有没有相关的开源代码可以学习一下?
有5位网友表示赞同!
基于颜色阈值的视觉跟踪在哪些实际应用领域可以发挥作用?
有14位网友表示赞同!
比如自动驾驶汽车的路径规划里会不会用到这种方法?
有12位网友表示赞同!
这篇文章详细介绍了算法的工作原理吗?
有17位网友表示赞同!
能不能分享一些实验结果,证明这个方法的效果?
有14位网友表示赞同!
作者有没有考虑过其他颜色特征或者多种特征融合的方式?
有19位网友表示赞同!
对未来发展的展望是什么?
有8位网友表示赞同!