窗口:在摄影机预览上绘制矩形

2024-09-28 22:49:05 发布

您现在位置:Python中文网/ 问答频道 /正文

安卓系统也有很多类似的问题,但到目前为止,我还没有找到与Windows操作系统相关的资源。所以基本上,正如主题所暗示的,我想在我的相机预览上画一个矩形。已经做了一些工作,但我的程序中仍然存在一些问题。由于一些限制,我希望尽可能避免使用opencv。我的做法如下:

  1. 打开Window的内置摄像头应用程序
  2. 运行在屏幕上逐像素绘制矩形的Python代码(见下文)
  3. 用鼠标单击屏幕以移动矩形及其左上角

正如您在代码中所看到的,我实际上并没有在相机预览上绘图,而是在我的屏幕上绘图,相机预览在更低的一层上运行

下面是python代码:

import win32gui, win32ui, win32api, win32con
from win32api import GetSystemMetrics


dc = win32gui.GetDC(0)
dcObj = win32ui.CreateDCFromHandle(dc)
hwnd = win32gui.WindowFromPoint((0,0))
monitor = (0, 0, GetSystemMetrics(0), GetSystemMetrics(1))

red = win32api.RGB(255, 0, 0) # Red

past_coordinates = monitor
rec_x = 200 # width of rectangle
rec_y = 100 # height of rectangle
m = (100, 100) # initialize start coordinate

def is_mouse_down():
    key_code = win32con.VK_LBUTTON
    state = win32api.GetAsyncKeyState(key_code)
    return state != 0

while True:
    if(is_mouse_down() == True):
        m = win32gui.GetCursorPos() 

    for x in range(rec_x):
        win32gui.SetPixel(dc, m[0]+x, m[1], red)
        win32gui.SetPixel(dc, m[0]+x, m[1]+rec_y, red)
        for y in range(rec_y):
            win32gui.SetPixel(dc, m[0], m[1]+y, red)
            win32gui.SetPixel(dc, m[0]+rec_x, m[1]+y, red)

因此,我能够画一个红色的矩形。但是,由于屏幕不断刷新,我的矩形的两条水平线(参见下面的gif)显示为从左到右的连续点。我找不到或想不出一个方法来改进这一点,同时保持每个ckick移动矩形的可能性

demo

请忽略白色矩形。当你点击预览中的任意位置时,它是相机应用程序的内置功能

以下是我用于完成此步骤的参考资料:

  1. How to draw an empty rectangle on screen with Python
  2. https://python-forum.io/Thread-How-to-trigger-a-function-by-clicking-the-left-mouse-click

Tags: 代码应用程序绘图屏幕reddc内置矩形