python 仿射变换 warpPerspective 获取目标

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

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

在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)

 看一下变换矩阵

四.运行结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值