python 仿射变换 warpPerspective 获取目标

该文章介绍了如何利用Python的OpenCV库对图片中的物体进行识别和旋转。首先,通过Canny算法提取图像边缘,然后找到轮廓并逼近获取四个坐标点。接着,计算物体的长宽并构建目标坐标,通过仿射变换得到正方形的物体。最后,应用getPerspectiveTransform和warpPerspective函数完成旋转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何将图片中的物品提取出来,并旋转一定角度?

预实现效果:将菱形变为正方形

在python中针对于图形设计的opencv库可以轻松实现这点,首先我们先讲解步骤:

步骤:

一.识别物体
    1.读取图片
    2.提取边缘
    3.寻找轮廓

二.寻找坐标点
    1.轮廓逼近获取四个坐标点
    2.使用欧式距离计算小票长宽
    3.根据长宽构建转换后的坐标点

三.仿射变换
    1.使用转换前后的坐标矩阵获取转换矩阵
    2.通过转换矩阵获取物体主体,并将其转换至正常阅读方向

一.识别物体

import cv2
import numpy as np

# 自定义展示图片函数
def cv_show(img, title='title', waittime=0):
    cv2.imshow(title, img)
    cv2.waitKey(waittime)
    cv2.destroyWindow(title)

# 读入数据
image = cv2.imread('ract.png')

# 检测边缘
edged = cv2.Canny(image, 75, 200)  

# 轮廓检测
contours, _ = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

查看 原图,边缘检测图,轮廓检测信息

cv_show(image)
cv_show(edged)
print(len(contours))

 

 

二.寻找坐标点

# 轮廓逼近
peri = cv2.arcLength(contours[0], True)
approx = cv2.approxPolyDP(contours[0], 0.02 * peri, True).reshape(4, 2)

# 初始物品矩阵
# 顺时针,最顶开始|四个点的矩阵
approx = np.array(approx, dtype="float32")

# 获取矩阵长,宽
dst_w = int(((approx[0][0] - approx[3][0]) ** 2 + (approx[0][1] - approx[3][1]) ** 2) ** 0.5)
dst_h = int(((approx[0][0] - approx[1][0]) ** 2 + (approx[0][1] - approx[1][1]) ** 2) ** 0.5)


# 欲转换矩阵
dst = np.array([
    [0, 0],
    [0, dst_h],
    [dst_w, dst_h],
    [dst_w, 0]
], dtype="float32")

三.仿射变换

M = cv2.getPerspectiveTransform(approx, dst)
warp = cv2.warpPerspective(image, M, (dst_w, dst_h))

cv_show(warp)

 看一下变换矩阵

四.运行结果

Python中,可以使用OpenCV库实现对两张图像进行仿射变换,具体步骤如下: 1. 导入OpenCV库 ``` import cv2 ``` 2. 读入原始图像和目标图像 ``` src = cv2.imread("src.jpg") dst = cv2.imread("dst.jpg") ``` 3. 提取原始图像和目标图像中的特征点 ``` # 创建SIFT对象 sift = cv2.xfeatures2d.SIFT_create() # 用SIFT算法检测特征点并计算特征描述子 kp1, des1 = sift.detectAndCompute(src, None) kp2, des2 = sift.detectAndCompute(dst, None) ``` 4. 在原始图像和目标图像中匹配特征点 ``` # 创建BFMatcher对象 bf = cv2.BFMatcher() # 匹配特征点 matches = bf.knnMatch(des1, des2, k=2) ``` 5. 通过RANSAC算法估计变换矩阵 ``` # 获取匹配点对 good = [] for m, n in matches: if m.distance < 0.75 * n.distance: good.append(m) # 计算变换矩阵 src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) ``` 6. 对原始图像进行仿射变换 ``` # 对原始图像进行仿射变换 rows, cols, ch = src.shape warped = cv2.warpPerspective(src, M, (cols, rows)) # 将原始图像和目标图像拼接在一起显示 result = cv2.addWeighted(warped, 0.5, dst, 0.5, 0) cv2.imshow("result", result) cv2.waitKey(0) ``` 在上述代码中,使用了SIFT算法检测特征点,BFMatcher算法匹配特征点,RANSAC算法估计变换矩阵,warpPerspective函数对原始图像进行仿射变换。你也可以使用其他的特征点检测算法、特征点匹配算法和变换估计算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值