Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使cv2.filter2D更快?_Python_Opencv_Image Processing_Filter_Object Detection - Fatal编程技术网

Python 如何使cv2.filter2D更快?

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):

我正在做一个项目,我必须用颜色作为物体的特征表示来检测和跟踪小型汽车(见下图)。对于检测,我使用了直方图反投影 见:

对于跟踪,我使用了KCF(核化相关滤波器)

如果我们看一下检测算法的步骤,它在获得概率分布的二值图像后应用
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
图像以便我们重现问题吗?