python opencv通过4坐标剪裁图片


Posted in Python onJune 05, 2021

本文主要介绍了python opencv通过4坐标剪裁图片,分享给大家,具体如下:

效果展示,

python opencv通过4坐标剪裁图片

裁剪出的单词图像(如下)

python opencv通过4坐标剪裁图片
python opencv通过4坐标剪裁图片
python opencv通过4坐标剪裁图片
python opencv通过4坐标剪裁图片
python opencv通过4坐标剪裁图片
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]) ]

python opencv通过4坐标剪裁图片

总的程序代码如下

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')

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

Python 相关文章推荐
使用python生成杨辉三角形的示例代码
Aug 29 Python
python中正则表达式 re.findall 用法
Oct 23 Python
Python正则表达式和元字符详解
Nov 29 Python
pycharm打开命令行或Terminal的方法
Jan 16 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
简单了解django索引的相关知识
Jul 17 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
Django 返回json数据的实现示例
Mar 05 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
python中的yield from语法快速学习
Nov 06 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
详解python中的异常捕获
Dec 15 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 #Python
拒绝盗图!教你怎么用python给图片加水印
python四个坐标点对图片区域最小外接矩形进行裁剪
Python OpenCV 图像平移的实现示例
Python包argparse模块常用方法
Jun 04 #Python
opencv读取视频并保存图像的方法
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 #Python
You might like
中国第一家无线电行
2021/03/01 无线电
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
jquery 学习笔记一
2010/04/07 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
python实现C4.5决策树算法
2018/08/29 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
Python实现对adb命令封装
2020/03/06 Python
利用python 读写csv文件
2020/09/10 Python
会计电算化专业求职信
2014/06/10 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
离婚协议书的范本
2015/01/27 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
新郎接新娘保证书
2015/05/08 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
Java字符串逆序方法详情
2022/03/21 Java/Android
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL
HttpClient实现表单提交上传文件
2022/08/14 Java/Android