使用OpenCV连续捕获桌面循环

时间:2018-07-10 08:21:43

标签: c# opencvsharp

我具有以下捕获桌面的内容,并将位图转换为地图以在OpenCVSharp中进行边缘处理:

ptr = &(*(arr + 5))

我正在尝试实时捕获桌面,不断更新dst窗口

我尝试了一段时间的睡眠循环,但dst窗口最终变成灰色并挂起

在opencvsharp中有没有更有效的捕获和转换方法?

我找到了一个python示例,但使用了numpy和imagegrab,这在c#中是可能的?

static void Main(string[] args)
{
    var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                   Screen.PrimaryScreen.Bounds.Height,
                                   PixelFormat.Format32bppArgb);

    var gfxScreenshot = Graphics.FromImage(bmpScreenshot);

    gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                Screen.PrimaryScreen.Bounds.Y,
                                0,
                                0,
                                Screen.PrimaryScreen.Bounds.Size,
                                CopyPixelOperation.SourceCopy);

    Bitmap bitmap = new Bitmap(bmpScreenshot); 

    Mat src = BitmapConverter.ToMat(bitmap);
    Mat dst = new Mat();

    Cv2.Canny(src, dst, 0, 0);

    using (new Window("dst image", dst))
    {
        Cv2.WaitKey();
    }
}

确定找到了一种方法来实现此目的,但是它的进食记忆香港专业教育学院尝试了src.dispose()但仍然会撕裂内存吗?

import numpy as np
from PIL import ImageGrab
import cv2

def screen_record(): 
while True:
    printscreen_pil =  ImageGrab.grab()
    printscreen_numpy =   np.array(printscreen_pil.getdata(),dtype='uint8')\
    .reshape((printscreen_pil.size[1],printscreen_pil.size[0],3)) 
    cv2.imshow('window',printscreen_numpy)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

谢谢

1 个答案:

答案 0 :(得分:1)

很抱歉我的最新答案,但我只是看到了问题并亲自解决了这个问题:

您必须在while循环中运行WaitKey,因为其他Windows(或执行此操作的人:))无法处理图像,因此只需添加:

Cv2.WaitKey(milis)