首页 > 解决方案 > 如何删除 OpenCvSharp、Cv2.ImShow()、c#、wpf 中的标题栏

问题描述

        private void button_Click(object sender, RoutedEventArgs e)
        {
            VideoCapture video = new VideoCapture(0);
            Mat frame = new Mat();

            while (Cv2.WaitKey(33) != 'q') 
            {
                video.Read(frame);
                Cv2.ImShow(" ", frame);
            }

            Cv2.ImWrite("./Capture2.png", frame);

            frame.Dispose();
            video.Release();
            Cv2.DestroyAllWindows();
            
        }
  1. 当您按下按钮时,会出现一个类似图像的弹出窗口。

在此处输入图像描述

  1. 如何去除 Cv2.ImShow() 自动生成的弹出窗口的标题栏?

标签: c#wpfopencv

解决方案


由于版本 v4.5.1.20210210OpenCvSharp提供了一个返回窗口句柄的方法。

您可以使用 Win32 API 删除标题栏并显示图像。

var windowName = "Image";
using (var source = Cv2.ImRead("<path_to_image>"))
{
    Cv2.NamedWindow(windowName);
    var handle = Cv2.GetWindowHandle(windowName);
    WindowHelper.RemoveTitleBar(handle, windowName);
    Cv2.ImShow(windowName, source);
    Cv2.WaitKey();
    Cv2.DestroyWindow(windowName);
}

WindowHelper

public static class WindowHelper
{
    const int GWL_STYLE = -16;
    const long WS_OVERLAPPEDWINDOW = 0x00CF0000;
    const long WS_POPUP = 0x80000000;

    public static void RemoveTitleBar(IntPtr hwnd, string windowName)
    {
        // change style of the child HighGui window
        long style = GetWindowLong(hwnd, GWL_STYLE);
        style &= ~WS_OVERLAPPEDWINDOW;
        style |= WS_POPUP;
        SetWindowLong(hwnd, GWL_STYLE, style);

        // change style of the parent HighGui window
        IntPtr hParent = FindWindow(null, windowName);
        style = GetWindowLong(hParent, GWL_STYLE);
        style &= ~WS_OVERLAPPEDWINDOW;
        style |= WS_POPUP;
        SetWindowLong(hParent, GWL_STYLE, style);
    }

    [DllImport("user32", EntryPoint = "GetWindowLongA")]
    public static extern long GetWindowLong(IntPtr hwnd, int nIndex);

    [DllImport("user32", EntryPoint = "SetWindowLongA")]
    public static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);

    [DllImport("user32")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
}

推荐阅读