两个多边形 贴图

news2024/9/20 22:40:48

目录

两个多边形 贴图

两个多边形粘贴


两个多边形 贴图

import cv2
import numpy as np
from PIL import Image, ImageDraw


# 给矩形裁剪区域加上圆角
def add_round_corners(image, radius):
    mask = Image.new('L', image.size, 0)
    draw = ImageDraw.Draw(mask)
    draw.rounded_rectangle((0, 0) + image.size, radius=radius, fill=255)

    # 将裁剪后的图像添加alpha通道
    result = image.copy()
    result.putalpha(mask)

    return result


# 裁剪旋转矩形
def crop_rotated_rectangle(image, rect_points):
    # 获取矩形的宽高
    rect_width = int(np.linalg.norm(rect_points[0] - rect_points[1]))
    rect_height = int(np.linalg.norm(rect_points[1] - rect_points[2]))

    # 定义矩形的目标位置
    src_pts = rect_points.astype("float32")
    dst_pts = np.array([[0, rect_height - 1], [0, 0], [rect_width - 1, 0], [rect_width - 1, rect_height - 1]], dtype="float32")

    # 计算透视变换矩阵并应用变换
    M = cv2.getPerspectiveTransform(src_pts, dst_pts)
    cropped = cv2.warpPerspective(image, M, (rect_width, rect_height))

    return cropped


# 将图像A中的旋转矩形裁剪圆角,并粘贴到图像B的旋转矩形中
def crop_and_paste_rounded_image(image_a, image_b, poly_a, poly_b, radius):
    # 多边形A的顶点 (最小外接矩形顶点)
    rect_points_a = np.array(poly_a)

    # 多边形B的顶点 (最小外接矩形顶点)
    rect_points_b = np.array(poly_b)

    for point in rect_points_a:
        cv2.circle(image_b, point, 5, (0, 0, 255), -1)  # 画顶点

    for point in rect_points_b:
        cv2.circle(image_b, point, 5, (0, 255, 0), -1)  # 画顶点

    # 裁剪图像A的旋转矩形
    cropped_a = crop_rotated_rectangle(image_a, rect_points_a)

    # 将裁剪后的图像转换为Pillow格式,并加上圆角
    cropped_a_pil = Image.fromarray(cv2.cvtColor(cropped_a, cv2.COLOR_BGR2RGBA))
    rounded_a = add_round_corners(cropped_a_pil, radius)

    # 将图像A的圆角部分转换为OpenCV图像
    rounded_a_cv = cv2.cvtColor(np.array(rounded_a), cv2.COLOR_RGBA2BGRA)

    # 获取图像B的旋转矩形的宽高
    rect_width_b = int(np.linalg.norm(rect_points_b[0] - rect_points_b[1]))
    rect_height_b = int(np.linalg.norm(rect_points_b[1] - rect_points_b[2]))

    # 定义图像A的裁剪区域和图像B的目标区域的顶点
    src_pts_a = np.array([[0, rect_height_b - 1], [0, 0], [rect_width_b - 1, 0], [rect_width_b - 1, rect_height_b - 1]], dtype="float32")
    dst_pts_b = rect_points_b.astype("float32")

    # 计算透视变换矩阵并应用
    M_b = cv2.getPerspectiveTransform(src_pts_a, dst_pts_b)
    transformed_a = cv2.warpPerspective(rounded_a_cv, M_b, (image_b.shape[1], image_b.shape[0]), None, cv2.INTER_LINEAR, borderMode=cv2.BORDER_TRANSPARENT)

    # 将变换后的图像A粘贴到图像B
    mask = transformed_a[:, :, 3]  # alpha通道作为mask
    mask_inv = cv2.bitwise_not(mask)
    img_b_bg = cv2.bitwise_and(image_b, image_b, mask=mask_inv)
    img_a_fg = cv2.bitwise_and(transformed_a, transformed_a, mask=mask)
    result = cv2.add(img_b_bg, img_a_fg[:, :, :3])
    return result

# 示例使用
image_a_path = r"000.jpg"
image_b_path = r"007.jpg"# 图像B的路径

# 给定的两个多边形顶点 (最小外接矩形)

poly_a = [[590, 268], [581, 331], [712, 365], [744, 263]]
poly_b = [[760, 267], [748, 359], [929, 409], [954, 273]]

radius = 20  # 圆角半径

image_a = cv2.imread(image_a_path)
image_b = cv2.imread(image_b_path)
# 执行裁剪并粘贴操作
result=crop_and_paste_rounded_image(image_a, image_b, poly_a, poly_b, radius)

cv2.imshow('result', result)
cv2.waitKey(0)

两个多边形粘贴

import cv2
import numpy as np
from PIL import Image, ImageDraw

# 给矩形裁剪区域加上圆角
def add_round_corners(image, radius):
    mask = Image.new('L', image.size, 0)
    draw = ImageDraw.Draw(mask)
    draw.rounded_rectangle((0, 0) + image.size, radius=radius, fill=255)

    # 将裁剪后的图像添加alpha通道
    result = image.copy()
    result.putalpha(mask)

    return result

# 裁剪旋转矩形
def crop_rotated_rectangle(image, rect_points):
    # 获取矩形的宽高
    rect_width = int(np.linalg.norm(rect_points[0] - rect_points[1]))
    rect_height = int(np.linalg.norm(rect_points[1] - rect_points[2]))

    # 定义矩形的目标位置
    src_pts = rect_points.astype("float32")
    dst_pts = np.array([[0, rect_height - 1], [0, 0], [rect_width - 1, 0], [rect_width - 1, rect_height - 1]],
                       dtype="float32")

    # 计算透视变换矩阵并应用变换
    M = cv2.getPerspectiveTransform(src_pts, dst_pts)
    cropped = cv2.warpPerspective(image, M, (rect_width, rect_height))

    return cropped

# 确保多边形点顺序按顺时针排列
def order_points(pts):
    rect = np.zeros((4, 2), dtype="float32")
    s = pts.sum(axis=1)
    diff = np.diff(pts, axis=1)

    # 顺时针:左上 -> 右上 -> 右下 -> 左下
    rect[0] = pts[np.argmin(s)]  # 左上
    rect[2] = pts[np.argmax(s)]  # 右下
    rect[1] = pts[np.argmin(diff)]  # 右上
    rect[3] = pts[np.argmax(diff)]  # 左下

    return rect

# 将图像A中的旋转矩形裁剪圆角,并粘贴到图像B的旋转矩形中
def crop_and_paste_rounded_image(image_a, image_b, poly_a, poly_b, radius):
    # 多边形A的顶点 (最小外接矩形顶点),按顺时针排列
    rect_points_a = order_points(np.array(poly_a))

    # 多边形B的顶点 (最小外接矩形顶点),按顺时针排列
    rect_points_b = order_points(np.array(poly_b))

    # 裁剪图像A的旋转矩形
    cropped_a = crop_rotated_rectangle(image_a, rect_points_a)

    # 将裁剪后的图像转换为Pillow格式,并加上圆角
    cropped_a_pil = Image.fromarray(cv2.cvtColor(cropped_a, cv2.COLOR_BGR2RGBA))
    rounded_a = add_round_corners(cropped_a_pil, radius)

    # 将图像A的圆角部分转换为OpenCV图像
    rounded_a_cv = cv2.cvtColor(np.array(rounded_a), cv2.COLOR_RGBA2BGRA)

    # 定义图像A的裁剪区域的四个顶点 (src_pts_a) 和目标区域 (dst_pts_b) 的顶点
    rect_width_a = rounded_a_cv.shape[1]
    rect_height_a = rounded_a_cv.shape[0]

    # 源点 (从图像A裁剪后的矩形)
    src_pts_a = np.array([[0, 0], [rect_width_a - 1, 0], [rect_width_a - 1, rect_height_a - 1], [0, rect_height_a - 1]],
                         dtype="float32")

    # 目标点 (图像B的目标多边形)
    dst_pts_b = rect_points_b.astype("float32")

    # 计算透视变换矩阵并应用
    M_b = cv2.getPerspectiveTransform(src_pts_a, dst_pts_b)
    transformed_a = cv2.warpPerspective(rounded_a_cv, M_b, (image_b.shape[1], image_b.shape[0]), None, cv2.INTER_LINEAR,
                                        borderMode=cv2.BORDER_TRANSPARENT)

    # 将变换后的图像A粘贴到图像B
    mask = transformed_a[:, :, 3]  # alpha通道作为mask
    mask_inv = cv2.bitwise_not(mask)
    img_b_bg = cv2.bitwise_and(image_b, image_b, mask=mask_inv)
    img_a_fg = cv2.bitwise_and(transformed_a, transformed_a, mask=mask)
    result = cv2.add(img_b_bg, img_a_fg[:, :, :3])
    return result

# 示例使用
image_a_path = r"000.jpg"
image_b_path = r"007.jpg"  # 图像B的路径

# 给定的两个多边形顶点 (最小外接矩形)
poly_a = [[590, 268], [581, 331], [712, 365], [744, 263]]  # 图像A的最小外接矩形顶点
poly_b = [[760, 267], [748, 359], [929, 409], [954, 273]]  # 图像B的最小外接矩形顶点

radius = 20  # 圆角半径

image_a = cv2.imread(image_a_path)
image_b = cv2.imread(image_b_path)
# 执行裁剪并粘贴操作
result = crop_and_paste_rounded_image(image_a, image_b, poly_a, poly_b, radius)

cv2.imshow('result', result)
cv2.waitKey(0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构-差分】力扣1589. 所有排列中的最大和

有一个整数数组 nums ,和一个查询数组 requests ,其中 requests[i] [starti, endi] 。第 i 个查询求 nums[starti] nums[starti 1] … nums[endi - 1] nums[endi] 的结果 ,starti 和 endi 数组索引都是 从 0 开始 的。 你可以任意排列…

【Java面向对象二】static的注意事项

文章目录 前言一、关于static的三个注意点总结 前言 记录static的学习注意事项。 一、关于static的三个注意点 1、类方法中可以直接访问类的成员,不可用直接访问实例成员。 2、实例方法中既可以直接访问类成员,也可以直接访问实例成员。 3、实例方法…

105.WEB渗透测试-信息收集-FOFA语法(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:104.WEB渗透测试-信息收集-FOFA语法(4) 还有一个能查看信息的地方…

linux下的分布式Minio部署实践

Linux下的分布式Minio部署实践 分布式Minio部署可以将多块硬盘(位于相同机器或者不同机器)组成一个对象存储服务,避免单机环境下硬盘容量不足、单点故障等问题。 1. 简介 在当前的云计算和大数据时代,IT系统通常的设计理念都是…

英伟达Jim Fan预测:未来2~3年机器人将迎来“GPT-3时刻”

在这个科技不断进步的时代,我们终将迎来“与机器人共存”的未来。你认为,未来会是人机和平共处,还是《终结者》式未来? 随着科技发展,这个未来似乎近在咫尺。昨日外媒 The Decoder 发文报道,在最近的一次红…

Jenkins自动化部署后端项目看这篇就够了

本文主要讲解,使用Jenkins自动化部署后端工程。讲解怎么自动化部署前后的分离项目中的后端工程。 前提条件:本地需要Jenkins,如果你不知道怎么安装,可以看我的另外一篇文章。 Jenkins实现自动部署的步骤: 先拉取git…

Jboss 低版本JMX Console未授权

漏洞描述 此漏洞主要是由于JBoss中/jmx-console/HtmlAdaptor路径对外开放,并且没有任何身份验证机制,导致攻击者可以进⼊到 jmx控制台,并在其中执⾏任何功能。 影响范围 Jboss4.x以下 环境搭建 cd vulhub-master/jboss/CVE-2017-7504 d…

力扣题解2414

大家好,欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述(中等): 最长的字母序连续字符串的长度 ​ ​字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 "abcdefghijklm…

linux 最简单配置免密登录

需求:两台服务器互信登录需要拉起对端服务 ip: 192.168.1.133 192.168.1.137 一、配置主机hosts,IP及主机名,两台都需要 二、192.168.1.137服务器,生成密钥 ssh-keygen -t rsa三、追加到文件 ~/.ssh/authorized_key…

分布式中间件-Pika一个高效的分布式缓存组件

文章目录 Pika简介Pika特性Pika解决的问题及应用场景Pika架构之存储引擎部署模式1、主从模式2、分布式集群模式 Pika快速上手1、二进制包方式2、源码编译方式2.1 支持的平台2.2 依赖的库软件2.3 编译过程2.4 启动 Pika2.5 清空已编译的结果2.6 Pika 的开发调试 3、容器化3.1 使…

【2025】儿童疫苗接种预约小程序(源码+文档+解答)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

【C++指南】inline内联函数详解

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 引言 C为什么引入了inline来替代C语言中的宏 inline的基本用法 定义inline函数 inline的优势与…

DAY20信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间

2.自动化-网络空间-AsamF 1.去GitHub上下载项目之后使用CMD打开 2.输入命令AsamF_windows_amd64.exe -v生成配置文件 3.AsamF会在~/.config/asamf/目录下生成config.json文件 C:\Users\Acer\.config\asamf 5.根据文档输入命令去查询所需信息(已经没有用了&#x…

C/C++通过CLion2024进行Linux远程开发保姆级教学

目前来说,对Linux远程开发支持相对比较好的也就是Clion和VSCode了,这两个其实对于C和C语言开发都很友好,大可不必过于纠结使用那个,至于VS和QtCreator,前者太过重量级了,后者更是不用说,主要用于…

解锁自动化新境界:KeymouseGo,让键盘和鼠标动起来!

文章目录 解锁自动化新境界:KeymouseGo,让键盘和鼠标动起来!背景:为何选择KeymouseGo?KeymouseGo简介安装KeymouseGo简单函数使用应用场景常见问题与解决方案总结 解锁自动化新境界:KeymouseGo,…

ISSTA 2024现场精彩:“杰出论文奖”超半数属于中国学者

ISSTA会议是软件工程领域中最具影响力的国际会议之一,也是中国计算机学会(CCF)推荐的A类会议。 第33届ISSTA会议已于奥地利维也纳圆满结束,这场盛会已经吸引了众多来自学术界和工业界的软件测试专家、研究人员和工程师&#xff0c…

学习C++的第三天!

C对C的函数部分的扩充 封装 #include <iostream> #include <memory.h> #include <stdlib.h> #include <string.h> using namespace std; using datatype int; //封装一个顺序表 class SeqList { private:datatype* ptr; //指向堆区空间的起始…

基于嵌入式的智能物流柜( 触摸屏/0.96寸oled屏)

演示 智能物流柜&#xff08;基础版&#xff09; 智能物流柜&#xff08;升级版&#xff09; 前言 这是本人在大二在学校接的一个简单的实验室项目&#xff0c;之前发布了一个&#xff0c;由于那是在暑假&#xff0c;家里器材有限&#xff0c;代码敲完之后&#xff0c;用面包板…

PyTorch深度学习快速入门教程【土堆】基础知识篇

Juptyer 版本&#xff1a; Python 3.9.19Pytorch 2.4.1 (pytorch0) C:\Users\25694>conda install nb_conda_kernels(pytorch0) C:\Users\25694>jupyter notebook使用conda环境的pytorch&#xff1a; 成功解决python.exe无法找到程序入口 无法定位程序输入点 shifte…

机器学习-深度学习数据集之打架斗殴识别数据集

关于“打架识别数据集”&#xff0c;这是一个专门设计用于训练计算机视觉模型以识别打架、摔倒以及持械行为的数据集。此类数据集对于开发安全监控系统至关重要&#xff0c;可以帮助在公共场所如学校、酒吧或地铁站等地及时发现潜在的暴力事件&#xff0c;从而快速采取行动来防…