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中functools模块函数解析
Mar 12 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
python制作抖音代码舞
Apr 07 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
python爬虫 线程池创建并获取文件代码实例
Sep 28 Python
Python实现将蓝底照片转化为白底照片功能完整实例
Dec 13 Python
Python离线安装各种库及pip的方法
Nov 28 Python
Django集成富文本编辑器summernote的实现步骤
May 31 Python
Python语言规范之Pylint的详细用法
Jun 24 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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
PHP 危险函数解释 分析
2009/04/22 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
Angular弹出模态框的两种方式
2017/10/19 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
python3中eval函数用法使用简介
2019/08/02 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
警校毕业生自我评价
2014/04/06 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
档案保密承诺书
2014/06/03 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
撤诉申请怎么写
2015/05/19 职场文书
地震捐款简报
2015/07/21 职场文书
作文之亲情600字
2019/09/23 职场文书
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript