提取多边形形状的子图像

md1*_*nox 4 python opencv python-2.7

请考虑以下图像:

交通的形象

这是来自交通视频片段的帧.

我想要做的是,只裁剪迎面而来的交通,并进行分析.我想要一种快速有效的方法,通过提供某些坐标,我可以提取多边形.

我正在研究OpenCV和Python.

编辑:
我看到的一个选项是将图像视为Numpy数组并使用for循环来提取某些元素,但这不会有效,我不知道它是否适合做.

Col*_*ino 5

我建议使用Contours提取您感兴趣的区域(您想要的任何形状).请参阅此文档:绘制轮廓

您的方法应如下:

  1. 通过将MouseEventListener附加到Window,在图像本身上标记构成坐标的点.
  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()
Run Code Online (Sandbox Code Playgroud)