基于opencv的交互式-透视变换(perspective transformation)附代码

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

基于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, 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hehedadaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值