# -*- 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)