两个多边形 贴图

目录

两个多边形 贴图

两个多边形粘贴


两个多边形 贴图

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粘贴到图像Bmask = transformed_a[:, :, 3]  # alpha通道作为maskmask_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 math
import randomimport cv2
import numpy as np
from PIL import Image, ImageDrawdef rotate_image(image, angle):(h, w) = image.shape[:2]center = (w // 2, h // 2)M = cv2.getRotationMatrix2D(center, angle, 1.0)rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 0, 0))return rotateddef mask_polygon(image, poly_a):debug=Falsebox1_x, box1_y, box1_w, box1_h = cv2.boundingRect(np.asarray(poly_a))mask = np.zeros(image.shape[:2], dtype=np.uint8)# 填充多边形区域为白色 (255),其余区域为黑色 (0)cv2.fillPoly(mask, [np.asarray(poly_a)], 255)masked_image = np.zeros_like(image)masked_image[mask == 255] = image[mask == 255]result = masked_image[box1_y:box1_y+box1_h, box1_x:box1_x+box1_w]if debug:cv2.imshow("debug",result)cv2.waitKey(0)angle = random.uniform(-15, 15)result_2 = rotate_image(result, angle)return result_2def clip_polygon_to_image(poly_a, image_shape):h, w = image_shape[:2]  # 获取图像的宽度和高度clipped_polygon = []for point in poly_a:# 限制x和y坐标在图像范围内x = min(max(point[0], 0), w - 1)y = min(max(point[1], 0), h - 1)clipped_polygon.append([x, y])return clipped_polygon# 顺时针排序多边形顶点
def sort_polygon_clockwise(poly_a):# 计算多边形的中心点center_x = sum([point[0] for point in poly_a]) / len(poly_a)center_y = sum([point[1] for point in poly_a]) / len(poly_a)# 计算每个点相对于中心点的角度,并按顺时针顺序排序def angle_from_center(point):return math.atan2(point[1] - center_y, point[0] - center_x)# 根据角度进行排序,顺时针排列poly_a_sorted = sorted(poly_a, key=angle_from_center, reverse=True)return poly_a_sorteddef crop_and_paste_rounded_image(image_a, image_b, poly_a, poly_b):poly_a = sort_polygon_clockwise(np.asarray(poly_a))# 裁剪多边形到图像范围内poly_a = clip_polygon_to_image(poly_a, image_a.shape)poly_b = sort_polygon_clockwise(np.asarray(poly_b))# 裁剪多边形到图像范围内poly_b = clip_polygon_to_image(poly_b, image_a.shape)box1_x, box1_y, box1_w, box1_h = cv2.boundingRect(np.asarray(poly_a))# 裁剪图像A的旋转矩形# cropped_a = image_a[box1_y:box1_y + box1_h, box1_x:box1_x + box1_w].copy()rounded_a_cv = mask_polygon(image_a, poly_a)# 定义图像A的裁剪区域的四个顶点 (src_pts_a) 和目标区域 (dst_pts_b) 的顶点box2_x, box2_y, box2_w, box2_h = cv2.boundingRect(np.asarray(poly_b))scale=min(box2_w/box1_w, box2_h/box1_h)img_new = cv2.resize(rounded_a_cv, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA)image_b[box2_y:box2_y+img_new.shape[0], box2_x:box2_x+img_new.shape[1]] = img_newreturn image_b# 示例使用
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的最小外接矩形顶点while True: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)cv2.imshow('image_a', image_a)cv2.imshow('result', result)cv2.waitKey(0)

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

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

相关文章

基于 UniApp 平台的学生闲置物品售卖小程序设计与实现

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

寄存器二分频电路

verilog代码 module div2_clk ( input clk, input rst,output clk_div);reg clk_div_r; assign clk_div clk_div_r;always(posedge clk) beginif(rst)beginclk_div_r < 1b0;endelsebeginclk_di…

pytorch实现RNN网络

目录 1.导包 2. 加载本地文本数据 3.构建循环神经网络层 4.初始化隐藏状态state 5.创建随机的数据&#xff0c;检测一下代码是否能正常运行 6. 构建一个完整的循环神经网络 7.模型训练 8.个人知识点理解 1.导包 import torch from torch import nn from torch.nn imp…

API安全推荐厂商瑞数信息入选IDC《中国数据安全技术发展路线图》

近日&#xff0c;全球领先的IT研究与咨询公司IDC发布报告《IDC TechScape&#xff1a;中国数据安全技术发展路线图&#xff0c;2024》。瑞数信息凭借其卓越的技术实力和广泛的行业应用&#xff0c;被IDC评选为“增量型”技术曲线API安全的推荐厂商。 IDC指出&#xff0c;数据安…

Liveweb视频汇聚平台支持GB28181转RTMP、HLS、RTSP、FLV格式播放方案

GB28181协议凭借其在安防流媒体行业独有的大统一地位&#xff0c;目前已经在各种安防项目上使用。雪亮工程、幼儿园监控、智慧工地、物流监控等等项目上目前都需要接入安防摄像头或平台进行直播、回放。而GB28181协议作为国家推荐标准&#xff0c;目前基本所有厂家的安防摄像头…

Netty源码解析-请求处理与多路复用

Netty基本介绍&#xff0c;参考 Netty与网络编程 摘要 Netty源码系列-NioEventLoop 1.1 Netty给Channel分配Nio Event Loop的规则 看下图&#xff0c;EventLoopGroup是线程组&#xff0c;每个EventLoop是一个线程&#xff0c;那么线程处理请求是怎么分配的呢&#xff1f;我…

Docker 以外置数据库方式部署禅道

2.安装步骤 2.1.参考资料 禅道官网文档: https://www.zentao.net/book/zentaopms/docker-1111.html https://www.zentao.net/book/zentaopms/405.html 2.2.详细步骤 ssh 登录服务器创建目录 /opt/zentao /opt/zentao/data /opt/zentao/db cd /opt mkdir zentao mkdir zentao…

回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量…

java -versionbash:/usr/lib/jvm/jdk1.8.0_162/bin/java:无法执行二进制文件:可执行文件格式错误

实验环境&#xff1a;Apple M1在VMwareFusion使用Utubun Jdk文件错误 &#xfffc; 尝试&#xff1a; 1、重新在网盘下载java1.8 2、在终端通过命令下载 3、确保 JDK 正确安装在系统中&#xff0c;可以通过 echo $JAVA_HOME 检查 JAVA_HOME 环境变量是否设置正确。 &#xfff…

十种果冻的做法

菠萝果冻 1.在菠萝的1/5处切开&#xff0c;切去顶做盖子用&#xff0c;用水果刀在四周划一圈使皮和果肉分离 2.注意底部切透了&#xff0c;用水果刀把菠萝肉挖出&#xff0c;菠萝肉切丁用盐水浸泡备用 3.把菠萝丁放入料理机中加入少许纯净水&#xff0c;打成菠萝汁备用 4.打好…

【学习笔记】数据结构(六 ②)

树和二叉树&#xff08;二&#xff09; 文章目录 树和二叉树&#xff08;二&#xff09;6.3.2 线索二叉树 6.4 树和森林6.4.1 树的存储结构6.4.2 森林与二叉树的转换6.4.3 树和森林的遍历 6.5 树与等价问题6.5.1 等价定义6.5.2 划分等价类的方法6.5.3 划分等价类的具体操作 - 并…

【IoTDB 线上小课 07】多类写入接口,快速易懂的“说明书”!

【IoTDB 视频小课】稳定更新中&#xff01;第七期来啦~ 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源... 一个问题重点&#xff0c;3-5 分钟&#xff0c;我们讲给你听&#xff1a; 一条视频了解写入接口 了解我们的友友们&#xff0c;应该…

[Linux]Vi和Vim编辑器

Vi和Vim编辑器 Linux系统会内置vi文本编辑器, 类似于windows中的记事本 Vim具有程序编辑的能力, 可以看作是Vi的增强版本, 可以进行语法检查, 代码补全,代码编译和错误调整等功能 Vi和Vim的模式 快速入门 使用vim开发一个Hello.java程序 通过Xshell连接Linux系统命令行输入…

XML:DOM4j解析XML

XML简介&#xff1a; 什么是XML&#xff1a;XML 是独立于软件和硬件的信息传输工具。 XML 的设计宗旨是传输数据&#xff0c;而不是显示数据。XML 标签没有被预定义。您需要自行定义标签。XML不会做任何事情&#xff0c;XML被设计用来结构化、存储以及传输信息。 XML可以发明…

企业内网安全

企业内网安全 1.安全域2.终端安全3.网络安全网络入侵检测系统异常访问检测系统隐蔽信道检测系统 4.服务器安全基础安全配置入侵防护检测 5.重点应用安全活动目录邮件系统VPN堡垒机 6.蜜罐体系建设蜜域名蜜网站蜜端口蜜服务蜜库蜜表蜜文件全民皆兵 1.安全域 企业出于不同安全防…

[备忘]测算.net中对象所占用的内存

.net 基础库中应该是没有直接提供计算某个对象所占内存的方法。简单查了下&#xff0c;找到几种方式&#xff1a; 1、运行态用工具进行内存分析 比如&#xff0c;微软这篇教程中有介绍。《使用 .NET 对象分配工具分析内存使用情况》https://learn.microsoft.com/zh-cn/visuals…

优数:助力更高效的边缘计算

在数字化时代的浪潮中&#xff0c;数据已成为企业最宝贵的资产之一。随着物联网&#xff08;IoT&#xff09;设备的激增和5G技术的兴起&#xff0c;我们正迅速步入一个新时代&#xff0c;在这个时代中&#xff0c;数据不仅在量上爆炸性增长&#xff0c;更在速度和实时性上提出了…

idea 恢复 pom 文件呈现灰色并带删除线

今天在 idea 中导入别人的项目时发现有几个 pom 文件是灰色的并带删除线。 可以用以下方式解决&#xff1a; 打开file - settings - build,execution,deployment - Build Tools - Maven - Ignored Files 把 pom.xml 前面的复选框去掉&#xff0c;去掉之后&#xff0c;点击 appl…

IMS 中private user id/public user id的格式

private user identity(IMPI)的格式为 "<IMSI>ims.mnc<MNC>.mcc<MCC>.3gppnetwork.org" public user identity SIP URI 格式为 sip:usernamedomain&#xff1b;而Tel URI 格式为 tel:<CC><NDC><SN> temporary public user ide…

linux安装nginx+前端部署vue项目(实际测试react项目也可以)

&#x1f9f8;本篇博客作者测试上线过不下5个项目&#xff0c;包括单纯的静态资源&#xff0c;vue项目和react项目&#xff0c;包好用&#xff0c;请放心使用 &#x1f4dc;作者首页&#xff1a;dream_ready-CSDN博客 &#x1f4dc;有任何问题都可以评论留言&#xff0c;作者将…