python opencv通过4坐标剪裁图片
作者:程序员进化不脱发! 发布时间:2022-06-03 20:14:03
本文主要介绍了python opencv通过4坐标剪裁图片,分享给大家,具体如下:
效果展示,
裁剪出的单词图像(如下)
这里程序我是用在paddleOCR里面,通过识别模型将识别出的图根据程序提供的坐标(即四个顶点的值)进行抠图的程序(上面的our和and就是扣的图),并进行了封装,相同格式的在这个基础上改就是了
[[[368.0, 380.0], [437.0, 380.0], [437.0, 395.0], [368.0, 395.0]], [[496.0, 376.0], [539.0, 378.0], [538.0, 397.0], [495.0, 395.0]], [[466.0, 379.0], [498.0, 379.0], [498.0, 395.0], [466.0, 395.0]], [[438.0, 379
.0], [466.0, 379.0], [466.0, 395.0], [438.0, 395.0]], ]
从程序得到的数据格式大概长上面的样子,由多个四个坐标一组的数据(如下)组成,即下面的[368.0, 380.0]为要裁剪图片左上角坐标,[437.0, 380.0]为要裁剪图片右上角坐标,[437.0, 395.0]为要裁剪图片右下角坐标,[368.0, 395.0]为要裁剪图片左下角坐标.
[[368.0, 380.0], [437.0, 380.0], [437.0, 395.0], [368.0, 395.0]]
而这里剪裁图片使用的是opencv(由于参数的原因没有设置角度的话就只能裁剪出平行的矩形,如果需要裁减出不与矩形图片编译平行的图片的话,参考这个博客进行进一步的改进点击进入)
裁剪部分主要是根据下面这一行代码进行的,这里要记住(我被这里坑了一下午),
参数 tr[1]:左上角或右上角的纵坐标值
参数bl[1]:左下角或右下角的纵坐标值
参数tl[0]:左上角或左下角的横坐标值
参数br[0]:右上角或右下角的横坐标值
crop = img[int(tr[1]):int(bl[1]), int(tl[0]):int(br[0]) ]
总的程序代码如下
import numpy as np
import cv2
def np_list_int(tb):
tb_2 = tb.tolist() #将np转换为列表
return tb_2
def shot(img, dt_boxes):#应用于predict_det.py中,通过dt_boxes中获得的四个坐标点,裁剪出图像
dt_boxes = np_list_int(dt_boxes)
boxes_len = len(dt_boxes)
num = 0
while 1:
if (num < boxes_len):
box = dt_boxes[num]
tl = box[0]
tr = box[1]
br = box[2]
bl = box[3]
print("打印转换成功数据num =" + str(num))
print("tl:" + str(tl), "tr:" + str(tr), "br:" + str(br), "bl:" + str(bl))
print(tr[1],bl[1], tl[0],br[0])
crop = img[int(tr[1]):int(bl[1]), int(tl[0]):int(br[0]) ]
# crop = img[27:45, 67:119] #测试
# crop = img[380:395, 368:119]
cv2.imwrite("K:/paddleOCR/PaddleOCR/screenshot/a/" + str(num) + ".jpg", crop)
num = num + 1
else:
break
def shot1(img_path,tl, tr, br, bl,i):
tl = np_list_int(tl)
tr = np_list_int(tr)
br = np_list_int(br)
bl = np_list_int(bl)
print("打印转换成功数据")
print("tl:"+str(tl),"tr:" + str(tr), "br:" + str(br), "bl:"+ str(bl))
img = cv2.imread(img_path)
crop = img[tr[1]:bl[1], tl[0]:br[0]]
# crop = img[27:45, 67:119]
cv2.imwrite("K:/paddleOCR/PaddleOCR/screenshot/shot/" + str(i) + ".jpg", crop)
# tl1 = np.array([67,27])
# tl2= np.array([119,27])
# tl3 = np.array([119,45])
# tl4 = np.array([67,45])
# shot("K:\paddleOCR\PaddleOCR\screenshot\zong.jpg",tl1, tl2 ,tl3 , tl4 , 0)
特别注意对np类型转换成列表,以及crop = img[tr[1]:bl[1], tl[0]:br[0]]
的中参数的位置,
实例
用了两种方法保存图片,opencv和Image,实践证明opencv非常快
from PIL import Image
import os
import cv2
import time
import matplotlib.pyplot as plt
def label2picture(cropImg,framenum,tracker):
pathnew ="E:\\img2\\"
# cv2.imshow("image", cropImg)
# cv2.waitKey(1)
if (os.path.exists(pathnew + tracker)):
cv2.imwrite(pathnew + tracker+'\\'+framenum + '.jpg', cropImg,[int(cv2.IMWRITE_JPEG_QUALITY), 100])
else:
os.makedirs(pathnew + tracker)
cv2.imwrite(pathnew + tracker+'\\'+framenum + '.jpg', cropImg,[int(cv2.IMWRITE_JPEG_QUALITY), 100])
f = open("E:\\hypotheses.txt","r")
lines = f.readlines()
for line in lines:
li = line.split(',')
print(li[0],li[1],li[2],li[3],li[4],li[5])
filename = li[0]+'.jpg'
img = cv2.imread("E:\\DeeCamp\\img1\\" + filename)
crop_img = img[int(li[3][:-3]):(int(li[3][:-3]) + int(li[5][:-3])),
int(li[2][:-3]):(int(li[2][:-3]) + int(li[4][:-3]))]
# print(int(li[2][:-3]),int(li[3][:-3]),int(li[4][:-3]),int(li[5][:-3]))
label2picture(crop_img, li[0], li[1])
# #
# x,y,w,h = 87,158,109,222
# img = cv2.imread("E:\\DeeCamp\\img1\\1606.jpg")
# # print(img.shape)
# crop = img[y:(h+y),x:(w+x)]
# cv2.imshow("image", crop)
# cv2.waitKey(0)
# img = Image.open("E:\\DeeCamp\\img1\\3217.jpg")
#
# cropImg = img.crop((x,y,x+w,y+h))
# cropImg.show()
# img = Image.open("E:\\deep_sort-master\\MOT16\\train\\try1\\img1\\"+filename)
# print(int(li[2][:-3]),(int(li[2][:-3])+int(li[4][:-3])), int(li[3][:-3]),(int(li[3][:-3])+int(li[5][:-3])))
# #裁切图片
# # cropImg = img.crop(region)
# # cropImg.show()
# framenum ,tracker= li[0],li[1]
# pathnew = 'E:\\DeeCamp\\deecamp项目\\deep_sort-master\\crop_picture\\'
# if (os.path.exists(pathnew + tracker)):
# # 保存裁切后的图片
# plt.imshow(cropImg)
# plt.savefig(pathnew + tracker+'\\'+framenum + '.jpg')
# else:
# os.makedirs(pathnew + tracker)
# plt.imshow(cropImg)
# plt.savefig(pathnew + tracker+'\\'+framenum + '.jpg')
来源:https://blog.csdn.net/weixin_43134049/article/details/110914634
猜你喜欢
- 一、问题描述如题,在使用pip install xxx的方法安装python库,或者是基于python的软件时,报错“E
- 记得自己学习的心得,为了自己以后调试方便些。1.操作步骤:1.1 添加断点直接在标记处点击鼠标左键即可。(删除断点只需再点击断点处即可)1.
- 导语hello everyone! I'm kimiko!Miss me???嘿!中秋结束了,开始正式营业给大家继续送福
- 实现逻辑1、Golang 版本 1.32、实现原理:1、主进程建立TCP监听服务,并且初始化一个变量 talkChan := m
- 没废话,直接上代码。环境说明:python3.6django2.0.5我们使用redis的作为celery任务队列,有一个合成包可以直接安装
- 简介TensorFlow 是一个端到端开源机器学习平台。它拥有一个全面而灵活的生态系统,其中包含各种工具、库和社区资源,可助力研究人员推动先
- 概述我一直在找一种好的方法来解释 go 语言的并发模型:不要通过共享内存来通信,相反,应该通过通信来共享内存但是没有发现一个好的解释来满足我
- 如何用METADATA替换ADOVBS.INC? 在ASP中,使用组件时,如ADO,得先包含
- SQL Server所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或
- 关于手机号码的提取,其实真正有用的部分就是re模块提供的正则表达式。使用正则表达式就能轻松地匹配到手机号码,由于功能比较简单这次并没有采用U
- logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。logging模块提供了两种记录日志的方
- 目标打包Python selenium 自动化脚本(如下run.py文件)为exe执行文件,使之可以直接在未安装python环境的windo
- 使用pickle模块来dump你的数据:对上篇博客里的sketch.txt文件:import osimport sysimport pick
- 在使用pytorch训练模型,经常需要加载大量图片数据,因此pytorch提供了好用的数据加载工具Dataloader。为了实现小批量循环读
- 我们熟悉了对象和类的基本概念。我们将进一步拓展,以便能实际运用对象和类。调用类的其它信息上一讲中提到,在定义方法时,必须有self这一参数。
- 前言k-means算法是无监督的聚类算法,实现起来较为简单,k-means++可以理解为k-means的增强版,在初始化中心点的方式上比k-
- 1、先检测系统是否自带原有版本mysql安装包,如果有要先卸载删除,不然不能成功安装和启动;# rpm -qa|grep mysql&nbs
- 智能合约1. 是什么智能合约是一种由计算机程序编写的自动化合约,它可以在没有第三方干预的情况下执行交易和契约条款。智能合约使用区块链技术实现
- python3版本的Scapy--Scapy3k来实现一个简单的DDos。首先实现SYN泛洪攻击(SYN Flood,是一直常用的DOS方式
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&