首页 > 解决方案 > OpenCv 形状检测到形状转换(Python)

问题描述

如何拍摄已在 openCV 上使用形状检测算法检测到的正方形图像,并以最快的方式将其“转换”为三角形?

例如说谷歌的一张图片是一个正方形,我想看看把它变成三角形的最快方法。我将如何研究这个?我已经查找了 openCV 的形状转换,但它主要包括放大图像和更改视图。

标签: pythonopencvcomputer-vision

解决方案


将矩形扭曲为三角形的一种方法是在 Python/OpenCV 中使用透视变换。

  • 读取输入
  • 获取输入控制点作为输入图像的4个角
  • 将输出控制点定义为靠近输出顶部中心的顶部 2 个点(-+1 或您想要的任何分隔),底部 2 个点与输入底部两个点相同
  • 从控制点计算透视变换矩阵
  • 将输入扭曲到输出
  • 保存结果。


输入:

在此处输入图像描述

import cv2
import numpy as np

# Read source image.
img_src = cv2.imread('lena.png')
hh, ww = img_src.shape[:2]

# Four corners of source image ordered clockwise from top left corner
# Coordinates are in x,y system with x horizontal to the right and y vertical downward
pts_src = np.float32([[0,0], [ww-1,0], [ww-1,hh-1], [0,hh-1]])

# Four corners of destination image.
pts_dst = np.float32([[ww/2-1, 0], [ww/2+1,0], [ww-1,hh-1], [0,hh-1]])

# Get perspecive matrix if only 4 points
m = cv2.getPerspectiveTransform(pts_src,pts_dst)

# Warp source image to destination based on matrix
img_out = cv2.warpPerspective(img_src, m, (ww,hh), cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(255, 255, 255))

# Save output
cv2.imwrite('lena_triangle.png', img_out)

# Display result
cv2.imshow("Warped Source Image", img_out)
cv2.waitKey(0)
cv2.destroyAllWindows()


结果(尽管可能不是您想要的)。

在此处输入图像描述

如果将前两个输出点分开更大的差异,那么它看起来更像输入。

例如,使用 ww/2-10 和 ww/2+10 而不是 ww/2-1 和 ww/2+1 作为前两个输出点,我得到:

在此处输入图像描述


推荐阅读