如何将图片中的物品提取出来,并旋转一定角度?
预实现效果:将菱形变为正方形
在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)
看一下变换矩阵