【问题标题】:Emgu.cv binding failure in WPFWPF中的Emgu.cv绑定失败
【发布时间】:2021-03-05 05:28:11
【问题描述】:

我正在尝试从相机捕获视频并以 c# WPF 形式显示。但是当我启动程序时图像不显示。调试器也不例外,它只是在运行。我正在调试,我看到 CapturedImage 属性正在按照应有的方式获取数据。可能是它们在不同的线程中工作。但我想不通。所以,帮帮我,

我正在绑定一个 ImageSource 类型的属性。如您所见,

public class VideoCapturing : INotifyPropertyChanged
{
    private ImageSource capturedImage;
    public ImageSource CapturedImage
    {
        get { return capturedImage;  }
        set { capturedImage = value; OnPropertyChanged("CapturedImage"); }
    }

这里还有捕获代码,

public void run()
    {
        if (cap.capture == null)
        {
            capture = new Emgu.CV.VideoCapture(0);
            CurrentFrame = new Mat();
             
        }
        capture.ImageGrabbed += VideoCapture_ImageGrabbed;
        capture.Start();
       
    }
private void VideoCapture_ImageGrabbed(object sender, EventArgs e) // runs in worker thread
    {
       capture.Retrieve(CurrentFrame);
       CapturedImage = ImageSourceFromBitmap(CurrentFrame.ToImage<Emgu.CV.Structure.Bgr, byte>().ToBitmap()); 
    } 
} // VideoCapturing class ends.

这里是绑定的xaml部分,

<Grid>
    <Image x:Name="img" Source="{Binding CapturedImage}"></Image> 
</Grid> 

这是mainwindow.xaml.cs,

public MainWindow()
    {
        InitializeComponent(); 
        VideoCapturing VideoCapture = new VideoCapturing();
        this.DataContext = VideoCapture ;
        VideoCapture.run();
    }

【问题讨论】:

    标签: c# wpf emgucv


    【解决方案1】:

    拨打OnPropertyChanged() 时出现拼写错误。 "CaptureImage" 但应该是"CapturedImage"

    public ImageSource CapturedImage
    {
        get { return capturedImage;  }
        set { capturedImage = value; OnPropertyChanged("CapturedImage"); }
    }
    

    MainWindow 中,您应该调用VideoCapture.run() 而不是capture.run()

    由于VideoCapture_ImageGrabbed 在工作线程中运行,您已通过调用Dispatcher.BeginInvoke 在UI 线程上设置CapturedImage

    private void VideoCapture_ImageGrabbed(object sender, EventArgs e)
    {
        capture.Retrieve(CurrentFrame);
        Application.Current.Dispatcher.BeginInvoke(new Action(() =>
        {
            CapturedImage = ImageSourceFromBitmap(CurrentFrame.ToImage<Emgu.CV.Structure.Bgr, byte>().ToBitmap()); 
        }));
    } 
    

    【讨论】:

    • 这真是一个很好的收获。它有点工作,但现在我可以得到真正的错误,即“必须在与 DependencyObject 相同的线程上创建 DependencySource”。你能帮我解决这个问题吗?提前致谢,
    • 你是最伟大的。我衷心感谢你。我试图解决这个问题好几天了。欣赏它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2018-01-21
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多