当前位置:   article > 正文

Python图像识别技术_python 图像识别

python 图像识别

图像识别技术简介

前言
图像识别技术是计算机视觉领域的一个重要研究方向。 Python作为一种功能强大且易于学习的编程语言,被广泛用于数据分析、机器学习和人工智能领域。

基本原理
将视频源中获取的图像数据传入模型 ,通过计算机视觉算法识别分析图像中的对象或特征。

主要步骤
获取图像数据:通过调用摄像头或读取视频文件获取实时的图像数据。
图像预处理:对获取的图像数据进行预处理,如裁剪、灰度转换等。
特征提取:利用计算机视觉算法从图像中提取出关键特征,例如文字、颜色等。
模型训练和预测:利用机器学习框架构建和训练模型,将预处理后的图像数据输入模型进行识别和分类。
显示结果:将识别的结果以可视化的形式展示出来。
图像处理
OpenCV库
简介
OpenCV(Open Source Computer Vision Library)是一个基于Apache2.0许可开源发行的跨平台计算机视觉库,实现了很多图像处理的通用算法。它由一系列C函数和少量C++构成,同时提供了Python语言接口。 刚才也提到过图像识别的第一步是从视频源获取图像数据,我们就可以用opencv从视频中捕获帧并保存到本地。

基本语法

使用pip安装OpenCV。

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple --verbose

代码演示
下面演示如何读取并保存视频中的帧

  1. import cv2
  2. class VideoToImage:
  3. @staticmethod
  4. def video_2_image(video_path):
  5. # 初始化视频文件
  6. cap = cv2.VideoCapture(video_path)
  7. # 获取视频总帧数
  8. frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
  9. print("视频总帧数: " + str(frames))
  10. # 保存图片
  11. i = 1
  12. while cap.isOpened():
  13. # 读取视频
  14. ret, frame = cap.read()
  15. # 保存每一帧图像
  16. cv2.imwrite("/save_url/" + str(i) + ".png", frame)
  17. i += 1
  18. # 释放
  19. cap.release()
  20. videoToImage = VideoToImage()

PIL库
简介
PIL(Python Image Library)是Python中较为基础的图像处理库。 Image模块是Python PIL图像处理中常见的模块,用来对图像进行一些基础操作。

基本语法


代码演示
将图像进行灰度处理往往非常有利于排除干扰以便于分析图像,下面演示如何灰度处理图像。

  1. from PIL import Image
  2. class ImageProcess:
  3. # 灰度图
  4. @staticmethod
  5. def gray_image():
  6. # 读取彩色图像
  7. img = Image.open('/Desktop/share/pic/color.jpeg')
  8. # 转化为灰度图
  9. gray_img = img.convert('L')
  10. # 保存灰度图
  11. gray_img.save('/Desktop/share/pic/color_gray.jpeg')
  12. # 显示图片
  13. gray_img.show()
  14. imageProcess = ImageProcess()

运行结果


识别文字


Tesseract-OCR简介
OCR(Optical Character Recognition,光学字符识别)是指通过扫描纸质为文档或照片,通过计算机对图像记录的文字进行识别的一种技术。Tesseract 是一个OCR 库,目前由Google 赞助。Tesseract 是目前公认最优秀、最精确的开源OCR 系统。

优点:部署快,轻量级,离线可用,免费

缺点:自带的中文库识别率较低,需要自己建数据进行训练

使用方法

string = pytesseract.image_to_string(image, lang='chi_sim+eng', config='--psm 6')

image(必需):要进行识别的图像。
lang(可选):指定要使用的语言模型的语言标识符 eng英文 chi_sim中文简体。
config(可选):指定tesseract的其他配置。如图像处理参数、OEM(引擎模式)参数等。
代码演示
演示识别图片中李白的《将进酒》

  1. import cv2
  2. from pytesseract import pytesseract
  3. class TextRecognition:
  4. @staticmethod
  5. def text_recognition():
  6. # 识别数字和英文
  7. image = cv2.imread('/Users/r/Desktop/share/pic/300ms.jpeg')
  8. text = pytesseract.image_to_string(image, lang='eng', config='--psm 7')
  9. print(text)
  10. # 识别中文
  11. image = cv2.imread('/Users/r/Desktop/share/pic/chinese.png')
  12. text = pytesseract.image_to_string(image, lang='chi_sim', config='--psm 6')
  13. print(text)
  14. textRecognition = TextRecognition()

运行结果


学习网址
Tesseract 源码下载 https://github.com/tesseract-ocr/tesseract/releases

Tesseract 文档 https://tesseract-ocr.github.io/tessdoc/Compiling.html

vietocr官网 https://vietocr.sourceforge.net/training.html

jTessBoxEditor官网 https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/

识别颜色


HSV简介


HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。HSV颜色模型是指H、S、V三维颜色空间中的一个可见光子集,它包含某个颜色域的所有颜色。

HSV模型参数


这个模型中颜色的参数分别是:色相(H),饱和度(S),亮度(V)。色相H参数表示色彩信息,即所处的光谱颜色的位置。

代码演示

从图片中识别出黄色

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. class ColorRecognition:
  5. # 颜色识别
  6. @staticmethod
  7. def color_recognition():
  8. print("从图像中识别颜色")
  9. # 获取图像数据
  10. img = cv2.imread("/Users/r/Desktop/share/pic/color.jpg")
  11. img = cv2.medianBlur(img, 7)
  12. cv2.namedWindow("HSV")
  13. # 从RGB转换为HSV
  14. HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
  15. # 黄色HSV范围
  16. lower1 = np.array([26, 43, 90])
  17. upper1 = np.array([34, 255, 255])
  18. mask = cv2.inRange(HSV, lower1, upper1)
  19. mask = cv2.medianBlur(mask, 5)
  20. mask_and = cv2.bitwise_and(img, img, mask=mask)
  21. # 显示
  22. img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  23. mask_and = cv2.cvtColor(mask_and, cv2.COLOR_BGR2RGB)
  24. plt.subplot(1, 2, 1), plt.imshow(img_rgb)
  25. plt.title('Input Image'), plt.xticks([]), plt.yticks([])
  26. plt.subplot(1, 2, 2), plt.imshow(mask_and)
  27. plt.title('Image Yellow'), plt.xticks([]), plt.yticks([])
  28. plt.show()
  29. cv2.waitKey(0)
  30. cv2.destroyAllWindows()
  31. colorRecognition = ColorRecognition()

应用实践


王者荣耀WIFI弱信号测试


连接指定弱信号WI-FI玩王者荣耀游戏,自动计算游戏过程的总时长、时延在200ms以上的总时长以及卡顿总次数。

实现思路
将王者荣耀游戏录屏按帧率转换为图片,对截取图片的时延部分进行二次截取,分析识别图片的文字或颜色,从而计算出200ms以上的总时长和卡顿次数。

代码实现         

步骤一:将游戏视频转化为图片并保存在本地文件夹

video2pic.py

  1. # 将四个文件夹中的多个视频文件转换为图片
  2. import cv2
  3. import os
  4. number_in_dir = [] # 可以去掉,用来统计文件个数的
  5. class Video2images:
  6. @staticmethod
  7. def videos2images(file_name, video_path, image_save_dir, every_video_save_dir):
  8. # 1. 在存储路径下创建副文件夹(视频类型文件夹)。将图片的存储路径加上源文件的文件夹名,如'Coffee_room_01'等。
  9. if os.path.exists(video_path): # 判断源路径是否正确
  10. print(video_path + '\t ok')
  11. number_in_dir.append(len(os.listdir(video_path))) # 可以去掉
  12. else:
  13. print(video_path + ' \033[0;37;41merror\033[0m')
  14. return
  15. # 2. 开始转换。打印正在处理文件的序号和他的文件名,并开始转换
  16. cap = cv2.VideoCapture(video_path + file_name)
  17. # 帧率(frames per second)
  18. fps = cap.get(cv2.CAP_PROP_FPS)
  19. # 总帧数(frames)
  20. frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
  21. # 总时长
  22. video_time = "{0:.2f}".format(frames / fps)
  23. print("=" * 100)
  24. print("视频名称:" + file_name)
  25. print("帧率:" + str(fps))
  26. print("总帧数:" + str(frames))
  27. print("视频总时长:" + "{0:.2f}".format(frames / fps) + "秒")
  28. print("=" * 100)
  29. timeF = int(fps) # 视频帧计数间隔频率
  30. flag = cap.isOpened()
  31. if not flag:
  32. print("open" + video_path + file_name + "error!")
  33. frame_count = 0 # 给每一帧标号
  34. i = 1
  35. while True:
  36. frame_count += 1
  37. flag, frame = cap.read()
  38. if not flag: # 如果已经读取到最后一帧则退出
  39. break
  40. # if os.path.exists(
  41. # image_save_dir + every_video_save_dir + str(frame_count) + '.jpg'): # 在源视频不变的情况下,如果已经创建,则跳过
  42. # break
  43. if frame_count % timeF == 0:
  44. cv2.imwrite(image_save_dir + every_video_save_dir + str(i) + '.jpg', frame)
  45. i += 1
  46. cap.release()
  47. print(file_name + ' save to ' + image_save_dir + every_video_save_dir + ' finished ') # 表示一个视频片段已经转换完成
  48. return video_time
  49. @staticmethod
  50. def mkdir_file(file_in_video_path, image_save_dir):
  51. # 读取源路径文件,并创建子文件夹(一段视频一个文件夹)。依次读取源文件里的文件,如果后缀名是‘avi'或 ’MP3',则创建一个关于文件名的子文件夹
  52. file_count = 0 # 用于统计个数,验证是否全为视频文件,会与len(files_in_video_path_list)进行比较
  53. every_video_save_dir = ""
  54. file_name = os.path.basename(file_in_video_path)
  55. if file_name.split('.')[-1] == 'avi' or file_name.split('.')[-1] == 'mp4':
  56. file_count += 1 # 视频文件数+1
  57. every_video_save_dir = file_name.split('.')[0] + '\\'
  58. if not os.path.exists(image_save_dir + every_video_save_dir): # 创建属于相应文件夹的存储路径
  59. os.makedirs(image_save_dir + every_video_save_dir)
  60. else:
  61. print(' \033[0;37;41merror\033[0m')
  62. return file_name, every_video_save_dir

运行结果

步骤二:实现二次截取并保存到本地文件夹,HSV颜色模型识别红色,即延时超过200ms时的字体颜色。

  1. #!/usr/bin/env python
  2. # coding=utf-8
  3. import os
  4. import time
  5. import tempfile
  6. import pytesseract
  7. from functools import reduce
  8. import cv2
  9. from PIL import Image
  10. PATH = lambda p: os.path.abspath(p)
  11. TEMP_FILE = PATH(tempfile.gettempdir() + "/temp_screen.png")
  12. TEMP_FILE_NEW = PATH(tempfile.gettempdir())
  13. class ImageAssert(object):
  14. @staticmethod
  15. def get_screenshot_by_custom_size(video_file_dir, i, phone_type):
  16. # 自定义截取范围
  17. start_x = 0
  18. start_y = 0
  19. end_x = 0
  20. end_y = 0
  21. # M1
  22. if phone_type == 1:
  23. start_x = 1900
  24. start_y = 5
  25. end_x = 1969
  26. end_y = 35
  27. # M2
  28. if phone_type == 2:
  29. start_x = 2025
  30. start_y = 5
  31. end_x = 2100
  32. end_y = 35
  33. # M3
  34. if phone_type == 3:
  35. start_x = 2025
  36. start_y = 5
  37. end_x = 2100
  38. end_y = 35
  39. # IQOO11
  40. if phone_type == 4:
  41. start_x = 300
  42. start_y = 1040
  43. end_x = 376
  44. end_y = 1070
  45. file_img = PATH(video_file_dir + "\\" + str(i) + ".jpg")
  46. box = (start_x, start_y, end_x, end_y)
  47. image = Image.open(file_img)
  48. newImage = image.crop(box)
  49. if not os.path.exists(video_file_dir + "\\part\\"):
  50. os.makedirs(video_file_dir + "\\part\\")
  51. newImage.save(video_file_dir + "\\part\\" + str(i) + ".jpg")
  52. # print(video_file_dir + "\\part\\" + str(i) + ".jpg")
  53. @staticmethod
  54. def pic_ocr(video_file_dir, i):
  55. # 识别时延
  56. file_img_path = video_file_dir + "\\part\\" + str(i) + ".jpg"
  57. # 加载图片
  58. rawImage = cv2.imread(file_img_path)
  59. # 灰度
  60. gray = cv2.cvtColor(rawImage, cv2.COLOR_BGR2GRAY)
  61. # 二值化
  62. ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
  63. # 识别
  64. string = pytesseract.image_to_string(binary, lang='eng', config='--psm 7 ')
  65. print("帧数: " + str(i) + " 时延: " + string)
  66. return string
  67. @staticmethod
  68. def pic_color_ocr(video_file_dir, i):
  69. import cv2
  70. import numpy as np
  71. img = cv2.imread(video_file_dir + "\\part\\" + str(i) + ".jpg")
  72. # 在彩色图像的情况下,解码图像将以b g r顺序存储通道。
  73. grid_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  74. # 从RGB色彩空间转换到HSV色彩空间
  75. grid_HSV = cv2.cvtColor(grid_RGB, cv2.COLOR_RGB2HSV)
  76. # 红色H、S、V范围一:
  77. lower1 = np.array([0, 43, 46])
  78. upper1 = np.array([10, 255, 255])
  79. mask1 = cv2.inRange(grid_HSV, lower1, upper1) # mask1 为二值图像
  80. # res1 = cv2.bitwise_and(grid_RGB, grid_RGB, mask=mask1)
  81. # 红色H、S、V范围二:
  82. lower2 = np.array([156, 43, 46])
  83. upper2 = np.array([180, 255, 255])
  84. mask2 = cv2.inRange(grid_HSV, lower2, upper2)
  85. # res2 = cv2.bitwise_and(grid_RGB, grid_RGB, mask=mask2)
  86. # 将两个二值图像结果 相加
  87. mask3 = mask1 + mask2
  88. # # 结果显示
  89. # cv2.imshow("mask3", mask3)
  90. # print(str(cv2.countNonZero(mask3)))
  91. if cv2.countNonZero(mask3) > 500:
  92. print("第 " + str(i) + "张图片" + str(cv2.countNonZero(mask3)))
  93. # print('Red is present!')
  94. # print("第 " + str(i) + "张图片,卡顿次数 +1")
  95. return True
  96. else:
  97. # print('Red is not present!')
  98. return False

步骤三:调用二次截取时延部分图片及识别图片的接口

  1. import os
  2. from src.img_assert import ImageAssert
  3. PATH = lambda p: os.path.abspath(p)
  4. class CheckImage(object):
  5. @staticmethod
  6. def check_img(image_save_dir, video_file):
  7. video_file_dir = image_save_dir + video_file
  8. pic_count = os.listdir(video_file_dir)
  9. # print("sum pic: " + str(len(pic_count)))
  10. pic_count = len(pic_count)
  11. delay_frame_num = 0 # 卡顿帧数
  12. delay_flag = 0
  13. delay_times = 0
  14. # 识别是手机型号
  15. phone_type = -1
  16. if "M1" in video_file:
  17. phone_type = 1
  18. elif "M2" in video_file:
  19. phone_type = 2
  20. elif "M3" in video_file:
  21. phone_type = 3
  22. elif "IQOO" in video_file:
  23. phone_type = 4
  24. for i in range(1, pic_count):
  25. # 裁切图片只保留时延部分
  26. ImageAssert.get_screenshot_by_custom_size(video_file_dir, i, phone_type)
  27. # 识别时延
  28. is_delay = ImageAssert.pic_color_ocr(video_file_dir, i)
  29. if is_delay:
  30. if delay_flag == 0 or delay_flag == 2:
  31. delay_times += 1
  32. # print("第 " + str(i) + "张图片开始一段卡顿,卡顿次数 +1")
  33. delay_frame_num += 1
  34. delay_flag = 1
  35. else:
  36. delay_flag = 2
  37. i += 1
  38. print("#" * 100 + "\n视频名称:" + video_file + "\n视频时延总时长: " + str(delay_frame_num) + "\n视频卡顿次数: " +
  39. str(delay_times))
  40. print("#" * 100)
  41. return pic_count, delay_frame_num, delay_times

main.py

主程序调用进行多线程统计并输出测试结果

  1. import os
  2. import threading
  3. import time
  4. from src.img_check import CheckImage
  5. from src.video2pic import Video2images
  6. # 预期存储在的主文件夹,即'result'文件夹
  7. image_save_dir = '/WifiCheckTool/result/'
  8. # 需要转换的视频路径列表,直达视频文件(自定义修改)
  9. video_path_list = ['/WifiCheckTool/source/']
  10. class WifiVideoCheck:
  11. @staticmethod
  12. # 视频按帧转换为图片
  13. def video2images(file_name, video_path, every_video_save_dir):
  14. Video2images.videos2images(file_name, video_path, image_save_dir, every_video_save_dir)
  15. @staticmethod
  16. # 统计总帧数、卡顿帧数、卡顿次数
  17. def check_delay(video_file):
  18. CheckImage.check_img(image_save_dir, video_file)
  19. def run(self):
  20. for video_path in video_path_list:
  21. files_in_video_path_list = os.listdir(video_path)
  22. for file_in_video_path in files_in_video_path_list:
  23. file_name, every_video_save_dir = Video2images.mkdir_file(file_in_video_path, image_save_dir)
  24. threading.Thread(target=self.video2images, args=(file_name, video_path, every_video_save_dir, )).start()
  25. is_start = True
  26. while is_start:
  27. time.sleep(5)
  28. length = len(threading.enumerate())
  29. # print('当前运行的线程数为:%d' % length)
  30. if length <= 1:
  31. time.sleep(5)
  32. files_in_video_path_list = os.listdir(image_save_dir)
  33. for video_file in files_in_video_path_list:
  34. threading.Thread(target=self.check_delay, args=(video_file, )).start()
  35. is_start = False
  36. if __name__ == '__main__':
  37. wifiVideoCheck = WifiVideoCheck()
  38. wifiVideoCheck.run()

原文链接:https://blog.csdn.net/qq_31856023/article/details/136217706

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

闽ICP备14008679号