我正在使用Accord(以前的AForge)从网络摄像头捕获图像帧。
这些图片是通过VideoCaptureDevice.NewFrame
事件到达的:
public delegate void NewFrameEventHandler(object sender, NewFrameEventArgs eventArgs);
public class NewFrameEventArgs : EventArgs
{
public Bitmap Frame { get; }
public NewFrameEventArgs(Bitmap frame);
}
问题是,我尝试使用Observable.FromEvent
,但在很多可能的重载中丢失了:
void Run()
{
var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
// regular way
videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
// intended rx way
var receivedFrames = Observable.FromEvent(????) /////////// How?
}
void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
// do something
}
我知道我不能使用Observable.FromEventPattern
,但不知道该使用什么,更不用说了。
答案 0 :(得分:2)
尝试以下方法:
var receivedFrames = Observable.FromEventPattern<NewFrameEventHandler, NewFrameEventArgs>(
handler => handler.Invoke,
h => videoSource.NewFrame += h,
h => videoSource.NewFrame -= h);
当我第一次学习Rx时,我发现以下网站非常有用:IntroToRx(链接转到我找到这个例子的部分)。
答案 1 :(得分:1)
我想出了这个(并在LinqPad中进行了测试)
var observable = Observable.FromEvent<NewFrameEventHandler, NewFrameEventArgs>(
(handler) =>
{
NewFrameEventHandler frameHandler = (sender, e) =>
{
handler(e);
};
return frameHandler;
},
eh => videoSource.NewFrame += eh,
eh => videoSource.NewFrame -= eh
);
observable.Subscribe((frameEventArgs) => { frameEventArgs.Dump(); });
根据this question的答案,这是一个很好的练习。
因此它使用Observable.FromEvent
的{{3}}。
很高兴知道它是否可以写得更紧凑。