从不同屏幕截取的屏幕截图的不同 RGB 值

时间:2021-02-02 12:17:27

标签: python selenium opencv

我正在开发一个测试自动化软件,我使用 selenium 从网页中截取屏幕截图,然后使用 opencv 处理图像。现在,软件是从不同的屏幕启动的,当我从不同的屏幕截取特定图像的屏幕截图时,图像的 RGB 值会发生变化。这是从不同屏幕拍摄的相同图像的两个示例:

enter image description here enter image description here 如您所见,RGB 值略有不同。 RGB 值对我来说非常重要,因为我使用颜色阈值处理图像,例如:

from io import BytesIO
import cv2
import numpy as np
from PIL import Image
from selenium import webdriver


def get_viewport_size(driver):
    window_size = driver.get_window_size()
    outer_sub_inner = driver.execute_script("""
        return [window.outerWidth - window.innerWidth,
          window.outerHeight - window.innerHeight];
        """)

    return window_size['width'] - outer_sub_inner[0], window_size['height'] - outer_sub_inner[1]


def set_viewport_size(driver, width, height):
    window_size = driver.execute_script("""
        return [window.outerWidth - window.innerWidth + arguments[0],
          window.outerHeight - window.innerHeight + arguments[1]];
        """, width, height)
    driver.set_window_size(*window_size)


SIZE_FOR_GRAPHS = (1440, 798)

options = webdriver.ChromeOptions()
options.binary_location = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
prefs = {'profile.default_content_setting_values.automatic_downloads': 1,
         "credentials_enable_service": False,
         "profile.password_manager_enabled": False}
options.add_experimental_option("prefs", prefs)
options.add_experimental_option("useAutomationExtension", False)
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_argument('--force-device-scale-factor=1')
chrome_driver_binary = "/usr/local/bin/chromedriver"

driver = webdriver.Chrome(executable_path=chrome_driver_binary, chrome_options=options)
driver.get('https://stackoverflow.com/')
set_viewport_size(driver, SIZE_FOR_GRAPHS[0], SIZE_FOR_GRAPHS[1])
scr = driver.get_screenshot_as_png()
# Convert img to BytesIO
scr = Image.open(BytesIO(scr))
view_x, view_y = get_viewport_size(driver=driver)
scr = scr.resize((2 * view_x, 2 * view_y), Image.ANTIALIAS)
# Convert to format accepted by OpenCV
scr = np.asarray(scr, dtype=np.float32).astype(np.uint8)
# Convert image from BGR to RGB format
image = cv2.cvtColor(scr, cv2.COLOR_BGR2RGB)
driver.close()


hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_image, lowerb=(0, 0, 0), upperb=(180, 255, 255))

imask = mask > 0
masked = np.zeros_like(hsv_image, np.uint8)
masked[imask] = hsv_image[imask]

这个例子适用于我用两个不同的屏幕拍摄的屏幕截图,我的 Mac 屏幕和一个通过 HDMI 连接到我的 Mac 的 HP 屏幕。两个截图的阈值化结果如下: enter image description here enter image description here 很明显,两个图像中的掩蔽是不同的。 有没有办法在不同屏幕截图的过程中统一RGB值?

编辑:

我将 HP 显示器的显示器颜色设置为与 Mac 显示器的颜色(LCD 颜色)相同,并且运行良好。我想知道是否有一种方法可以使用 Python 或 Selenium 设置显示器颜色,以便为驱动程序截取的屏幕截图提供固定颜色

0 个答案:

没有答案