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/
参考链接
发表评论