我正在尝试在足球场图像上画一个圆圈。
首先,我在图像中的某些点与现实生活中的一些硬编码参考点之间创建了单应性。
然后,我将一个圆画到一个叠加(空白)图像上,该图像由上述单应性变形。
overlay = np.zeros((height, width, 3), np.uint8)
cv2.circle(overlay, center, radius, (0,0,255), 1, lineType=cv2.LINE_AA)
overlay = cv2.warpPerspective(overlay, homography, (image.shape[1], image.shape[0]))
但是,结果翘曲的圆远不是尖锐的。
我尝试过增加重叠图片的尺寸(调整了中心和半径),然后在绘制圆后重新调整大小。它有效,但未产生任何实质性改进。
如何使它看起来更清晰?
最佳答案
您需要更改插值标记,如果使用最近的标记,则将变得清晰。
overlay = cv2.warpPerspective(overlay, homography, (image.shape[1], image.shape[0]), cv2.INTER_NEAREST)
按照以下方式获取ipython中的文档:
cv2.warpPerspective?
Docstring:
warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) -> dst
. @brief Applies a perspective transformation to an image.
.
. The function warpPerspective transforms the source image using the specified matrix:
.
. \f[\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} ,
. \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right )\f]
.
. when the flag #WARP_INVERSE_MAP is set. Otherwise, the transformation is first inverted with invert
. and then put in the formula above instead of M. The function cannot operate in-place.
.
. @param src input image.
. @param dst output image that has the size dsize and the same type as src .
. @param M \f$3\times 3\f$ transformation matrix.
. @param dsize size of the output image.
. @param flags combination of interpolation methods (#INTER_LINEAR or #INTER_NEAREST) and the
. optional flag #WARP_INVERSE_MAP, that sets M as the inverse transformation (
. \f$\texttt{dst}\rightarrow\texttt{src}\f$ ).
. @param borderMode pixel extrapolation method (#BORDER_CONSTANT or #BORDER_REPLICATE).
. @param borderValue value used in case of a constant border; by default, it equals 0.
.
. @sa warpAffine, resize, remap, getRectSubPix, perspectiveTransform
Type: builtin_function_or_method
可能会有帮助的另一件事是,请注意查看图像的方式所使用的插值。如果使用matplotlib,则可以明确告诉它要使用哪种插值,如果使用的是常规图像查看器,则可能无法设置。更多的像素将使抗锯齿的“外观”更好(如您所述),但是如果放大,您仍会看到一些瑕疵。这是一个更完整的示例。
import numpy as np
import matplotlib.pyplot as plt
import cv2
height = 600
width = 600
center = (300, 300)
radius = 40
image = np.zeros((720, 1080, 3), np.uint8)
homography = np.array([[2, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.float32)
overlay = np.zeros((height, width, 3), np.uint8)
cv2.circle(overlay, center, radius, (0,0,255), 1, lineType=cv2.LINE_4)
output = cv2.warpPerspective(overlay, homography, (image.shape[1], image.shape[0]), cv2.INTER_NEAREST)
plt.imshow(overlay, interpolation='nearest')
plt.figure()
plt.imshow(output, interpolation='nearest')
关于python - 在OpenCV中绘制扭曲的圆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59314520/