NamedWindow创建窗口

函数说明:创建一个窗口。通过窗口名称指向对应的窗口。如果对应名称窗口已经存在,则直接返回。

//函数原型
void NamedWindow(string winName,
    WindowFlags flags = WindowFlags.Normal)

参数

说明

string winName

窗口名称,并用于窗口唯一标识。

WindowFlags flags

窗口标记

WindowFlags窗口标记各值说明

说明

Normal = 0x0

可改变窗口大小(不约束比例),显示的图像随便窗口变化

AutoSize = 0x1

窗口大小由图像确定,不可改变。可最大化,但图像大小不变。

默认用ImShow显示的窗口为该值。

OpenGL = 0x1000

支持OpenGL,但需OpenCv编译为支持OpenGL版本(默认版本不支持)

FullScreen = 0x1

切换到全屏?(作者注:实际效果与AutoSize一样?)

FreeRatio = 0x100

尽可能扩展图像(无比例约束)(作者注:与Normal一样?)

KeepRatio = 0x0

约束比例可缩放?(作者注:与Normal一样?)

GuiExpanded = 0x0

状态栏、工具条?(作者注:与Normal一样?)

GuiNormal = 0x10

古老时髦方式?(作者注:与Normal一样?)

WindowFlags.Normal可缩放拉伸

WindowFlags=AutoSize固定大小,不可拉伸

GetWindowProperty获取窗口属性

函数说明:获取指定窗口名称的相应属性值

//函数原型
double GetWindowProperty(string winName,
    WindowPropertyFlags propId)

参数

说明

string winName

待获取的窗口名称,如果找不到对应窗口,会抛出异常

WindowPropertyFlags propId

待获取的窗口属性值

WindowPropertyFlags窗口属性各值说明,适应于GetWindowProperty/SetWindowProperty

说明

Fullscreen

是否为全屏,0:非全屏,1:全屏。窗口不存在时报错。

AutoSize

是否为按图像大小显示(对应WindowFlags.AutoSize),0:非,1:是。窗口不存在时报错。

AspectRatio

显示图像大小宽、高比例值。窗口不存在时报错。

OpenGL

是否支持OpenGL,-1:不支持。

Visible

窗口是否存在且可见。

Topmost

窗口是否置顶。窗口不存在时报错。

VSYNC

OpenGL模式中用到,是否启用VSYNC(垂直同步)。OpenCvSharp无此参数,

SetWindowProperty设置窗口属性

函数说明:设置窗口各属性的值,不是所有的WindowPropertyFlags都可以设置,有些WindowPropertyFlags只是用来获取属性值

//函数原型
void SetWindowProperty(string winName,
    WindowPropertyFlags propId,
    double propValue)

参数

说明

string winName

待设置的窗口名称。窗口名称不存在的话会抛出异常

WindowPropertyFlags propId

待设置的窗口属性

double propValue

要设置的的属性值

除了窗口的WindowFlags为Normal下时,可以设置WindowPropertyFlags.Fullscreen属性,其它属性都是只读的?(查看源码可知,不同属性在不同平台下作用不同)

MoveWindow移动窗口

函数说明:移动窗口(左上角)到指定位置。

//函数原型
void MoveWindow(string winName,
    int x,
    int y)

参数

说明

string winName

待移动窗口的名称。不存在的话抛出异常。

int x,int y

窗口左上角要移动的目标坐标点

ResizeWindow改变窗口大小

函数说明:改变窗口大小。如果窗口标记为AutoSize则,图像显示不随窗口缩放。非AutoSize时,图像显示随窗口缩放。设置的大小不包括滚动条。要先ImShow再ResizeWindow?

//函数原型1
void ResizeWindow(string winName,
    int width,
    int height)

//函数原型2
void ResizeWindow(string winName,
    Size size)

参数

说明

string winName

待改变大小的窗口名称

int width,int height

Size size

新窗口的大小。

当窗口类型为Normal时,最小宽度受滚动条宽度影响。

StartWindowThread

官方文档没有解释

参考

opencv中startWindowThread()的使用

What does cv::startwindowthread() do?

SetWindowTitle修改窗口标题

函数说明:修改窗口的标题。注意,窗口名称(即winName还是原来的)

//函数原型
void SetWindowTitle(string winName,
    string title)

参数

说明

string winName

待修改窗口标题的窗口名称。注意,使函数不修改winName

string title

新的窗口标题

GetWindowImageRect获取窗口中图像在屏幕中的位置

函数说明:获取指定窗口在当前屏幕中渲染的图像矩形(图像左上角坐标及宽高,不是窗口的大小,也不包括滚动条)

//函数原型
Rect GetWindowImageRect(string winName)

参数

说明

string winName

待获取的窗口名称

返回值Rect

窗口中渲染(可见部分)的图像相对于屏幕的位置及宽高。

SelectROI从图像中选择感兴趣区域

函数说明:创建一个可以通过鼠标选择感兴趣区域(使用"空格键"或"回车键"完成选择,按"C"取消选择)的窗口,返回一个矩形(若取消,返回width和heigh为0)。点关闭时还会打开。

//函数原型1
Rect SelectROI(string windowName,
    InputArray img,
    bool showCrosshair = true,
    bool fromCenter = false)

//函数原型2
Rect SelectROI(InputArray img,
    bool showCrosshair = true,
    bool fromCenter = false)

参数

说明

string windowName

窗口标题

InputArray img

待显示(或选择)的图像

bool showCrosshair

如果为True,则在选择矩形中显示十字架

bool fromCenter

如果为True,则起点为中心点;否则为其中一个角。

返回值Rect

选择的矩形结果(如果取消,则返回Rect.Empty)

SelectROIs从图像中选择多个感兴趣区域

函数说明:可从图像窗口中选择多个感兴趣区域,按"空格键"或"回车键"完成当次并新开一个,按"Esc"结束多选。

//函数原型
Rect[] SelectROIs(string windowName,
    InputArray img,
    bool showCrosshair = true,
    bool fromCenter = false) 

源码示例

public void Run() {
    using (var mat = Cv2.ImRead(ImagePath.LenaColor)) {
        //测试NamedWindow
        TestNamedWindow(mat);

        //测试GetWindowProperty
        TestGetWindowProperty(mat, WindowFlags.Normal);
        TestGetWindowProperty(mat, WindowFlags.AutoSize);

        //测试SetWindowProperty
        TestSetWindowProperty(mat, WindowFlags.Normal);
        TestSetWindowProperty(mat, WindowFlags.AutoSize);

        //测试ResizeWindow、MoveWindow
        TestResizeAndMoveWindow(mat, WindowFlags.Normal);
        TestResizeAndMoveWindow(mat, WindowFlags.AutoSize);

        //测试SelectROI、SelectROIs
        TestSelectROI(mat);
    }
}

/// <summary>
/// 选择区域
/// </summary>
/// <param name="mat"></param>
private void TestSelectROI(Mat mat) {
    var winName = "SelectROI ";

    //按Space\Enter选择,按"C"取消
    var rect = Cv2.SelectROI(winName, mat, true);

    if (rect != Rect.Empty) {
        Cv2.ImShow("Select Result", mat[rect]);
    }
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();

    //按Space\Enter选择,按Esc结束选择
    var rects=Cv2.SelectROIs(winName, mat, true);
    int index = 0;
    foreach(var selectRect in rects) {
        Cv2.ImShow("Select Result"+ index, mat[selectRect]);
        index++;
    }
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

/// <summary>
/// 测试改变大小和移动窗口
/// </summary>
/// <param name="mat"></param>
/// <param name="windowFlag"></param>
private void TestResizeAndMoveWindow(Mat mat, WindowFlags windowFlag) {

    var winName = $"ResizeWindow WindowFlags={windowFlag}";

    //没解释
    Cv2.StartWindowThread();

    //不通过NamedWindow创建,而直接ImShow的窗口,AutoSize=1
    Cv2.NamedWindow(winName, windowFlag);
    Console.WriteLine($"AutoSize={Cv2.GetWindowProperty(winName, WindowPropertyFlags.AutoSize)}");
    //测试ResizeWindow的大小不含滚动条
    Cv2.CreateTrackbar("bar1", winName, 100);
    Cv2.CreateTrackbar("bar2", winName, 100);
    Cv2.ImShow(winName, mat);
    Console.WriteLine($"AutoSize={Cv2.GetWindowProperty(winName, WindowPropertyFlags.AutoSize)}");
    //改变窗口大小,先ImShow再ResizeWindow
    Cv2.ResizeWindow(winName, 300, 300);
    Cv2.WaitKey();
    
    Console.WriteLine($"AutoSize={Cv2.GetWindowProperty(winName, WindowPropertyFlags.AutoSize)}");
    Cv2.ImShow(winName, mat);
    Cv2.ResizeWindow(winName, 600, 600);
    Cv2.WaitKey();

    //移动窗口
    Cv2.MoveWindow(winName, 50, 100);
    Cv2.WaitKey();

    //只是修改窗口标题,不修改winName
    Cv2.SetWindowTitle(winName, "New Title");
    Cv2.WaitKey();

    //还是用winName找窗口,而不是"New Title"
    //指定窗口中渲染的图像的位置及宽高
    var winImageRect = Cv2.GetWindowImageRect(winName);
    Console.WriteLine($"WindowImageRect={winImageRect}");
    Cv2.WaitKey();

    Cv2.DestroyAllWindows();
}



/// <summary>
/// 测试SetWindowProperty函数
/// </summary>
/// <param name="mat"></param>
/// <param name="winFlag"></param>
private void TestSetWindowProperty(Mat mat, WindowFlags winFlag) {
    var winName = "TestGetWindowProperty," + winFlag;
    Cv2.NamedWindow(winName, winFlag);

    Console.WriteLine(winName);
    foreach (WindowPropertyFlags propertyFlag in Enum.GetValues(typeof(WindowPropertyFlags))) {
        try {
            Cv2.SetWindowProperty(winName, propertyFlag, 1);
            Console.WriteLine($"WindowFlags={winFlag},Set {propertyFlag} = 1 ,Get {propertyFlag} = {Cv2.GetWindowProperty(winName, propertyFlag)}");
            Cv2.ImShow(winName, mat);
            Cv2.WaitKey();
            Cv2.SetWindowProperty(winName, propertyFlag, 0);
            Console.WriteLine($"WindowFlags={winFlag},Set {propertyFlag} = 0 ,Get {propertyFlag} = {Cv2.GetWindowProperty(winName, propertyFlag)}");
            Cv2.ImShow(winName, mat);
            Cv2.WaitKey();
        }
        catch (Exception ex) {
            Console.WriteLine($"{propertyFlag},Exception:{ex.Message}");
        }
    }
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

/// <summary>
/// 测试GetWindowProperty各参数值
/// </summary>
/// <param name="mat"></param>
private void TestGetWindowProperty(Mat mat, WindowFlags winFlag) {
    var winName = "TestGetWindowProperty," + winFlag;
    Cv2.NamedWindow(winName, winFlag);
    Cv2.ImShow(winName, mat);
    //Cv2.DestroyAllWindows();
    Console.WriteLine(winName);
    foreach (WindowPropertyFlags propertyFlag in Enum.GetValues(typeof(WindowPropertyFlags))) {
        try {
            Console.WriteLine($"{propertyFlag}={Cv2.GetWindowProperty(winName, propertyFlag)}");
        }
        catch (Exception ex) {
            Console.WriteLine($"{propertyFlag},Exception:{ex.Message}");
        }

    }
    Cv2.WaitKey();
    Cv2.DestroyAllWindows();
}

/// <summary>
/// 测试NamedWindows函数
/// </summary>
/// <param name="mat"></param>
private void TestNamedWindow(Mat mat) {
    //测试WindowFlags各值
    NamedWindowShowWaitDestory("Normal", mat, WindowFlags.Normal);
    NamedWindowShowWaitDestory("AutoSize", mat, WindowFlags.AutoSize);
    NamedWindowShowWaitDestory("OpenGL", mat, WindowFlags.OpenGL);
    NamedWindowShowWaitDestory("FullScreen", mat, WindowFlags.FullScreen);
    NamedWindowShowWaitDestory("FreeRatio", mat, WindowFlags.FreeRatio);
    NamedWindowShowWaitDestory("KeepRatio", mat, WindowFlags.KeepRatio);
    NamedWindowShowWaitDestory("GuiExpanded", mat, WindowFlags.GuiExpanded);
    NamedWindowShowWaitDestory("GuiNormal", mat, WindowFlags.GuiNormal);
}

private void NamedWindowShowWaitDestory(string winName, Mat mat, WindowFlags flags) {
    try {
        winName = "WindowFlags=" + winName;
        Cv2.NamedWindow(winName, flags);
        Cv2.ImShow(winName, mat);
        Cv2.WaitKey();
        Cv2.DestroyAllWindows();
    }
    catch (Exception ex) {//没开启OpenGL的话,会报错
        Console.WriteLine(ex.Message);
    }
}

OpenCvSharp函数示例(目录)

参考

https://docs.opencv.org/

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐