opencv-python读取、展示和存储图像

1、imshow函数

imshow函数作用是在窗口中显示图像,窗口自动适合于图像大小,我们也可以通过imutils模块调整显示图像的窗口的大小。函数官方定义如下:

cv2.imshow(windows_name, image)

函数参数一: 窗口名称(字符串)

函数参数二: 图像对象,类型是numpy中的ndarray类型,注:这里可以通过imutils模块改变图像显示大小,下面示例展示

上示例:

cv2.imshow('origin image', rgb_img)   #显示原图
cv2.imshow('origin image', imutils.resize(rgb_img, 800)) #利用imutils模块调整显示图像大小
cv2.imshow('gray image', imutils.resize(gray_img, 800))
if cv2.waitKey(0) == 27:
cv2.destroyAllWindows()

2、imwrite函数

imwrite函数检图像保存到本地,官方定义:

cv2.imwrite(image_filename, image)

函数参数一: 保存的图像名称(字符串)

函数参数二: 图像对象,类型是numpy中的ndarray类型

cv2.imwrite('rgb_img.jpg', rgb_img)   #将图像保存成jpg文件
cv2.imwrite('gray_img.png', gray_img) #将图像保存成png文件

3、窗口销毁函数

当我们使用imshow函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止,常用的销毁窗口的函数有下面两个:

(1)、cv2.destroyWindow(windows_name) #销毁单个特定窗口

参数: 将要销毁的窗口的名字

(2)、cv2.destroyAllWindows() #销毁全部窗口,无参数

那我们合适销毁窗口,肯定不能图片窗口一出现我们就将窗口销毁,这样便没法观看窗口,试想有两种方式:

(1) 让窗口停留一段时间然后自动销毁;

(2) 接收指定的命令,如接收指定的键盘敲击然后结束我们想要结束的窗口

以上两种情况都将使用cv2.waitKey函数, 首先产看函数定义:

cv2.waitKey(time_of_milliseconds)

唯一参数 time_of_milliseconds是整数,可正可负也可是零,含义和操作也不同,分别对应上面说的两种情况

(1) time_of_milliseconds > 0 :此时time_of_milliseconds表示时间,单位是毫秒,含义表示等待 time_of_milliseconds毫秒后图像将自动销毁,看以下示例

#表示等待10秒后,将销毁所有图像
if cv2.waitKey(10000):
cv2.destroyAllWindows() #表示等待10秒,将销毁窗口名称为'origin image'的图像窗口
if cv2.waitKey(10000):
cv2.destroyWindow('origin image')

(2) time_of_milliseconds <= 0 : 此时图像窗口将等待一个键盘敲击,接收到指定的键盘敲击便会进行窗口销毁。我们可以自定义等待敲击的键盘,通过下面的例子进行更好的解释

设置waitKey(0),则表示程序会无限制的等待用户的按键事件

#当指定waitKey(0) == 27时当敲击键盘 Esc 时便销毁所有窗口
if cv2.waitKey(0) == 27:
cv2.destroyAllWindows() #当接收到键盘敲击A时,便销毁名称为'origin image'的图像窗口
if cv2.waitKey(-1) == ord('A'):
cv2.destroyWindow('origin image')

下面给出一个完整读取、展示、保存和图像销毁示例:

import cv2
import imutils
import numpy as np rgb_img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/cartoon.jpg')
gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)
cv2.imshow('origin image', imutils.resize(rgb_img, 800))
cv2.imshow('gray image', imutils.resize(gray_img, 800))
cv2.imwrite('rgb_img.jpg', rgb_img)
cv2.imwrite('gray_img.png', gray_img) #等待一定时间自动销毁图像窗口
#if cv2.waitKey(10000):
# cv2.destroyAllWindows()
#if cv2.waitKey(10000):
# cv2.destroyWindow('origin image') #接收特定键盘销毁图像窗口
#if cv2.waitKey(-1) == ord('A'):
# cv2.destroyWindow('origin image')
if cv2.waitKey(0) == 27:
cv2.destroyAllWindows()

给图片添加文字

ImageFont:用来加载准备阶段中下载的字体库文件
ImageDraw: 基于image对象,创建一个可以在Image实例上画线条、贴文字的对象。

import cv2

from PIL import ImageFont, ImageDraw, Image

import numpy as np

bk_img = cv2.imread("background.jpg")

#设置需要显示的字体

fontpath = "font/simsun.ttc"

font = ImageFont.truetype(fontpath, 32) #32为字体大小

img_pil = Image.fromarray(bk_img)

draw = ImageDraw.Draw(img_pil)

#绘制文字信息

draw.text((100, 300),  "Hello World", font = font, fill = (255, 255, 255))

draw.text((100, 350),  "你好", font = font, fill = (255, 255, 255))

bk_img = np.array(img_pil)

cv2.imshow("add_text",bk_img)

cv2.waitKey()、
#保存图片 cv2.imwrite("add_text.jpg",bk_img)

pillow的简单使用——南昌理工学院实践项目

import time
import random
import threading
import copy
import cv2 # 导入 opencv -python 库
from PIL import Image,ImageFont,ImageDraw
import numpy as np img1 = cv2.imread('d:\\lib.jpg')
img2 = cv2.imread('d:\\lib1.png')
img2 = cv2.resize(img2, (100, 100)) img=Image.fromarray(img1)
draw = ImageDraw.Draw(img)
fontText = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', 30, encoding="utf-8")
draw.text((500, 30), '....南理文字RPG0.2的世界开始了.....', textColor=(255,0,0), font=fontText)
draw.text((535, 100), 'Hi,欢迎加入南理文字RPG0.2 ', textColor=(255,0,0), font=fontText)
img1=np.array(img) SCRIPT_NPC_SCHOOL_SISTER = ['你好!',
'你好!',
'你是新生嘛?',
'是的',
'想要我教你魔法吗?',
'\n1、好的 \
\n2、不用了吧,我不和学姐学魔法!\n'
]
MAGIC_BOOKS = [
['风巽千叶翔龙', 1],
['泽兑鬼尘珠', 2],
['凤翔九天', 3]
] class Body: # 人物类
LEVEL=1 #等级
EXP=0 #经验
NAME = '' # 名字
HP = 0 # 血量
MAX_HP = 0 # 最大血量
MP = 0 # 魔法值
MAX_MP = 0 # 最大魔法值 ATTACK = 1
MAGIC_ATTACK = 1.3
DEFENSE=5
HAS_MAGIC = [] # 会的魔法 EMOTION=0.5 #范围0-1,0为绝望,1为神采奕奕,(0.5为平和,此时为最佳状态) POS_NAME = '南昌理工学院南大门' # 地点 def __init__(self, IS_HUMAN_= False,NAME_='Ice NPC',LEVEL_=1,EXP_=0, HP_=3, MP_=3, MAX_HP_=3, MAX_MP_=3, ATTACK_=1, MAGIC_ATTACK_=1.3,EMOTION_=0.5, HAS_MAGIC_=[],
POS_NAME_='南昌理工学院南大门', DEFENSE_=5,bounce_=0):
# 初始化 默认值
self.IS_HUMAN = IS_HUMAN_ # 判断是否位人类
self.LEVEL=LEVEL_
self.EXP=EXP_
self.NAME = NAME_
self.HP = HP_
self.MP = MP_
self.MAX_HP = MAX_HP_
self.MAX_MP = MAX_MP_
self.ATTACK = ATTACK_
self.MAGIC_ATTACK = MAGIC_ATTACK_
self.DEFENSE=DEFENSE_
self.EMOTION=EMOTION_
self.POS_NAME = POS_NAME_
self.HAS_MAGIC = HAS_MAGIC_
self.bounce=bounce_ def display_status(self): # 显示人物状态
print('\n\r', ' 状态:' + self.NAME, end='')
print('\n血量:' + '' * int(self.HP), '\n 魔法值:' + '' * int(self.MP))
print('地点:' + self.POS_NAME) if self.HAS_MAGIC == []:
print('无魔法')
else:
self.display_magic() def display_status_fighting(self): print('\n\r', ' 状态:' + self.NAME, end='')
print('\n血量:' + '' * int(self.HP), ' 魔法值:' + '' * int(self.MP)) def display_magic(self): # 显示魔法
print(self.NAME + '会如下几种魔法:') print('魔法名 ,消耗点数') i = 0 for iMagic in self.HAS_MAGIC:
print('第', i, '个魔法:', MAGIC_BOOKS[iMagic])
i = i + 1 def talk_to(self, NPC_, NPC_SCRIPT_, delay=0.3):
# 按剧本和NPC聊天
print('在' + self.POS_NAME + '遇到 ' + NPC_.NAME) for i in range(len(NPC_SCRIPT_)):
if i % 2 == 1: # 判断当前说话的人
TURN = self.NAME
else:
TURN = NPC_.NAME print(TURN + ':' + NPC_SCRIPT_[i])
time.sleep(delay) def learn_magic_from(self, NPC_):
# 向NPC学习魔法 NPC_.display_magic()
CHOOSE = input('是否向' + NPC_.NAME + '学魔法?(输入:1/2/3/no)') if CHOOSE == '1': print('恭喜' + self.NAME + '学会' + MAGIC_BOOKS[NPC_.HAS_MAGIC[0]][0] +
',每次使用消耗' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[0]][1]) + 'MP.')
self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[0]]
self.display_magic()
elif CHOOSE == '2':
print('恭喜' + self.NAME + '学会' + MAGIC_BOOKS[NPC_.HAS_MAGIC[1]][0] +
',每次使用消耗' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[1]][1]) + 'MP.')
self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[1]]
self.display_magic()
elif CHOOSE == '3':
print('恭喜' + self.NAME + '学会' + MAGIC_BOOKS[NPC_.HAS_MAGIC[2]][0] +
',每次使用消耗' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[2]][1]) + 'MP.')
self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[2]]
self.display_magic()
elif CHOOSE == 'no':
print('由于你的固执,没有学习新的魔法.')
else:
print('不明白你说什么.') def DEFENSE_(self, NPC):
hit = self.ATTACK * (100 - self.DEFENSE) % 100
return hit def attack_one_time(self, NPC_, iChoose_magic_): # 攻击一下NPC
if iChoose_magic_ == -2: # 休息,且调出自己的全面状态
self.display_status()
elif iChoose_magic_ == -1: # 普通攻击 NPC_.HP = NPC_.HP - self.ATTACK
self.HP = NPC_.HP + self.DEFENSE self.EXP = self.EXP + MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
print('【', self.NAME + '击剑攻击' + NPC_.NAME, '造成了' + str(self.ATTACK), '点攻击】')
print('***' + self.NAME + '增加了' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + '点经验值***')
print('【', self.NAME + '消耗了' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + '点魔法】')
print('***' + self.NAME + '的经验值为' + str(self.EXP) + '***')
elif iChoose_magic_ in self.HAS_MAGIC:
# print(iChoose_magic_)
hit = self.MAGIC_ATTACK * MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1] # print('hit:',hit,',',self.MAGIC_ATTACK,',',self.HAS_MAGIC[iChoose_magic_])
NPC_.HP = NPC_.HP - hit # 魔法伤害=魔法消耗*魔法攻击力
NPC_.MP = NPC_.MP - self.HAS_MAGIC[iChoose_magic_]
NPC_.MP = NPC_.MP + self.HAS_MAGIC[iChoose_magic_] # 实现魔法无消耗
self.MP = self.MP - MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
self.EXP = self.EXP + MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
print('【', self.NAME + '用魔法' + MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][0] + ',攻击了' + NPC_.NAME + ',',
'造成了' + str(hit) + '点攻击!】')
print('***' + self.NAME + '增加了' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + '点经验值***')
print('【', self.NAME + '消耗了' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + '点魔法】')
print('***' + self.NAME + '的经验值为' + str(self.EXP) + '***')
if self.EXP >= 2: # 如果经验值大于等于2 玩家即升一级
print('***' + self.NAME + '已升级') # 显示玩家已升级
self.LEVEL = self.LEVEL + 1
self.EXP = 0 # 升级后 经验清零
print('***' + self.NAME + '的等级为' + str(self.LEVEL) + '***')
# 玩家各属性提升 self.HP = self.HP + 1
self.MP = self.MP + 1
self.MAX_HP = self.MAX_HP + 1
self.MAX_MP = self.MAX_MP + 1
self.DEFENSE = self.DEFENSE + 5
self.ATTACK = self.ATTACK + 1
self.MAGIC_ATTACK = self.MAGIC_ATTACK + 0.5
# 输出玩家升级后属性值
print('***' + self.NAME + '的HP为' + str(self.HP) + '***')
print('***' + self.NAME + '的MP为' + str(self.MP) + '***')
print('***' + self.NAME + '的最大生命为' + str(self.MAX_HP) + '***')
print('***' + self.NAME + '的最大魔法为' + str(self.MAX_MP) + '***')
print('***' + self.NAME + '的普通攻击力为' + str(self.ATTACK) + '***')
print('***' + self.NAME + '的魔法攻击为' + str(self.MAGIC_ATTACK) + '***')
print('***' + self.NAME + '的防御为' + str(self.DEFENSE) + '***') if NPC_.HP <= 0:
return 1
else:
return 0 def fight_with(self, NPC_):
# 挑战NPC print('【', self.NAME + '开始和' + NPC_.NAME + '战斗! !', '】') MAX_ROUND = 100
IS_DEAD = 0 for ROUND in range(MAX_ROUND): if (ROUND % 2 == 0):
self.display_status_fighting()
self.display_magic()
NPC_.display_status_fighting() choose_magic = int(input('-----使用魔法/普通攻击(-1普通攻击,0/1/2..魔法攻击,查看状态-2):'))
IS_DEAD = self.attack_one_time(NPC_, choose_magic)
IS_DEAD = IS_DEAD * 2 # 用乘法,让我们不改变0,非0状态的情况下,标记是谁赢了
else:
choose_magic = random.choice(NPC_.HAS_MAGIC + [-1]) IS_DEAD = NPC_.attack_one_time(self, choose_magic)
IS_DEAD = IS_DEAD * 4 # 用乘法,让我们不改变0,非0状态的情况下,标记是谁赢了 if IS_DEAD >= 1:
print('【战斗结束】')
if IS_DEAD == 2:
print('【', self.NAME + '战胜了' + NPC_.NAME, '】')
elif IS_DEAD == 4:
print('【', NPC_.NAME + '战胜了' + self.NAME, '】')
return IS_DEAD else:
if ROUND % 2 == 1:
print('【第' + str(1 + int(ROUND / 2)) + '回合结束!】\n===================================') class World: # 世界类 # 剧本:遇到学姐 # 玩家初始化
PLAYER = Body() # NPC初始化(先创造三个NPC,学姐,冰怪,火怪 NPCs = {
'school elder sister': Body(NAME_='school elder sister', HAS_MAGIC_=[0, 1, 2]),
'ice monster': Body(NAME_='ice monster', HAS_MAGIC_=[2]),
'fire monster': Body(NAME_='fire monster', HAS_MAGIC_=[0])
} # 初始化世界: def init(self):
player_name = input('请输入玩家名:') self.PLAYER.NAME = player_name print('....南理文字RPG0.2的世界开始了.....') welcome_script = 'Hi,' + self.PLAYER.NAME + ',欢迎加入南理文字RPG0.2 '
# self.display_a_line(script=welcome_script)
print(welcome_script) self.PLAYER.display_status() self.PLAYER.talk_to(self.NPCs['school elder sister'],
SCRIPT_NPC_SCHOOL_SISTER) # 通过NPCs集合,调取'school elder sister'NPC self.PLAYER.learn_magic_from(self.NPCs['school elder sister']) def run(self):
self.PLAYER.fight_with(self.NPCs['fire monster']) def image_on_image(img1, img2, x=100, y=100):
# 代表图像像素有多少行多少列多少通道数
rows, cols, channels = img2.shape # 获取图像2的shape信息 存入rows,cols,channels
roi = img1[0:rows, 0:cols] # 把背景图片img1的左上角按图像2的形状赋值给roi img1[0 + y:rows + y, 0 + x:cols + x] = img2 cv2.imshow('res', img1)
return img1 # 当前状态、之前状态 cur_flag = -1
pre_flag = -1 # 无限循环 x, y = 100, 100 # 主角的坐标位置
delta = 15 # 主角每次走一步,走的步伐 while True:
# 每一帧 background = img1.copy() # 背景图像值拷贝
actor = img2.copy() # 主角图像值拷贝
# 获取键盘事件
flag = cv2.waitKey(0) # 程序等待用户敲击键盘,然后返回键盘值给flag
# Esc,退出
if flag == 27:
break
# 判断是否按下其他键
if flag > -1 and flag != pre_flag:
cur_flag = flag
pre_flag = flag # 响应 actor移动事件
if cur_flag == ord('w'):
y = y - delta elif cur_flag == ord('s'):
y = y + delta
elif cur_flag == ord('a'):
x = x - delta
elif cur_flag == ord('d'):
x = x + delta
else:
1 + 1 if x < 10:
x = 0
if y < 10:
y = 0
if x > 1435:
x = 1435
if y > 745:
y = 745
# 显示
print('Actor(x,y)=(' + str(x) + ',' + str(y) + ')')
background = image_on_image(background, actor, x, y) # 把背景图像,主角图像,x,y坐标传入,返回获取图像叠加的一个图像 cv2.destroyAllWindows()
# 显示一句话:两种方式,直接显示0,以及逐步显示1
def display_a_line(way, script='hello'):
for i in range(len(script)):
time.sleep(0.3)
print('\r', script[0:i], end='') magic_world = World() magic_world.init() magic_world.run()

opencv-python函数的更多相关文章

  1. OpenCV Python教程(3、直方图的计算与显示)

    转载请详细注明原作者及出处,谢谢! 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了. ...

  2. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  3. Erlang/Elixir: 使用 OpenCV, Python 搭建图片缩略图服务器

    这篇文章是在OSX上测试和运行的的, Ubuntu下的安装和配置请移步到这里 应用程序进程树, 默认 Poolboy 中初始化10个用于处理图片的 Python 工作进程(Worker) 首先安装Op ...

  4. python 函数之day3

    一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...

  5. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  6. Python函数讲解

    Python函数

  7. Python函数信息

    Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...

  8. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  9. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

  10. Python函数解析

    对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...

随机推荐

  1. Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢

  2. JS 留言板案例

    css代码 ul { list-style: none; } ul li { background-color: pink; line-height: 40px; margin: 10px; widt ...

  3. 搭建 springboot selenium 网页文件转图片环境

    1. 环境准备 需要有 chrome 浏览器 + chrome driver + selenium 客户端 离线 chrome 下载地址 # 64位 linux 系统 https://dl.googl ...

  4. Dubbo整合Springboot框架

    本文使用的是alibaba的Dubbo. Dubbo整合Springboot可以分为四步: 第一步:首先需要了解Dubbo官方给的建议,至少有三个工程: 接口工程:主要存实体bean和业务接口 服务提 ...

  5. Netty(二):如何处理io请求?

    文接上一篇.上篇讲到netty暴露一个端口出来,acceptor, handler, pipeline, eventloop 都已准备好.但是并没体现其如何处理接入新的网络请求,今天我们就一起来看看吧 ...

  6. 2020-07-22:你觉得使用redis的主从复制的时候有什么点需要注意的吗?

    福哥答案2020-07-22: 1.主从同步缓冲区设定大小,如果进行全量复制耗时太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态.在全量复制的时候, ...

  7. C#LeetCode刷题-深度优先搜索

    深度优先搜索篇 # 题名 刷题 通过率 难度 98 验证二叉搜索树   22.2% 中等 99 恢复二叉搜索树   45.1% 困难 100 相同的树   48.1% 简单 101 对称二叉树   4 ...

  8. C#设计模式之5-单例模式

    单例模式(Singleton Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/397 访问. 单例模式属 ...

  9. C#LeetCode刷题之#219-存在重复元素 II​​​​​​​(Contains Duplicate II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3704 访问. 给定一个整数数组和一个整数 k,判断数组中是否存在 ...

  10. C#LeetCode刷题之#746-使用最小花费爬楼梯( Min Cost Climbing Stairs)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4016 访问. 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个 ...