当前位置: 首页 > news >正文

OpencvSharp 算子学习教案之 - Cv2.SetWindowProperty

OpencvSharp 算子学习教案之 - Cv2.SetWindowProperty大家好Opencv在很多工程项目中都会用到而OpencvSharp则是以C#开发与实现的Opencv操作库对.NET开发人员友好但很多API的中文资料、应用场景及常见坑点等缺乏系统性归纳因此这系列博客将给大家带来Cv2及Mat对象全系列算子学习教案供大家参考学习。Cv2.SetWindowProperty教案版本V1.0面向对象OpenCvSharp 初学者所属模块highgui源码位置OpenCvSharp/Cv2/Cv2_highgui.cs:149摘要SetWindowProperty 用来动态修改窗口属性例如置顶、全屏、自动尺寸等。本文选取 Topmost 作为教学属性演示如何先读取属性、再修改属性、最后恢复属性帮助初学者理解窗口行为的动态调整方式。1. 函数名称带参数签名publicstaticvoidSetWindowProperty(stringwinName,WindowPropertyFlagspropId,doublepropValue)2. 函数用途Cv2.SetWindowProperty的作用是动态修改指定窗口的属性。它最常见的用途有切换窗口是否置顶。切换窗口是否自动尺寸。切换窗口是否全屏。在调试时动态观察窗口行为变化。这个函数的关键点是它修改的是窗口属性不是窗口内容。3. 函数公式这个函数更适合用流程图理解而不是严格的数学公式窗口属性旧值→SetWindowProperty(propId,propValue)→窗口属性新值 \text{窗口属性旧值} \rightarrow \text{SetWindowProperty}(propId, propValue) \rightarrow \text{窗口属性新值}窗口属性旧值→SetWindowProperty(propId,propValue)→窗口属性新值也就是说SetWindowProperty会把某个窗口属性切换到你指定的新状态。4. 函数原理说明这个函数的逻辑可以理解为接收窗口名称winName。接收属性编号propId。接收新的属性值propValue。把这个属性写回到高 GUI 后端。对于初学者来说propId决定你修改什么propValue决定你把它改成什么。5. 参数含义解析项目类型含义winNamestring要修改属性的窗口名称propIdWindowPropertyFlags要修改的窗口属性编号propValuedouble新属性值通常是 0.0 或 1.0返回值void没有返回值只负责设置属性补充说明propId是枚举值不是字符串。propValue虽然是double但很多属性只用 0.0/1.0 这种开关值。不同后端对某些属性的支持程度可能略有差异。6. 应用场景列表场景名场景说明典型用途场景A切换 Topmost把窗口置顶并恢复基础教学场景B切换全屏调整窗口全屏状态交互演示场景C切换自动尺寸控制窗口是否按图像自动缩放窗口布局场景D调试窗口状态动态观察窗口属性变化调试排查7. 函数使用示例下面的 Console 程序演示Cv2.SetWindowProperty。示例会先读取窗口的 Topmost 属性再把它设为 1.0最后恢复回 0.0。usingSystem.Globalization;usingSystem.Text;usingOpenCvSharp;internalstaticclassProgram{/// summary/// 程序入口。/// /summaryprivatestaticvoidMain(){// 中文控制台输出使用 UTF-8避免教学说明乱码。Console.OutputEncodingEncoding.UTF8;// 调用演示函数观察窗口属性如何被动态修改。RunSetWindowPropertyDemo();}/// summary/// 演示 SetWindowProperty 的完整流程。/// /summaryprivatestaticvoidRunSetWindowPropertyDemo(){conststringwindowNameCv2.SetWindowProperty.Sample;// 准备一张教学图片让窗口里有内容可以观察。usingvarimageCreateDemoImage(SetWindowProperty,切换窗口属性 Topmost);// 先清理旧窗口避免重复运行时残留上一次的状态。TryDestroyWindow(windowName);// 先创建普通窗口并显示图像然后读取和修改窗口属性。Cv2.NamedWindow(windowName,WindowFlags.Normal);Cv2.ImShow(windowName,image);Cv2.WaitKey(1);// 先读取一次属性值方便和后续设置结果做对比。varbeforeValueCv2.GetWindowProperty(windowName,WindowPropertyFlags.Topmost);// 把窗口置顶演示 SetWindowProperty 的核心作用。Cv2.SetWindowProperty(windowName,WindowPropertyFlags.Topmost,1.0);Cv2.WaitKey(1);// 再读取一次属性值观察设置之后的变化。varenabledValueCv2.GetWindowProperty(windowName,WindowPropertyFlags.Topmost);// 为了不让示例结束后留下一个“总在最前面”的窗口这里再把属性恢复回去。Cv2.SetWindowProperty(windowName,WindowPropertyFlags.Topmost,0.0);Cv2.WaitKey(1);// 最后再读一次确认属性已经恢复。varrestoredValueCv2.GetWindowProperty(windowName,WindowPropertyFlags.Topmost);// 教学演示结束后关闭窗口避免残留。TryDestroyWindow(windowName);Console.WriteLine($设置前属性值{beforeValue.ToString(CultureInfo.InvariantCulture)});Console.WriteLine($设置为 1.0 后{enabledValue.ToString(CultureInfo.InvariantCulture)});Console.WriteLine($恢复为 0.0 后{restoredValue.ToString(CultureInfo.InvariantCulture)});}/// summary/// 创建用于演示的教学图片。/// /summary/// param nametitle主标题。/param/// param namesubtitle副标题。/param/// returns彩色教学图。/returnsprivatestaticMatCreateDemoImage(stringtitle,stringsubtitle){// 先创建一张浅色背景图方便后续文字和图形清楚显示。varcanvasnewMat(360,520,MatType.CV_8UC3,newScalar(246,243,238));// 画边框和标题让这张图更像教学素材。Cv2.Rectangle(canvas,newRect(18,18,484,324),newScalar(66,84,118),3,LineTypes.AntiAlias);Cv2.PutText(canvas,title,newPoint(44,84),HersheyFonts.HersheySimplex,1.0,newScalar(58,48,44),2,LineTypes.AntiAlias);Cv2.PutText(canvas,subtitle,newPoint(44,126),HersheyFonts.HersheySimplex,0.8,newScalar(58,48,44),2,LineTypes.AntiAlias);// 再加几个图形让窗口里的内容更丰富一些。Cv2.Circle(canvas,newPoint(140,214),44,newScalar(80,170,255),-1,LineTypes.AntiAlias);Cv2.Circle(canvas,newPoint(260,214),44,newScalar(120,225,110),-1,LineTypes.AntiAlias);Cv2.Circle(canvas,newPoint(380,214),44,newScalar(50,140,255),-1,LineTypes.AntiAlias);returncanvas;}/// summary/// 尝试关闭指定窗口。/// /summary/// param namewindowName窗口名称。/paramprivatestaticvoidTryDestroyWindow(stringwindowName){try{// 如果窗口不存在这里可能会抛异常所以用 try/catch 做保护。Cv2.DestroyWindow(windowName);}catch{// 清理失败不影响教学示例主体流程。}}}8. 注意事项propId是窗口属性编号不是字符串。propValue是double但很多属性只用 0.0/1.0 这样的开关值。不同平台对某些窗口属性的支持程度可能不同。示例结束时最好把属性恢复回去避免影响后续调试。9. 调优建议讲解时优先选择 Topmost 这种容易观察的属性。如果你已经拿到GetWindowProperty的值先读后改会更容易理解变化。在多窗口演示中属性切换可以帮助你更好地观察前后层级。建议先把一个属性讲透再扩展到全屏、自动尺寸等其它属性。10. 运行说明如果你在控制台工程里运行本文示例直接把代码放进Program.cs即可。如果你在本仓库里学习请打开 WPF 控件Cv2SetWindowProperty点击按钮观察属性变化。WPF 示例会把属性值变化写入结果文本框。11. 常见错误排查把SetWindowProperty当成改图像内容的函数。把propValue当成整数随意传忽略它实际是double。改完属性后忘记恢复导致后面的窗口一直置顶。在不支持该属性的后端上测试结果和预期不一致。
http://www.gsyq.cn/news/1347766.html

相关文章:

  • 抖音无水印下载器完整指南:三步轻松保存任何抖音内容
  • taotoken的token消耗明细在控制台中的可视化体验
  • 2026年实体店热卖的高性价比专业床垫,究竟好在哪?
  • DeepSeek vs Llama 3 vs Qwen:主流开源大模型许可证兼容性矩阵(含商用/金融/医疗行业适配度评分)
  • Claude 模型重度用户如何借助 Taotoken 规避官方额度限制并节省费用
  • 如何快速掌握GetQzonehistory:QQ空间备份的完整教程
  • 国内核心空港空运报关服务商技术能力实测对比 - 奔跑123
  • 2026全球名义雇主EOR服务商优选,泰国海外人力资源服务商推荐 - 品牌2025
  • 过度设计是程序员的“职业病”,如何克制?
  • 推挽变压器深度解析:隔离电源设计中的选型准则与工程验证
  • Bilibili-Evolved快捷键终极指南:如何自定义键盘操作提升B站体验
  • 从化区做美妆日化老板娘自己管账多年账务很乱换哪家代账公司能规范?|3个风险点+梳理路径全解 - 欢欢在创业
  • 使用 Codex 的一次危险提醒
  • 亨得利夜间停走故障维修深度解析:2026年7城实探,从“睡一觉就不走了”到满血复活全记录 - 亨得利腕表维修中心
  • 关于铰接车辆液压转向时角速度数据震荡的原因探究
  • 2026 上海卡地亚戒指回收避坑攻略:五大平台专业度与套路揭秘 - 李宏哲1
  • 2026年昆明财税行业发展现状 代理记账服务多维信息梳理 - 兔兔不是荼荼
  • 拍了一堆没修图的照片发不出去?这个私有相册让我终于不用再“表演”生活了
  • HarmonyOS APP<<古今职鉴定>>开源教程第22篇:图片处理与资源管理
  • HarmonyOS APP<<古今职鉴定>>开源教程第21篇:弹窗与对话框设计
  • 调用云端或线上顶尖大模型办法(以DeepSeek为例)
  • HCIP-Datacom Core Technology V1.0_18 IGMP原理与配置
  • AI产品经理入门实战:如何理解知识图谱?
  • Engage2026会议各种Notes/Domino演示文档可以下载了
  • 哈尔滨口碑过硬系统窗品牌排行:5家实力企业盘点 - 奔跑123
  • 农业电商|基于SprinBoot+vue的农业电商服务系统(源码+数据库+文档)
  • Neo4j 知识图谱:实体建模+Cypher查询+LangChain接入
  • Forza Painter完整指南:如何将任何图片转换为《极限竞速》专业车辆涂装
  • PLIP终极指南:蛋白质-配体相互作用分析从入门到精通
  • 【Perplexity奖学金搜索黑箱破解】:斯坦福教育技术实验室2024最新测评报告首次公开