123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- # -*- coding:utf-8 -*-
- from ssat_sdk import getMenuTree3SelectedPExcelPath
- from ssat_sdk.picture.RGB import RGBColor
- from ssat_sdk.picture.color_space import CIEluvCaculator
- from ssat_sdk.picture.feature_detect import FeatureDetect
- from ssat_sdk.picture.image_util import *
- import os
- import sys
- import time
- import numpy as np
- import cv2 as cv
- import json
- from ssat_sdk.MenuTree3.TConfig import TConfig
- from ssat_sdk.MenuTree3.TExcelParser import CExcelParser
- g_level = ['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth',
- 'Seventh', 'Eighth', 'Ninth', 'Tenth', 'Eleventh', 'Twelfth']
- class TFocus():
- def __init__(self, project_path, uitRunner=None, screen=[1920, 1080], icon_shape=[1920, 1080]):
- self.params_path = project_path
- self.rgbColor = RGBColor()
- self.CIE = CIEluvCaculator()
- self.feature_detect = FeatureDetect()
- self.xlsparser = uitRunner.uitPathManage
- # icon分辨率width*height;
- self.icon_shape = icon_shape
- # 当前屏幕分辨率;
- self.screen = screen
- # 比率;
- self.rate = self.icon_shape[0] / self.screen[0]
- def findFocusByIcon(self, src_pic, icon_pic,
- dcfg={"offset": 20, "minPeri": 0, "maxPeri": 0, "minArea": 0, "maxArea": 0, "morphology": []}):
- iconImg = cv.imread(icon_pic)
- # 获取小图平均bgr值;
- bgr = self.rgbColor.getAvgBGR(iconImg)
- print "findFocusByIcon,bgr:%s, src_pic=%s, icon_pic=%s, dcfg=%s" % (
- str(bgr), src_pic, icon_pic, str(dcfg))
- if dcfg.has_key("morphology"):
- morphology = dcfg["morphology"]
- else:
- morphology = []
- return self.feature_detect.findCurrentFoucsByColor(
- src_pic,
- [],
- bgr,
- dcfg["offset"],
- dcfg["minPeri"],
- dcfg["maxPeri"],
- dcfg["minArea"],
- dcfg["maxArea"],
- morphology)
- # 文本颜色焦点区域查找;
- def findFramelessBoxByIcon(self, src_pic, icon_pic, offset=20):
- iconImg = cv.imread(icon_pic)
- # 获取小图平均bgr值;
- bgr = self.rgbColor.getAvgBGR(iconImg)
- print "findFramelessBoxByIcon,bgr:%s, src_pic=%s, icon_pic=%s, offset=%s" % (
- str(bgr), src_pic, icon_pic, str(offset))
- return self.feature_detect.findFramelessFocusByColor(src_pic, [], bgr, offset)
- '''
- 在传入的图片上,查找指定小图片bgr颜色框矩形区域,返回矩形区域的坐标
- :param bigPic:图片路径
- :param level:excel层次
- :param first_parent:大部分情况下是根菜单;少部分情况是当前option的parent;
- :return rectArea:矩形区域和区域图像内容
- '''
- def findRectByIcon(self, bigPic, level, first_parent, option=""):
- print "level:", level
- print "first_parent:", first_parent
- if option.__len__() == 0:
- icon_path = os.path.join(self.params_path, "icon\\", str(
- first_parent) + "." + str(level) + ".png")
- else:
- icon_path = os.path.join(self.params_path, "icon\\", str(
- first_parent) + "." + str(level) + "_" + option + ".png")
- print "icon_path_option=", icon_path
- if os.path.exists(icon_path) is False:
- icon_path = os.path.join(self.params_path, "icon\\", str(
- first_parent) + "." + str(level) + ".png")
- print "icon_path=", icon_path
- if os.path.exists(icon_path) is False:
- icon_path = os.path.join(self.params_path, "icon\\", str(
- first_parent) + "." + str('First') + ".png")
- print "icon_path_First=", icon_path
- if os.path.exists(icon_path) is False:
- return False, []
- # 获取配置文件值;
- dcfg = {"offset": 20, "minPeri": 0,
- "maxPeri": 0, "minArea": 0, "maxArea": 0}
- ini_path = os.path.join(self.params_path, "menutree.ini")
- if os.path.exists(ini_path) is True:
- tconfig = TConfig(ini_path)
- if tconfig.has_option(level, first_parent):
- dcfg = tconfig.get_dict(tconfig.get_value(level, first_parent))
- dcfg['minPeri'] = self.rate * dcfg['minPeri']
- dcfg['maxPeri'] = self.rate * dcfg['maxPeri']
- dcfg['minArea'] = pow(self.rate, 2) * dcfg['minArea']
- dcfg['maxArea'] = pow(self.rate, 2) * dcfg['maxArea']
- if "morphology" not in dcfg:
- dcfg["morphology"] = []
- return self.findFocusByIcon(bigPic, icon_path, dcfg)
- '''
- 获取option配置信息;
- '''
- def getOptionConfig(self, cur_option, is_value_sheet=False):
- # 获取Option的others字段信息;
- if self.xlsparser is None:
- self.xlsparser = CExcelParser(getMenuTree3SelectedPExcelPath())
- # 读取excel并解析出内容;
- self.xlsparser.read_excel()
- # 获取option的路径表;
- pp = self.xlsparser.get_option_paths(cur_option)
- if pp.__len__() == 0:
- print 'getOptionConfig.get_option_paths(%s) is null' % (cur_option)
- return False, {"icon_path": "", "dcfg": {}, "dir_path": ""}
- # 获取first_parent;
- first_parent = pp[g_level[0]]['parent']
- # 当前option所在level;
- cur_level = g_level[pp.__len__() - 1]
- # 当前父路径;
- cur_parent = pp[cur_level]['parent']
- if is_value_sheet is True:
- cur_level = 'value'
- # print first_parent, cur_level, cur_parent, cur_option
- # 获取配置文件值;
- dcfg = {}
- ini_path = os.path.join(self.params_path, "menutree.ini")
- tconfig = TConfig(ini_path)
- # 首先找当前路径图;
- icon_path = os.path.join(self.params_path, "icon\\", str(
- cur_parent) + "." + str(cur_level) + "_" + cur_option + ".png")
- icon_dir_path = os.path.join(self.params_path, "icon\\", str(
- cur_parent) + "." + str(cur_level) + "_" + cur_option + ".dir.png")
- dcfg = tconfig.get_value_dict(cur_level, cur_parent + '.' + cur_option)
- print u"trying icon:%s"%icon_path
- print u"trying dcfg:get_value_dict(%s, %s)"%(cur_level, cur_parent + '.' + cur_option)
- # icon路径;
- if os.path.exists(icon_path) is False:
- print u'图标优先级0:[cur_parent].[cur_level]_[cur_option].png=%s is null' % (
- icon_path)
- # 当前次路径图;
- icon_path = os.path.join(self.params_path, "icon\\", str(
- cur_parent) + "." + str(cur_level) + ".png")
- icon_dir_path = os.path.join(self.params_path, "icon\\", str(
- cur_parent) + "." + str(cur_level) + ".dir.png")
- dcfg = tconfig.get_value_dict(cur_level, cur_parent)
- print u"trying icon:%s" % icon_path
- print u"trying dcfg:get_value_dict(%s, %s)" % (cur_level, cur_parent)
- if os.path.exists(icon_path) is False:
- print u'图标优先级1:[cur_parent].[cur_level].png=%s is null' % (
- icon_path)
- # first层;
- icon_path = os.path.join(self.params_path, "icon\\", str(
- first_parent) + "." + str(cur_level) + "_" + cur_option + ".png")
- icon_dir_path = os.path.join(self.params_path, "icon\\", str(
- first_parent) + "." + str(cur_level) + "_" + cur_option + ".dir.png")
- dcfg = tconfig.get_value_dict(
- cur_level, first_parent + '.' + cur_option)
- print u"trying icon:%s" % icon_path
- print u"trying dcfg:get_value_dict(%s, %s)" % (cur_level, first_parent + '.' + cur_option)
- if os.path.exists(icon_path) is False:
- print u'图标优先级2:[first_parent].[cur_level]_[cur_option].png=%s is null' % (
- icon_path)
- # first层次路径图;
- icon_path = os.path.join(self.params_path, "icon\\", str(
- first_parent) + "." + str(cur_level) + ".png")
- icon_dir_path = os.path.join(self.params_path, "icon\\", str(
- first_parent) + "." + str(cur_level) + ".dir.png")
- dcfg = tconfig.get_value_dict(cur_level, first_parent)
- print u"trying icon:%s" % icon_path
- print u"trying dcfg:get_value_dict(%s, %s)" % (cur_level, first_parent)
- if os.path.exists(icon_path) is False:
- print u'图标优先级3:[first_parent].[cur_level].png =%s is null' % (
- icon_path)
- # endif;
- # endif;
- # endif;
- if dcfg.__len__() == 0:
- dcfg = {"offset": 20, "minPeri": 0,
- "maxPeri": 0, "minArea": 0, "maxArea": 0, "morphology": []}
- print u"get dcfg fail!Using default para!"
- if os.path.exists(icon_path) is False:
- print 'getOptionConfig:current use icon_path=%s is null' % (
- icon_path)
- return False, {"icon_path": "", "dcfg": {}, "dir_path": ""}
- print u"实际使用的icon图片路径icon_path:%s, 实际使用INI配置:%s" % (
- str(icon_path), str(dcfg))
- # 返回路径;
- return True, {"icon_path": icon_path, "dcfg": dcfg, "dir_path": icon_dir_path}
- def findRectByIcon2(self, src_pic, cur_option, is_value_sheet=False):
- # 获取参数;
- result, opcfg = self.getOptionConfig(cur_option, is_value_sheet)
- if result is False:
- return False, []
- icon_path = opcfg['icon_path']
- dcfg = opcfg['dcfg']
- dcfg['minPeri'] = self.rate * dcfg['minPeri']
- dcfg['maxPeri'] = self.rate * dcfg['maxPeri']
- dcfg['minArea'] = pow(self.rate, 2) * dcfg['minArea']
- dcfg['maxArea'] = pow(self.rate, 2) * dcfg['maxArea']
- print u"实际使用的聚焦参数字典dcfg:%s" % str(dcfg)
- if "morphology" not in dcfg:
- dcfg["morphology"] = []
- return self.findFocusByIcon(src_pic, icon_path, dcfg)
- def rgb2hsv(r, g, b):
- r, g, b = r / 255.0, g / 255.0, b / 255.0
- mx = max(r, g, b)
- mn = min(r, g, b)
- df = mx - mn
- # h值
- if mx == mn:
- h = 0
- elif mx == r and g >= b:
- h = (60 * (g - b) / df) % 360
- elif mx == r and g < b:
- h = (60 * ((g - b) / df) + 360) % 360
- elif mx == g:
- h = (60 * ((b - r) / df) + 120) % 360
- elif mx == b:
- h = (60 * ((r - g) / df) + 240) % 360
- # s值
- if mx == 0:
- s = 0
- else:
- s = df / mx * 255
- # v值
- v = mx * 255
- # 返回;
- return h, s, v
- if __name__ == "__main__":
- # print '\n\n====>\n', pow(10, 2)
- tFocus = TFocus(r"D:\SAT\resource\MenuTree\MS6586\ISDB")
- tFocus.getOptionConfig('backlight', True)
- tFocus.findRectByIcon2('', 'backlight') # lock
- if 0:
- bigPic_2 = r"D:\CH01.JPG"
- icon = r"D:\SAT\resource\MenuTree\mi\AM950_IND_V27N\result.png"
- result, contourRect = tFocus.findRectByIcon(bigPic_2, 'Third', 'lock')
- print "__name__,rect:", result, contourRect
- if result is True:
- saveCropPic(bigPic_2, icon, contourRect)
|