OpenCvSharp函数:Window相关函数
OpenCvSharp函数示例NamedWindow创建窗口GetWindowProperty获取窗口属性SetWindowProperty设置窗口属性MoveWindow移动窗口ResizeWindow改变窗口大小StartWindowThreadSetWindowTitle修改窗口标题GetWindowImageRect获取窗口中图像在屏幕中的位置SelectROI从图像中选择感兴趣区域Sel
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
官方文档没有解释
参考
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);
}
}
参考
更多推荐
所有评论(0)