opencv对图片画框写文字
业务背景:对图片进行画框后调用排序方法按照“从上到下,从左到右”对已经画的框进行排序。排序方法当前有缺陷,修复后需要验证。
目前有如下信息:
- 原始图片地址
- 图片对应的每个框的坐标(xy左上起始点,wh宽高),且大框有可能是多个小框的组合(大框按照组合框的第一个框的位置来排序)
验证的过程就是找到原始图片,根据排序后的大框的顺序把它的小框在原图上画出来,验证顺序是否满足 “从上到下,从左到右”。由于原图比较多,每个图上的大框更多,想要验证全部数据会存在如下问题:
- 数据量大,一个个画效率比较低
- 容易画错、漏画
解决办法:使用opencv找到坐标按照排序后的顺序画在原始图片上,直接观察原始图片。
- 下载python-opencv
pip install opencv-python -i http://mirrors.aliyun.com/pypi/simple/
- 编码
# coding:utf8
import json
import os
from loguru import logger
import requests
import cv2 as cv
def parse_page_json(json_path, out_path):
# 结果目录
if not os.path.exists(out_path):
os.makedirs(os.path.join(out_path,'src')) # 存原图
# 解析原始导出数据
with open(json_path, 'r', encoding='utf8') as f_r:
for line in f_r:
page = json.loads(line.strip('\n'))
source_page_url = page['supplementaryPage']['pageImg']
p_no = page['supplementaryPage']['number']
q_id_li = page['supplementaryPage']['questionIds']
# 下载并存储原图
res = requests.get(source_page_url)
logger.info(f'download {source_page_url}')
file_name = source_page_url.split('/')[-1]
with open(os.path.abspath(os.path.join(out_path, 'src', file_name)), 'wb') as f_w:
for a in res.iter_content(chunk_size=32): # iter是iter
f_w.write(a)
# 获取题目框信息
q_gps_li = page['supplementaryPage']['abkQuestionLocationDTOs']
q_li_info = {} # {'d42b150d-f804-4d7c-b8e6-22140d0ad5a3': [((70.8743980738362, 406.7817014446228), (806.0670144462279, 1475.9831460674159))], '3b31243e-95e8-4111-9047-3dade17b0bb6': [((85.80216693418933, 1483.4470304975923), (807.932985553772, 2134.6709470304977)), ((820.994783306581, 376.92616372391655), (1556.1873996789727, 569.1211878009631))], '46481e96-aef4-409c-b75c-db5b1cdcf05a': [((822.8607544141252, 580.317014446228), (1569.2491974317818, 1729.7552166934192))], '1acb999a-cfa2-44a4-b144-5f71d2693214': [((820.994783306581, 1737.2191011235957), (1593.5068218298557, 2127.207062600321))]}
for g_gps in q_gps_li:
# 题目ID
q_id = g_gps['abkQuestionId']
locationDTOs = g_gps['locationDTOs']
# 题目如果有多个框,按顺序分别吧多个框添加进列表
lct_li = []
for location in locationDTOs:
pt_s = (round(float((location['x']))), round(float((location['y']))))
pt_e = (round(float((location['x']))) + round(float((location['w']))),
round(float((location['y']))) + round(float((location['h']))))
lct_li.append((pt_s, pt_e))
q_li_info.update({q_id: lct_li})
logger.info(f'start draw pic : {file_name}')
cv_write(os.path.abspath(os.path.join(out_path, 'src', file_name)), out_path + '/', p_no, q_li_info,q_id_li)
def cv_write(src, dst, page_no, q_li_info,q_id_li):
# 读取原图
src = cv.imread(src)
for q, gps_li in q_li_info.items():
# 框排序后的编号
q_no = q_id_li.index(q)
# 小框编号(如果有小框,把小框也画出来)
xt_no = 0
for gps in gps_li:
pt_s, pt_e = gps
p_color = (0, 0, 255)
# 画矩形:图,开始坐标,结束坐标,颜色...
cv.rectangle(src, pt_s, pt_e, p_color)
# 写题目题号
font = cv.FONT_HERSHEY_SIMPLEX
tihao = str(q_no + 1) + '-' + str(xt_no + 1) if len(gps_li) > 1 else str(q_no + 1)
# 写入框编号
cv.putText(src, tihao, pt_s, font, 1.2, (0, 0, 255), 2)
# cv.putText(src, str(q), (pt_s[0],pt_s[1]+20), font, 0.7, (0, 0, 255), 2) # 写入题目ID
xt_no += 1
q_no += 1
# 另存图片
cv.imwrite(dst + str(page_no) + '.jpg', src)
if __name__ == '__main__':
parse_page_json('page.json', 'ttt4')
出来的图片信息为:
opencv对图片画框写文字的更多相关文章
- 函数putText()在图片上写文字
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace c ...
- 使用Qpaint在图片上写文字
开发过程中需要实现在图片上叠加文字,可以采用Qpaint在图片上写文字,然后将图片显示在上面.再将Qlabel加到Qwidget中.效果如下 //创建对象,加载图片 QPixmap pix; pix. ...
- thinkphp 利用GD库在图片上写文字
<?php /** * Created by PhpStorm. * User: Administrator */ namespace Home\Event; use \Think\Image; ...
- python生成透时图片and 写文字
import Image from get_png import getpng def transparent(infile): #open png,covert it into 'RGBA mode ...
- OpenCV+TensorFlow图片手写数字识别(附源码)
初次接触TensorFlow,而手写数字训练识别是其最基本的入门教程,网上关于训练的教程很多,但是模型的测试大多都是官方提供的一些素材,能不能自己随便写一串数字让机器识别出来呢?纸上得来终觉浅,带着这 ...
- php图片上面写文字,输出图片
<?php /* param $image 图象资源 param size 字体大小 param angle 字体输出角度 param showX 输出位置x坐标 param showY 输出位 ...
- Swift - 给图片添加文字水印(图片上写文字,并可设置位置和样式)
想要给图片添加文字水印或者注释,我们需要实现在UIImage上写字的功能. 1,效果图如下: (在图片左上角和右下角都添加了文字.) 2,为方便使用,我们通过扩展UIImage类来实现添加水印功能 ( ...
- C#图片上写文字
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...
- android图片加水印,文字
两种方法: 1.直接在图片上写文字 String str = "PICC要写的文字"; ImageView image = (ImageView) this.findViewByI ...
- C# GDI+ 简单实现图片写文字和图片叠加(水印)(转)
using System; using System.Collections; using System.Configuration; using System.Data; using System. ...
随机推荐
- Ubuntu18.04LTS虚拟机优化
1.没网 刚安装好没网,可以设置NAT连接,也可以直接设置为桥接模式联网.这里直接桥接. 网络中心使用的是以太网,所以就在菜单的"编辑"里的"虚拟网络编辑器"里 ...
- 无法识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次
无法识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次 解决方法: 1.在开始菜单里找到Windows PowerShell.并以管理 ...
- 简单了解如何自己动手制作RPM包
导读 RPM文件在Linux系统中的安装最为简便.以著名的图像处理软件XV为例,其RPM包xv-3.10a-13.i386.rpm可以在该程序的主页中下载取得. 我们介绍如何自己动手制作RPM包.0, ...
- 2017GPLT
PTA天梯赛2017GPLT 7-6 整除光棍 给定一个不以5结尾的奇数\(x\),求出数字\(n\)使得\(n*x=11...111\),输出数字n和1的位数 题解:模拟竖式除法 我们一开始发现n只 ...
- GeoServer 发布PostGIS数据库中的栅格数据
1.导入栅格数据 进入PostgreSQL\bin目录,利用raster2pgsql工具导入栅格数据,具体命令如下所示: <!-- 分块,切片存储到PostGIS数据库中 --> rast ...
- Scala集合总结
Scala同时支持可变集合和不可变集合,包含两个包: 可变集合:scala.collection.mutable 不可变集合:scala.collection.immutable Scala默认采用不 ...
- 使用git下载文件时提示身份验证失败
鼠标右键打开Git Bash Here窗口 输入git clone + 网址 后出现身份报错提示信息 需要重新修改一下用户名和邮箱就可以了 git config --global --replace- ...
- modelsim仿真含Xilinx原语代码块
很早之前笔者已经写过关于modelsim仿真的文章了,不过之前笔者做的仿真都是有现成代码块的仿真.对于那些使用原语的代码块进行仿真时则需要产生相关的仿真库,笔者这里使用modeltech64_2020 ...
- linux中大括号、小括号、中括号的区别和用法
大括号 { } 1.用于取多个变量 可以进行取变量和字符串拼接,假设:var='1234' echo ${var}abcd 输出为:1234abcd 2.正则表达式,用于大括号内 ...
- VS编译运行报错:找不到ucrtbased.dll文件
VS编译运行报错:找不到ucrtbased.dll文件 在VS2019中配置OpenCV编译,报如下错误: 解决方法:下载缺少的ucrtbased.dll文件,在免费的dll下载网站搜索下载,对应的有 ...