0

我将举一个例子我有一张游泳池的照片有一些轨道我只想拍摄三个中间轨道现在将图像切割成空中飞人形状的最佳方法是什么然后如何拍摄这个空中飞人并尝试适合它到两侧(上下)之间的比例相对相似的窗口大小

该示例的图像

4

2 回答 2

0

你可以使用imutils.four_point_transform函数。你可以在这里阅读更多关于它的信息。

基本用法是在精巧的边缘检测图像上查找文档轮廓(同样,您可以使用imutils我链接的包),找到该图像上的轮廓,然后应用于four_point_transform该轮廓。

编辑:如何使用canny边缘检测和four_point_transform

要查找轮廓,您可以使用openCVimutils ,如下所示:

cnts = cv2.findContours(edged_image.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

现在,当您拥有轮廓时,只需遍历并查看哪个是最大的并且有四个点(4 个顶点)。然后只需将图像和轮廓传递给four_point_transform函数,如下所示:

image_2 = four_point_transform(image, biggest_contour)

而已。

于 2019-01-02T14:01:21.693 回答
0

我修改了这个例子

结果:

在此处输入图像描述

import numpy as np 
import cv2

# load image
img = cv2.imread('pool.jpg')
# resize to easily fit on screen
img = cv2.resize(img,None,fx=0.5, fy=0.5, interpolation = cv2.INTER_CUBIC)
# determine cornerpoints of the region of interest
pts1 = np.float32([[400,30],[620,30],[50,700],[1000,700]])
# provide new coordinates of cornerpoints
pts2 = np.float32([[0,0],[300,0],[0,600],[300,600]])

# determine transformationmatrix
M = cv2.getPerspectiveTransform(pts1,pts2)
# apply transformationmatrix
dst = cv2.warpPerspective(img,M,(300,600))

# display image
cv2.imshow("img", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

请注意 rezise 功能,您可能希望删除该线,但您必须相应地更改角点的坐标。我为新图像(300,600)使用了梯形底部的高度和宽度。

您可以根据需要调整角点和最终图像大小。

于 2019-01-02T14:27:16.560 回答