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窗口是否置顶。窗口不存在时报错。VSYNCOpenGL模式中用到,是否启用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 heightSize size新窗口的大小。 当窗口类型为Normal时,最小宽度受滚动条宽度影响。

StartWindowThread

官方文档没有解释

参考

opencv中startWindowThread()的使用

What does cv::startwindowthread() do?

SetWindowTitle修改窗口标题

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

//函数原型

void SetWindowTitle(string winName,

    string title)

参数说明string winName待修改窗口标题的窗口名称。注意,使函数不修改winNamestring 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);

}

}

///

/// 选择区域

///

///

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();

}

///

/// 测试改变大小和移动窗口

///

///

///

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();

}

///

/// 测试SetWindowProperty函数

///

///

///

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();

}

///

/// 测试GetWindowProperty各参数值

///

///

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();

}

///

/// 测试NamedWindows函数

///

///

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/

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: