考虑下图:
这是交通视频片段中的一帧。
我想做的是,只裁剪迎面而来的流量,并对其进行分析。我想要一种快速有效的方法,通过提供某些坐标,我可以提取多边形。
我正在研究 OpenCV 和 Python。
编辑:
我看到的一个选项是将图像视为 Numpy 数组并使用 for 循环来提取某些元素,但这不会有效,我不知道它是否合适。
考虑下图:
这是交通视频片段中的一帧。
我想做的是,只裁剪迎面而来的流量,并对其进行分析。我想要一种快速有效的方法,通过提供某些坐标,我可以提取多边形。
我正在研究 OpenCV 和 Python。
编辑:
我看到的一个选项是将图像视为 Numpy 数组并使用 for 循环来提取某些元素,但这不会有效,我不知道它是否合适。
我建议使用 Contours 提取您感兴趣的区域(您想要的任何形状)。请参阅此文档:绘制轮廓
您的方法应如下所示:
示例代码:
#Function
def on_mouse(event, x, y, flags,(cPts,overlayImage,resetImage)):
if event==cv.CV_EVENT_LBUTTONUP:
cPts[0].append([x,y])
cv2.circle(overlayImage,(x,y),5,(255),-1)
elif event==cv.CV_EVENT_RBUTTONUP:
cPts[0]=[]
print cPts
overlayImage[:]=resetImage[:]
#Main Program
cvImage=cv2.imread(inputImageFilePath)
grayscaleImage=cv2.cvtColor(cvImage,cv.CV_BGR2GRAY)
overlayImage=np.copy(grayscaleImage)
cv2.namedWindow('preview')
cPts=[[]]
cv2.setMouseCallback('preview',on_mouse,(cPts,overlayImage,grayscaleImage))
opacity=0.4
while True:
displayImage=cv2.addWeighted(overlayImage,opacity,grayscaleImage,1-opacity,0)
cv2.imshow('preview',displayImage)
keyPressed=cv2.waitKey(5)
if keyPressed==27:
break
elif keyPressed==32:
print cPts
cv2.drawContours(overlayImage,np.array(cPts),0,255)
maskImage=np.zeros_like(grayscaleImage)
cv2.drawContours(maskImage,np.array(cPts),0,255,-1)
extractedImage=np.bitwise_and(grayscaleImage,maskImage)
cv2.imshow('extractedImage',extractedImage)
cv2.destroyAllWindows()
好吧,我建议您执行以下操作:
cv2.threshold
)cv2.findContours
以及更多)如果你有视频流或类似的东西,你也可以使用运动检测之类的东西。
您可能会发现一些有用的链接: