基于opencv的交互式-透视变换(perspective transformation)附代码
前言:
最近在尝试透视变换的实际作用,看上篇paper也是提到了透视变换,但是一直不知道实际操作,到底有什么样的效果:
一整张图,选定四个点,以及将要变换的四个点,之后对整个画面的变换会有多大畸变。
畸变后的图像能不能用来做识别任务?
在github上找了一圈,有一个大佬的做了对图像处理可视化的项目,但是刚好透视变换没做。
我在他的基础上加了一个透视变换的功能,并且加上了鼠标交互的操作。
参考链接:
参考链接:https://github.com/dapsjj/dealAllPicture
简介:
python处理图片,包括图片平移、图片旋转、图片缩放、图片翻转、透视变换。选择图片中的四个关键点和将要变换的点,用来生成新的透视图
Use translate,scale,flip,rotation to turn one picture into multiple pictures.
单应性变换必须四点共面!
四点必须共面,否则无法提供8值约束!
进行ptc变换也是会错乱!
效果:




代码:
import os
import numpy as np
import cv2
import tkinter.filedialog
import time
import tkinter.messagebox
import re
import matplotlib.pyplot as plt
'''
上传照片,批量处理并保存,包括图片平移、图片旋转、图片缩放、图片翻转、透视变换。
'''
# dir = r'D:/deal_pics/' + time.strftime('%Y-%m-%d')
dir = time.strftime('%Y-%m-%d')
filenames='right'
def get_files():
global filenames
filenames = tkinter.filedialog.askopenfilenames(title="选择图片", filetypes=[('图片', 'jpg'), ('图片', 'png')])
CN_Pattern = re.compile(u'[\u4E00-\u9FBF]+')
JP_Pattern = re.compile(u'[\u3040-\u31fe]+')
if filenames:
if not os.path.exists(dir):
os.makedirs(dir)
CN_Match = CN_Pattern.search(str(filenames))
JP_Match = JP_Pattern.search(str(filenames))
if CN_Match:
filenames=None
tkinter.messagebox.showinfo('提示','文件路径或文件名不能含有中文,请修改!')
return
elif JP_Match:
filenames = None
tkinter.messagebox.showinfo('提示','文件路径或文件名不能含有日文,请修改!')
return
if not os.path.exists(dir):
os.makedirs(dir)
def translate(image, x, y):
# 定义平移矩阵
M = np.float32([[1, 0, x], [0, 1, y]])
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
# 返回转换后的图像
return shifted
def pic_translate():
if not filenames:
tkinter.messagebox.showinfo('提示', '请先选择图片才能进行图片平移!')
if not os.path.exists(dir):
os.makedirs(dir)
if filenames:
for filename in filenames:
if filename:
img = cv2.imread(filename)
newFile = filename.split('/')[-1]
name = newFile.split('.')[0]
filetype = newFile.split('.')[-1]
# 将原图分别做上、下、左、右平移操作
Downshifted25 = translate(img, 0, 25)
cv2.imwrite(dir + '/' + name + '_Downshifted25.' + filetype, Downshifted25) # 保存
Upshifted25 = translate(img, 0, -25)
cv2.imwrite(dir + '/' + name + '_Upshifted25.' + filetype, Upshifted25) # 保存
Rightshifted25 = translate(img, 25, 0)
cv2.imwrite(dir + '/' + name + '_Rightshifted25.' + filetype, Rightshifted25) # 保存
Leftshifted25 = translate(img, -25, 0)
cv2.imwrite(dir + '/' + name + '_Leftshifted25.' + filetype, Leftshifted25) # 保存
Downshifted50 = translate(img, 0, 50)
cv2.imwrite(dir + '/' + name + '_Downshifted50.' + filetype, Downshifted50) # 保存
Upshifted50 = translate(img, 0, -50)
cv2.imwrite(dir + '/' + name + '_Upshifted50.' + filetype, Upshifted50) # 保存
Rightshifted50 = translate(img, 50, 0)
cv2.imwrite(dir + '/' + name + '_Rightshifted50.' + filetype, Rightshifted50) # 保存
Leftshifted50 = translate(img,
交互式透视变换

本文介绍如何使用OpenCV实现交互式的透视变换,通过选取图像上的四个关键点及其目标位置,完成图像的透视校正。代码实现了从图片加载到透视变换的全过程,支持鼠标交互选取点位。
最低0.47元/天 解锁文章
1万+





