Python 如何使cv2.filter2D更快?
我正在做一个项目,我必须用颜色作为物体的特征表示来检测和跟踪小型汽车(见下图)。对于检测,我使用了直方图反投影 见: 对于跟踪,我使用了KCF(核化相关滤波器) 如果我们看一下检测算法的步骤,它在获得概率分布的二值图像后应用Python 如何使cv2.filter2D更快?,python,opencv,image-processing,filter,object-detection,Python,Opencv,Image Processing,Filter,Object Detection,我正在做一个项目,我必须用颜色作为物体的特征表示来检测和跟踪小型汽车(见下图)。对于检测,我使用了直方图反投影 见: 对于跟踪,我使用了KCF(核化相关滤波器) 如果我们看一下检测算法的步骤,它在获得概率分布的二值图像后应用cv2.filter2D函数以及一些逻辑操作,如打开、关闭等,以改进检测和去除噪声 当我运行代码时,我注意到当检测发生时(每20帧),进程稍微挂起或在检测时刻变得缓慢 负责检测的代码是: def back_projectcam1(histm,hsv_histt,hsvt):
cv2.filter2D
函数以及一些逻辑操作,如打开、关闭等,以改进检测和去除噪声
当我运行代码时,我注意到当检测发生时(每20帧),进程稍微挂起或在检测时刻变得缓慢
负责检测的代码是:
def back_projectcam1(histm,hsv_histt,hsvt): #hist: model histogram, hsv_histt: target image
histogram, hsvt: hsv image of the target image
track_track=None
Mask = cv2.calcBackProject([hsvt],[0,1],histm,[0,180,0,256],1)
Open=cv2.morphologyEx(Mask,cv2.MORPH_OPEN,kernel1)
Filter=cv2.filter2D(Open,-1,kernel3,Open)
Close=cv2.morphologyEx(Filter,cv2.MORPH_CLOSE,kernel1)
_,thresh = cv2.threshold(Close,10,255,cv2.THRESH_BINARY)
#dilation = cv2.dilate(thresh,kernel1,iterations = 1)
contours =cv2.findContours(Mask, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
if contours[2] is not None:
cntss = imutils.grab_contours(contours)
cnt=max(cntss, key=cv2.contourArea)
x,y,w,h = cv2.boundingRect(cnt)
track_track=x,y,w,h
return track_track,thresh
我发现方法cv2.filter2D是导致检测时刻出现这种延迟的原因(这是合乎逻辑的,因为卷积在计算上很麻烦)
然而,过滤步骤对于更好的检测结果非常重要,这就是为什么我不能简单地删除它
下面的图像正在进行过滤:
下图未使用2D过滤
所以,我只是想通过加快过滤速度来提高整体性能(检测和跟踪)
那么有什么方法可以让这个方法工作得更快吗?
未经任何处理生成的遮罩图像
我不明白为什么
filter2d()
会比形态学的打开和关闭慢。什么是kernel1
和kernel3
?@烧杯。谢谢你的回复。kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))--kernel3=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))本质上,您使用filter2d()
所做的一切都是另一种扩展。膨胀将像素的值设置为内核窗口内的最大值,如果像素的任何相邻像素都不为零,则使用所有1的内核进行过滤将像素设置为非零值。您可以尝试用cv.deflate()
替换filter2d()
,看看是否得到类似的结果。如果是这样,那么您可以将morphologyEx()
操作分解为侵蚀,然后是3次扩张迭代,最后是侵蚀。我试着用扩张代替cv2.filter2D,结果更糟。我也试过你关于扩张的建议,然后是扩张的3次迭代,然后是侵蚀。它也不会给出至少与Filter2D相同的结果!你能发布你正在使用的Mask
图像以便我们重现问题吗?