python - 提取多边形形状的子图像

标签 python opencv python-2.7

考虑下图:

Image of traffic

这是交通视频片段中的一帧。

我想做的是,只裁剪迎面而来的交通,并对其进行分析。我想要一种快速高效的方法,通过提供特定坐标,我可以使用该方法提取多边形。

我正在研究 OpenCV 和 Python。

编辑:
我看到的一种选择是将图像视为 Numpy 数组并使用 for 循环来提取某些元素,但这效率不高,我不知道这样做是否合适。

最佳答案

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

您的方法应该如下:

  1. 通过将 MouseEventListener 附加到窗口,在图像本身上标记构成坐标的点。
  2. 使用创建蒙版图像。 (全为零)
  3. 使用这些坐标集,使用 cv2.drawContours() 方法在蒙版图像上绘制所需的形状并用白色 (255) 填充它。
  4. 对原始灰度图像执行按位与运算。

示例代码:

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

关于python - 提取多边形形状的子图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15403580/

相关文章:

opencv - 指定openCV中的读取路径

python - 如何使用网站的用户名和密码在 Python 中使用网络抓取

python - 导入Python命名空间包的本地测试版本

python - 按以平均值为中心的标准偏差对 Pandas 列值进行分箱?

python - Keras 测试后预测值

java - 从 Twitter JSON Feed 中提取信息

python - 如何将此代码从 Python 2.7 转换为 Python 3.5 以修复 ---> AttributeError : '_io.TextIOWrapper' object has no attribute 'next'

android - Kivy 和 buildozer "Permission denied"

algorithm - tv logo自动查找/定位/检测的建议或方法

android-layout - 带有自定义布局的 opencv 实现(在 SurfaceView 上)