当前位置:   article > 正文

opencv-python函数_python opencv imshow

python opencv imshow

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

 


1、imshow函数

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

cv2.imshow(windows_name, image)

函数参数一: 窗口名称(字符串)
函数参数二: 图像对象,类型是numpy中的ndarray类型,注:这里可以通过imutils模块改变图像显示大小,下面示例展示

上示例:

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


2、imwrite函数

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

cv2.imwrite(image_filename, image)

函数参数一: 保存的图像名称(字符串)
函数参数二: 图像对象,类型是numpy中的ndarray类型

  1. cv2.imwrite('rgb_img.jpg', rgb_img) #将图像保存成jpg文件
  2. 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毫秒后图像将自动销毁,看以下示例

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


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

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

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


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

  1. import cv2
  2. import imutils
  3. import numpy as np
  4. rgb_img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/cartoon.jpg')
  5. gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2GRAY)
  6. cv2.imshow('origin image', imutils.resize(rgb_img, 800))
  7. cv2.imshow('gray image', imutils.resize(gray_img, 800))
  8. cv2.imwrite('rgb_img.jpg', rgb_img)
  9. cv2.imwrite('gray_img.png', gray_img)
  10. #等待一定时间自动销毁图像窗口
  11. #if cv2.waitKey(10000):
  12. # cv2.destroyAllWindows()
  13. #if cv2.waitKey(10000):
  14. # cv2.destroyWindow('origin image')
  15. #接收特定键盘销毁图像窗口
  16. #if cv2.waitKey(-1) == ord('A'):
  17. # cv2.destroyWindow('origin image')
  18. if cv2.waitKey(0) == 27:
  19. cv2.destroyAllWindows()

给图片添加文字 

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

  1. import cv2
  2. from PIL import ImageFont, ImageDraw, Image
  3. import numpy as np
  4. bk_img = cv2.imread("background.jpg")
  5. #设置需要显示的字体
  6. fontpath = "font/simsun.ttc"
  7. font = ImageFont.truetype(fontpath, 32) #32为字体大小
  8. img_pil = Image.fromarray(bk_img)
  9. draw = ImageDraw.Draw(img_pil)
  10. #绘制文字信息
  11. draw.text((100, 300), "Hello World", font = font, fill = (255, 255, 255))
  12. draw.text((100, 350), "你好", font = font, fill = (255, 255, 255))
  13. bk_img = np.array(img_pil)
  14. cv2.imshow("add_text",bk_img)
  15. cv2.waitKey()、
  16. #保存图片
  17. cv2.imwrite("add_text.jpg",bk_img)

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

  1. import time
  2. import random
  3. import threading
  4. import copy
  5. import cv2 # 导入 opencv -python 库
  6. from PIL import Image,ImageFont,ImageDraw
  7. import numpy as np
  8. img1 = cv2.imread('d:\\lib.jpg')
  9. img2 = cv2.imread('d:\\lib1.png')
  10. img2 = cv2.resize(img2, (100, 100))
  11. img=Image.fromarray(img1)
  12. draw = ImageDraw.Draw(img)
  13. fontText = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', 30, encoding="utf-8")
  14. draw.text((500, 30), '....南理文字RPG0.2的世界开始了.....', textColor=(255,0,0), font=fontText)
  15. draw.text((535, 100), 'Hi,欢迎加入南理文字RPG0.2 ', textColor=(255,0,0), font=fontText)
  16. img1=np.array(img)
  17. SCRIPT_NPC_SCHOOL_SISTER = ['你好!',
  18. '你好!',
  19. '你是新生嘛?',
  20. '是的',
  21. '想要我教你魔法吗?',
  22. '\n1、好的 \
  23. \n2、不用了吧,我不和学姐学魔法!\n'
  24. ]
  25. MAGIC_BOOKS = [
  26. ['风巽千叶翔龙', 1],
  27. ['泽兑鬼尘珠', 2],
  28. ['凤翔九天', 3]
  29. ]
  30. class Body: # 人物类
  31. LEVEL=1 #等级
  32. EXP=0 #经验
  33. NAME = '' # 名字
  34. HP = 0 # 血量
  35. MAX_HP = 0 # 最大血量
  36. MP = 0 # 魔法值
  37. MAX_MP = 0 # 最大魔法值
  38. ATTACK = 1
  39. MAGIC_ATTACK = 1.3
  40. DEFENSE=5
  41. HAS_MAGIC = [] # 会的魔法
  42. EMOTION=0.5 #范围0-1,0为绝望,1为神采奕奕,(0.5为平和,此时为最佳状态)
  43. POS_NAME = '南昌理工学院南大门' # 地点
  44. 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_=[],
  45. POS_NAME_='南昌理工学院南大门', DEFENSE_=5,bounce_=0):
  46. # 初始化 默认值
  47. self.IS_HUMAN = IS_HUMAN_ # 判断是否位人类
  48. self.LEVEL=LEVEL_
  49. self.EXP=EXP_
  50. self.NAME = NAME_
  51. self.HP = HP_
  52. self.MP = MP_
  53. self.MAX_HP = MAX_HP_
  54. self.MAX_MP = MAX_MP_
  55. self.ATTACK = ATTACK_
  56. self.MAGIC_ATTACK = MAGIC_ATTACK_
  57. self.DEFENSE=DEFENSE_
  58. self.EMOTION=EMOTION_
  59. self.POS_NAME = POS_NAME_
  60. self.HAS_MAGIC = HAS_MAGIC_
  61. self.bounce=bounce_
  62. def display_status(self): # 显示人物状态
  63. print('\n\r', ' 状态:' + self.NAME, end='')
  64. print('\n血量:' + '❤' * int(self.HP), '\n 魔法值:' + '⚓' * int(self.MP))
  65. print('地点:' + self.POS_NAME)
  66. if self.HAS_MAGIC == []:
  67. print('无魔法')
  68. else:
  69. self.display_magic()
  70. def display_status_fighting(self):
  71. print('\n\r', ' 状态:' + self.NAME, end='')
  72. print('\n血量:' + '❤' * int(self.HP), ' 魔法值:' + '⚓' * int(self.MP))
  73. def display_magic(self): # 显示魔法
  74. print(self.NAME + '会如下几种魔法:')
  75. print('魔法名 ,消耗点数')
  76. i = 0
  77. for iMagic in self.HAS_MAGIC:
  78. print('第', i, '个魔法:', MAGIC_BOOKS[iMagic])
  79. i = i + 1
  80. def talk_to(self, NPC_, NPC_SCRIPT_, delay=0.3):
  81. # 按剧本和NPC聊天
  82. print('在' + self.POS_NAME + '遇到 ' + NPC_.NAME)
  83. for i in range(len(NPC_SCRIPT_)):
  84. if i % 2 == 1: # 判断当前说话的人
  85. TURN = self.NAME
  86. else:
  87. TURN = NPC_.NAME
  88. print(TURN + ':' + NPC_SCRIPT_[i])
  89. time.sleep(delay)
  90. def learn_magic_from(self, NPC_):
  91. # 向NPC学习魔法
  92. NPC_.display_magic()
  93. CHOOSE = input('是否向' + NPC_.NAME + '学魔法?(输入:1/2/3/no)')
  94. if CHOOSE == '1':
  95. print('恭喜' + self.NAME + '学会' + MAGIC_BOOKS[NPC_.HAS_MAGIC[0]][0] +
  96. ',每次使用消耗' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[0]][1]) + 'MP.')
  97. self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[0]]
  98. self.display_magic()
  99. elif CHOOSE == '2':
  100. print('恭喜' + self.NAME + '学会' + MAGIC_BOOKS[NPC_.HAS_MAGIC[1]][0] +
  101. ',每次使用消耗' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[1]][1]) + 'MP.')
  102. self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[1]]
  103. self.display_magic()
  104. elif CHOOSE == '3':
  105. print('恭喜' + self.NAME + '学会' + MAGIC_BOOKS[NPC_.HAS_MAGIC[2]][0] +
  106. ',每次使用消耗' + str(MAGIC_BOOKS[NPC_.HAS_MAGIC[2]][1]) + 'MP.')
  107. self.HAS_MAGIC = self.HAS_MAGIC + [NPC_.HAS_MAGIC[2]]
  108. self.display_magic()
  109. elif CHOOSE == 'no':
  110. print('由于你的固执,没有学习新的魔法.')
  111. else:
  112. print('不明白你说什么.')
  113. def DEFENSE_(self, NPC):
  114. hit = self.ATTACK * (100 - self.DEFENSE) % 100
  115. return hit
  116. def attack_one_time(self, NPC_, iChoose_magic_): # 攻击一下NPC
  117. if iChoose_magic_ == -2: # 休息,且调出自己的全面状态
  118. self.display_status()
  119. elif iChoose_magic_ == -1: # 普通攻击
  120. NPC_.HP = NPC_.HP - self.ATTACK
  121. self.HP = NPC_.HP + self.DEFENSE
  122. self.EXP = self.EXP + MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
  123. print('【', self.NAME + '击剑攻击' + NPC_.NAME, '造成了' + str(self.ATTACK), '点攻击】')
  124. print('***' + self.NAME + '增加了' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + '点经验值***')
  125. print('【', self.NAME + '消耗了' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + '点魔法】')
  126. print('***' + self.NAME + '的经验值为' + str(self.EXP) + '***')
  127. elif iChoose_magic_ in self.HAS_MAGIC:
  128. # print(iChoose_magic_)
  129. hit = self.MAGIC_ATTACK * MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
  130. # print('hit:',hit,',',self.MAGIC_ATTACK,',',self.HAS_MAGIC[iChoose_magic_])
  131. NPC_.HP = NPC_.HP - hit # 魔法伤害=魔法消耗*魔法攻击力
  132. NPC_.MP = NPC_.MP - self.HAS_MAGIC[iChoose_magic_]
  133. NPC_.MP = NPC_.MP + self.HAS_MAGIC[iChoose_magic_] # 实现魔法无消耗
  134. self.MP = self.MP - MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
  135. self.EXP = self.EXP + MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]
  136. print('【', self.NAME + '用魔法' + MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][0] + ',攻击了' + NPC_.NAME + ',',
  137. '造成了' + str(hit) + '点攻击!】')
  138. print('***' + self.NAME + '增加了' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + '点经验值***')
  139. print('【', self.NAME + '消耗了' + str(MAGIC_BOOKS[self.HAS_MAGIC[iChoose_magic_]][1]) + '点魔法】')
  140. print('***' + self.NAME + '的经验值为' + str(self.EXP) + '***')
  141. if self.EXP >= 2: # 如果经验值大于等于2 玩家即升一级
  142. print('***' + self.NAME + '已升级') # 显示玩家已升级
  143. self.LEVEL = self.LEVEL + 1
  144. self.EXP = 0 # 升级后 经验清零
  145. print('***' + self.NAME + '的等级为' + str(self.LEVEL) + '***')
  146. # 玩家各属性提升
  147. self.HP = self.HP + 1
  148. self.MP = self.MP + 1
  149. self.MAX_HP = self.MAX_HP + 1
  150. self.MAX_MP = self.MAX_MP + 1
  151. self.DEFENSE = self.DEFENSE + 5
  152. self.ATTACK = self.ATTACK + 1
  153. self.MAGIC_ATTACK = self.MAGIC_ATTACK + 0.5
  154. # 输出玩家升级后属性值
  155. print('***' + self.NAME + '的HP为' + str(self.HP) + '***')
  156. print('***' + self.NAME + '的MP为' + str(self.MP) + '***')
  157. print('***' + self.NAME + '的最大生命为' + str(self.MAX_HP) + '***')
  158. print('***' + self.NAME + '的最大魔法为' + str(self.MAX_MP) + '***')
  159. print('***' + self.NAME + '的普通攻击力为' + str(self.ATTACK) + '***')
  160. print('***' + self.NAME + '的魔法攻击为' + str(self.MAGIC_ATTACK) + '***')
  161. print('***' + self.NAME + '的防御为' + str(self.DEFENSE) + '***')
  162. if NPC_.HP <= 0:
  163. return 1
  164. else:
  165. return 0
  166. def fight_with(self, NPC_):
  167. # 挑战NPC
  168. print('【', self.NAME + '开始和' + NPC_.NAME + '战斗! !', '】')
  169. MAX_ROUND = 100
  170. IS_DEAD = 0
  171. for ROUND in range(MAX_ROUND):
  172. if (ROUND % 2 == 0):
  173. self.display_status_fighting()
  174. self.display_magic()
  175. NPC_.display_status_fighting()
  176. choose_magic = int(input('-----使用魔法/普通攻击(-1普通攻击,0/1/2..魔法攻击,查看状态-2):'))
  177. IS_DEAD = self.attack_one_time(NPC_, choose_magic)
  178. IS_DEAD = IS_DEAD * 2 # 用乘法,让我们不改变0,非0状态的情况下,标记是谁赢了
  179. else:
  180. choose_magic = random.choice(NPC_.HAS_MAGIC + [-1])
  181. IS_DEAD = NPC_.attack_one_time(self, choose_magic)
  182. IS_DEAD = IS_DEAD * 4 # 用乘法,让我们不改变0,非0状态的情况下,标记是谁赢了
  183. if IS_DEAD >= 1:
  184. print('【战斗结束】')
  185. if IS_DEAD == 2:
  186. print('【', self.NAME + '战胜了' + NPC_.NAME, '】')
  187. elif IS_DEAD == 4:
  188. print('【', NPC_.NAME + '战胜了' + self.NAME, '】')
  189. return IS_DEAD
  190. else:
  191. if ROUND % 2 == 1:
  192. print('【第' + str(1 + int(ROUND / 2)) + '回合结束!】\n===================================')
  193. class World: # 世界类
  194. # 剧本:遇到学姐
  195. # 玩家初始化
  196. PLAYER = Body()
  197. # NPC初始化(先创造三个NPC,学姐,冰怪,火怪
  198. NPCs = {
  199. 'school elder sister': Body(NAME_='school elder sister', HAS_MAGIC_=[0, 1, 2]),
  200. 'ice monster': Body(NAME_='ice monster', HAS_MAGIC_=[2]),
  201. 'fire monster': Body(NAME_='fire monster', HAS_MAGIC_=[0])
  202. }
  203. # 初始化世界:
  204. def init(self):
  205. player_name = input('请输入玩家名:')
  206. self.PLAYER.NAME = player_name
  207. print('....南理文字RPG0.2的世界开始了.....')
  208. welcome_script = 'Hi,' + self.PLAYER.NAME + ',欢迎加入南理文字RPG0.2 '
  209. # self.display_a_line(script=welcome_script)
  210. print(welcome_script)
  211. self.PLAYER.display_status()
  212. self.PLAYER.talk_to(self.NPCs['school elder sister'],
  213. SCRIPT_NPC_SCHOOL_SISTER) # 通过NPCs集合,调取'school elder sister'NPC
  214. self.PLAYER.learn_magic_from(self.NPCs['school elder sister'])
  215. def run(self):
  216. self.PLAYER.fight_with(self.NPCs['fire monster'])
  217. def image_on_image(img1, img2, x=100, y=100):
  218. # 代表图像像素有多少行多少列多少通道数
  219. rows, cols, channels = img2.shape # 获取图像2的shape信息 存入rows,cols,channels
  220. roi = img1[0:rows, 0:cols] # 把背景图片img1的左上角按图像2的形状赋值给roi
  221. img1[0 + y:rows + y, 0 + x:cols + x] = img2
  222. cv2.imshow('res', img1)
  223. return img1
  224. # 当前状态、之前状态
  225. cur_flag = -1
  226. pre_flag = -1
  227. # 无限循环
  228. x, y = 100, 100 # 主角的坐标位置
  229. delta = 15 # 主角每次走一步,走的步伐
  230. while True:
  231. # 每一帧
  232. background = img1.copy() # 背景图像值拷贝
  233. actor = img2.copy() # 主角图像值拷贝
  234. # 获取键盘事件
  235. flag = cv2.waitKey(0) # 程序等待用户敲击键盘,然后返回键盘值给flag
  236. # Esc,退出
  237. if flag == 27:
  238. break
  239. # 判断是否按下其他键
  240. if flag > -1 and flag != pre_flag:
  241. cur_flag = flag
  242. pre_flag = flag
  243. # 响应 actor移动事件
  244. if cur_flag == ord('w'):
  245. y = y - delta
  246. elif cur_flag == ord('s'):
  247. y = y + delta
  248. elif cur_flag == ord('a'):
  249. x = x - delta
  250. elif cur_flag == ord('d'):
  251. x = x + delta
  252. else:
  253. 1 + 1
  254. if x < 10:
  255. x = 0
  256. if y < 10:
  257. y = 0
  258. if x > 1435:
  259. x = 1435
  260. if y > 745:
  261. y = 745
  262. # 显示
  263. print('Actor(x,y)=(' + str(x) + ',' + str(y) + ')')
  264. background = image_on_image(background, actor, x, y) # 把背景图像,主角图像,x,y坐标传入,返回获取图像叠加的一个图像
  265. cv2.destroyAllWindows()
  266. # 显示一句话:两种方式,直接显示0,以及逐步显示1
  267. def display_a_line(way, script='hello'):
  268. for i in range(len(script)):
  269. time.sleep(0.3)
  270. print('\r', script[0:i], end='')
  271. magic_world = World()
  272. magic_world.init()
  273. magic_world.run()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/367144
推荐阅读
相关标签
  

闽ICP备14008679号