OpenCV for Python 实战(一):获取图片拍摄GPS地址并自动添加水印

news2024/10/7 10:15:07

Hello 我们在OpenCV每天的基础博客当中已经更新了很多了,那么今天我们就来结合前几天的内容。做一个获取属性然后添加对应属性的水印。那让我们赶快开始吧~

文章目录

  • 图片EXIF
  • Python 获取EXIF
    • exifread库
    • 使用方法
    • 转换成文字地址
  • 添加水印
    • cv2.putText()
  • 每日总结

图片EXIF

可能很多人并没有听说过这个专有名词,这是一个专门储存相片的相关信息的地方。大家一般在操作的时候右键打开属性,点击“详细信息”就会出现这样的界面了~
在这里插入图片描述

今天咱们就来详细了解一下什么是EXIF啦~

EXIF是指Exchangeable Image File

Format(可交换图像文件格式)的缩写。它是一种存储在数字照片中的元数据格式,包含了照片的各种信息,如拍摄时间、相机型号、曝光参数、GPS坐标等。EXIF数据可以为摄影师、设计师、摄影爱好者等提供了有用的信息,同时也为照片的管理和编辑提供了便利。

EXIF数据通常被存储在JPEG、TIFF和RAW等图像文件格式中,通过使用相机或其他设备的内置工具或第三方软件,可以轻松查看和编辑这些数据。在数字摄影中,EXIF数据对于了解照片的拍摄环境和条件非常有用,例如确定曝光设置、焦距、ISO感光度等。

除了基本的拍摄信息外,EXIF数据还可以包含版权信息、作者、拍摄地点等更多信息。这使得照片的归档、共享和管理更加方便。然而,也需要注意保护个人隐私,因为可能包含有关拍摄者或拍摄地点的敏感信息。

而今天,咱们需要获取的就是这个GPS信息

在这里插入图片描述

Python 获取EXIF

exifread库

实际上,我们有很多方法获取其中的信息。但是为了让我们的程序变得更加简单,我们在这里使用第三方库帮我们完成这个读取的操作。

安装代码pip install exifread

在这里插入图片描述

使用方法

我们只需要使用process_file()这个函数就可以直接获取属性

import exifread

tag = exifread.process_file(open("./LFS.jpg","rb"))
print(tag)

在这里插入图片描述

现在我们来获取一下['GPS GPSLatitude']这是咱们的纬度信息。我们可以看到这是一个EXIFread库当中定义的数据类型。
在这里插入图片描述
我们使用printable将其转换成str数据

在这里插入图片描述

再用split(",")分割成列表类型方便读取

在这里插入图片描述

然后咱们先获取度的数据,用replace()代替多余的“[”

import exifread

latitude = int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[1])/60
longitude = int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[1])/60
print(longitude,latitude)

同理咱们编写代码,咱们也就成功地获取了经纬值
在这里插入图片描述

转换成文字地址

在这里我们选择百度地图的web工具,具体使用方法见百度地图的文档,咱们这里就直接提供源码了哈~

import exifread,requests,json

latitude = int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[1])/60
longitude = int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[1])/60
message = json.loads(requests.get("https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的ak&output=json&coordtype=wgs84ll&location="+str(latitude)+","+str(longitude)).text)
direction = message["result"]["addressComponent"]["province"] + message["result"]["addressComponent"]["city"] + message["result"]["addressComponent"]["district"] + message["result"]["addressComponent"]["town"]
print(direction)

在这里插入图片描述

添加水印

cv2.putText()

cv2.putText()是OpenCV(开源计算机视觉库)中的一种方法,用于向图像或视频帧添加文本。它需要以下参数:

  • image:需要添加文本的输入图像或帧
  • text:要添加的文本字符串
  • org:一个表示文本起始坐标的元组(x,y)
  • fontFace:字体类型(可以从预定义的字体列表中选择)
  • fontScale:字体大小(乘以字体厚度的比例因子)
  • color:BGR格式的文本颜色(例如,绿色为(0,255,0))
  • thickness:用于绘制文本的线条粗细(可以为负数以获得填充文本)
  • lineType:用于绘制文本的线条类型(例如,cv2.LINE_AA表示反锯齿线)

该方法返回一个添加了文本的图像。

在这里插入图片描述

但是我们要注意的是,OpenCV只能显示英文,无法显示中文。所以我们使用施加魔法pip install opencv-python-rolling下载OpenCV v5.0版本

在这里插入图片描述
OK 轻松获得了咱们的图片
在这里插入图片描述

在这里插入图片描述

import exifread,requests,json,cv2
cv2.imwrite("水印添加.jpg",cv2.putText(img = cv2.imread("./LFS.jpg"),text = json.loads(requests.get("https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的ak&output=json&coordtype=wgs84ll&location="+str(int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[1])/60)+","+str(int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[1])/60)).text)["result"]["addressComponent"]["province"] + json.loads(requests.get("https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的ak&output=json&coordtype=wgs84ll&location="+str(int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[1])/60)+","+str(int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[1])/60)).text)["result"]["addressComponent"]["city"] + json.loads(requests.get("https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的ak&output=json&coordtype=wgs84ll&location="+str(int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[1])/60)+","+str(int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[1])/60)).text)["result"]["addressComponent"]["district"] + json.loads(requests.get("https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的ak&output=json&coordtype=wgs84ll&location="+str(int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[1])/60)+","+str(int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[1])/60)).text)["result"]["addressComponent"]["town"],org = (400,400),fontFace = cv2.FONT_HERSHEY_SIMPLEX,thickness = 20,fontScale = 10,color = (255,255,255)))

正常长度代码

import exifread,requests,json,cv2

latitude = int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLatitude'].printable.split(",")[1])/60
longitude = int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[0].replace("[","")) + int(exifread.process_file(open("./LFS.jpg","rb"))['GPS GPSLongitude'].printable.split(",")[1])/60
message = json.loads(requests.get("https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的ak&output=json&coordtype=wgs84ll&location="+str(latitude)+","+str(longitude)).text)
direction = message["result"]["addressComponent"]["province"] + message["result"]["addressComponent"]["city"] + message["result"]["addressComponent"]["district"] + message["result"]["addressComponent"]["town"]
cv2.imwrite("水印添加.jpg",cv2.putText(img = cv2.imread("./LFS.jpg"),text = direction,org = (400,400),fontFace = cv2.FONT_HERSHEY_SIMPLEX,thickness = 20,fontScale = 10,color = (255,255,255)))

每日总结

我们使用了EXIFread库获取了图片的经纬值,然后通过Requests访问百度地图的API获得了我们的实际地位,用json库转换之后,用最新版的OpenCV的putText()方法获得了添加水印后的图像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据可视化——绘制带有时间线的柱状图

文章目录 前言如何绘制柱状图添加时间线根据提供的数据绘制动态柱状图读取并删除无用数据将数据转换为字典创建柱状图并添加到时间线中配置选项并生成带有数据的折线图 前言 我们已经学习了使用 pyecharts 包中的模块和相应的方法绘制了折线图和地图,那么今天我将为…

Visual Studio Code安装详细教程

win电脑可以打开该网址 vs官方下载网站 点击这里免费下载 下载下来是一个安装程序,直接以管理员身份运行即可 我同意安装,然后选择D盘的一个空间进行安装 然后点击下一步 安装如图所示勾选,点击下一步 点击安装 等待安装完成即可 打开…

原神盲盒风格:AI绘画Stable Diffusion原神人物公仔实操:核心tag+lora模型汇总

本教程收集于:AIGC从入门到精通教程汇总 在这篇文章中,我们将深入探讨原神盲盒的艺术风格,以及如何运用AI绘画技术(Stable Diffusion)——来创造原神角色公仔。我们将通过实践操作让读者更好地理解这种技术&#xff0…

Vue中TodoLists案例_底部交互

与上一篇Vue中TodoList案例_底部统计有俩个文件变化了 App.vue&#xff1a;定义了一个方法checkAllTodo&#xff0c;实现全选和取消全选&#xff0c;并将方法传给儿子组件MyFooter <template><div id"root"><div class"todo-container">…

数学建模学习(4):TOPSIS 综合评价模型及编程实战

一、数据总览 需求&#xff1a;我们需要对各个银行进行评价&#xff0c;A-G为银行的各个指标&#xff0c;下面是银行的数据&#xff1a; 二、代码逐行实现 清空代码和变量的指令 clear;clc; 层次分析法 每一行代表一个对象的指标评分 p [8,7,6,8;7,8,8,7];%每一行代表一个…

JDK、JRE、JVM三者之间的关系

总结 JDK包含JRE&#xff0c;JRE包含JVM。 JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual Machine)----Java虚拟…

解决 前端显示后端返回的null值为 1的问题

一 、问题描述 一个产品信息&#xff0c;有一个输入框的数据是后端返回回显出来的 但是后端返回这个字段时候&#xff0c;这个字段为空值&#xff0c;在后端就根本在data中没有返回这个字段任何信息 如返回的data {name : 123,age: 18} 因为age 为空&#xff0c;实际后端返回…

云原生|kubernetes|kubernetes集群部署神器kubekey安装部署高可用k8s集群(半离线形式)

前言&#xff1a; 云原生|kubernetes|kubernetes集群部署神器kubekey的初步使用&#xff08;centos7下的kubekey使用&#xff09;_晚风_END的博客-CSDN博客 前面利用kubekey部署了一个简单的非高可用&#xff0c;etcd单实例的kubernetes集群&#xff0c;经过研究&#xff0c;…

pt19盒模型布局

CSS 盒模型 内容尺寸overflow(占用内容框) 一般情况下&#xff0c;为元素设置width/height&#xff0c;指定的是内容框的大小 内容溢出&#xff1a;内容超出元素的尺寸范围&#xff0c;称为溢出。默认情况下溢出部分仍然可见&#xff0c;可以使用overflow调整溢出部分的显示…

【枚举】CF1833 D

Problem - D - Codeforces 题意&#xff1a; 给定一个序列&#xff0c;让你找一个区间&#xff0c;翻转区间内的数&#xff0c;交换前缀和后缀&#xff0c;让结果数组的字典序最大 思路&#xff1a; 观察样例可知&#xff0c;r是可以直接确定的&#xff0c;l是不确定的&…

使用Docker构建Nginx镜像并部署Web应用

文章目录 1. 简介2. 准备工作3. 编写Dockerfile4. 编写nginx.conf5. 构建镜像6. 查看镜像是否构建成功7. 运行容器8. 访问Web应用9. 总结 1. 简介 Docker是一个开源的容器化平台&#xff0c;它可以帮助我们快速构建、发布和运行应用程序&#xff0c;实现应用程序的环境隔离和依…

DevOps初识

博主入职了&#xff0c;正在学习一些在学校没有接触过的东西&#xff0c;在此进行记录~~~~ 背景 随着软件发布迭代的频率越来越高&#xff0c;传统的「瀑布型」&#xff08;开发—测试—发布&#xff09;模式已经不能满足快速交付的需求。打破开发和运维的壁垒&#xff0c;聪…

K8S初级入门系列之三-Pod的基本概念和操作

一、前言 Pod的原意是豌豆荚的意思&#xff0c;一个豆荚里面包含了很多豆子。在K8S中&#xff0c;Pod也是类似的意思&#xff0c;只不过这里的豆子就是容器。在K8S初级入门系列之一-概述中&#xff0c;我们对Pod有个初步的了解。 1、Pod是K8S编排和调度的最小基础单元。 了解容…

ChatGPT助力校招----面试问题分享(十二)

1 ChatGPT每日一题&#xff1a;运算放大器与比较器的区别 问题&#xff1a;运算放大器与比较器的区别 ChatGPT&#xff1a;运算放大器和比较器都是电子电路中常用的模拟电路元件&#xff0c;但它们的设计和应用略有不同。下面是两者的主要区别&#xff1a; 功能不同&#xf…

微服务——Nacos配置管理

目录 Nacos配置管理——实现配置管理 配置管理实践 Nacos配置管理——微服务配置拉取 Nacos配置管理——配置热更新 方式一: ​编辑 方式二(推荐方式): Nacos配置管理——多环境配置共享 优先级问题 Nacos配置管理——nacos集群搭建 总结​编辑 Nacos配置管理——实现配置管…

Linux 云服务器上部署 web 项目

目录 1)安装 jdk 2)安装 tomcat 3) 设置安全组 4)安装mysql 5) 建库建表 6) 打包部署 1)安装 jdk 使用包管理器进行安装 常用的包管理器 yum (centos 自带的包管理器) apt pacman 我们使用 yum 来进行安装程序 yum list 查看当前的软件包有哪些 命令: yum list | gre…

Oracle 列出一天内每5分钟一条数据

select trunc(sysdate) (rownum-1) / (24*60/5) time from dual connect by rownum < 24*60/5效果如图&#xff0c; 类似的 列出一年内每天、每个月也是用connect by搭配rownum使用

记一次Mysql慢SQL优化过程

缘起 最近有个同事让我看看一个测试环境的SQL&#xff0c;因为这个SQL执行了几十秒&#xff0c;导致接口超时了。 sql为(里面表名已经使用test_table开头的表名脱敏&#xff0c;返回的字段使用*脱敏&#xff0c;别名未修改)&#xff1a; select* fromtest_table1 e join test…

分布式文件存储与数据缓存 FastDFS

一、FastDFS概述 1.1 什么是分布式文件系统 单机时代 初创时期由于时间紧迫&#xff0c;在各种资源有限的情况下&#xff0c;通常就直接在项目目录下建立静态文件夹&#xff0c;用于用户存放项目中的文件资源。如果按不同类型再细分&#xff0c;可以在项目目录下再建立不同的…

【Linux -- systemctl管理服务】

Linux – systemctl管理服务 文章目录 Linux -- systemctl管理服务一、通过systemctl管理单一服务(service unit)二、通过systemctl查看系统上所有的服务三、通过systemctl管理不同的操作环境(target unit)四、通过systemctl分析各服务之间的依赖性总结 一、通过systemctl管理单…