2013-03-14 149 views
3

考虑以下图像的形状的子图像:提取多边形

Image of traffic

这是从业务的视频镜头的帧。

我想要做的是只剪出即将到来的流量并分析它。我想要一个快速高效的方法,通过提供某些坐标,我可以提取多边形等。

我正在研究OpenCV和Python。

编辑:
一个选择我看到的是处理图像numpy的数组,并使用for循环中提取某些元素,但不会是有效的,我不知道,如果它的正确的事情。

+0

@Schoolboy对不起,更新的问题 – md1hunox 2013-03-14 08:04:26

回答

4

我会建议使用轮廓提取您感兴趣的区域(任何你想要的形状)。 请参阅本文档:Drawing Contours

你的方法应该如下:

  1. 标志点,使你的坐标无论是图像本身由MouseEventListener连接到窗口。
  2. 通过使用创建一个面具图像。 (全零)
  3. 使用这些坐标集,使用cv2.drawContours()方法在“蒙版图像”上绘制所需的形状,并用白色(255)填充它。
  4. 使用原始灰度图像进行Bitwise_And操作。

示例代码:

#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() 
+0

谢谢!解决了它 – md1hunox 2013-03-16 15:47:09

1

我可以提出一个版本的算法:

  1. 第一丢弃图像的一部分,你是不感兴趣,如果一个静态的摄像头,你可以手动计算该区域。在其他情况下尝试使用Line Detection Algorithm
  2. 然后用cvThreshold抽取背景(使用background extraction的很好例子)。
  3. 提取后,您可以找到轮廓并分析它们的形状以区分物体(汽车,人等)。

希望这会有所帮助。

1

好吧,我建议你做这样的事情:

  1. 独立的图像分成不同的区域,根据不同的事情主要是照明。
  2. 然后,对于每个区域,应用阈值将重要区域(交通)与不重要区域(树木等)分开。 (cv2.threshold
  3. 使用的轮廓,你可以从其他的东西区分车辆。(cv2.findContours和更多)

如果您有视频或类似的东西流,你可以使用像运动检测过。

有些链接可能对您有用: