python - OpenCv 形状检测到形状转换(Python)
问题描述
如何拍摄已在 openCV 上使用形状检测算法检测到的正方形图像,并以最快的方式将其“转换”为三角形?
例如说谷歌的一张图片是一个正方形,我想看看把它变成三角形的最快方法。我将如何研究这个?我已经查找了 openCV 的形状转换,但它主要包括放大图像和更改视图。
解决方案
将矩形扭曲为三角形的一种方法是在 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 作为前两个输出点,我得到:
推荐阅读
- node.js - 无法在nodejs中获取基板序列号
- javascript - 删除字符
- android - 是否可以从应用程序获取 cookie?
- javascript - 我正在努力编辑我的页面的 DOM 元素
- angular - 如何从组件添加状态属性
- android - 如果没有连接,调用请求的最佳做法是每 4-5 秒重复一次调用,直到我们得到响应,使用 Rx
- dart - 如何将资产图像转换为文件?
- sql - Microsoft SQL Server 接受变量名称中的空白 - 为什么?
- node.js - 将 MongoDB 中的 JSON 文件导入 Nodejs 应用程序的最佳实践
- android - WebView 在显示来自 Google Docs 的 PDF 时随机打开白屏