我具有以下捕获桌面的内容,并将位图转换为地图以在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
谢谢
答案 0 :(得分:1)
很抱歉我的最新答案,但我只是看到了问题并亲自解决了这个问题:
您必须在while循环中运行WaitKey,因为其他Windows(或执行此操作的人:))无法处理图像,因此只需添加:
Cv2.WaitKey(milis)