您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python opencv通过4坐标剪裁图片

51自学网 2021-10-30 22:31:13
  python
这篇教程python opencv通过4坐标剪裁图片写得很实用,希望能帮到您。

本文主要介绍了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 npimport cv2def np_list_int(tb):    tb_2 = tb.tolist() #将np转换为列表    return tb_2def 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:            breakdef 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 Imageimport osimport cv2import timeimport matplotlib.pyplot as pltdef 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')

到此这篇关于python opencv通过4坐标剪裁图片的文章就介绍到这了,更多相关opencv 剪裁图片内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


Python还能这么玩之只用30行代码从excel提取个人值班表
Python深度学习之实现卷积神经网络
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。