C#程序源码:相机图片展示、工艺图片打包压缩及全屏显示缺陷图片的类别查询功能

c#程序源码,相机图片展示,工艺图片,打包压缩,全屏显示,缺陷图片,类别查询等

最近在搞工业检测系统,发现几个实用功能点特别有意思。就拿相机图片实时展示来说,用C#的PictureBox控件就能快速实现。不过这里有个坑要注意------直接操作Image对象可能会导致内存泄漏,得用双缓冲机制:

csharp 复制代码
// 工业相机回调函数里这么处理
void OnFrameReceived(byte[] buffer)
{
    using (var ms = new MemoryStream(buffer))
    {
        var newImage = Image.FromStream(ms);
        if (pictureBox1.InvokeRequired)
        {
            pictureBox1.BeginInvoke((MethodInvoker)(() => 
            {
                var old = pictureBox1.Image;
                pictureBox1.Image = (Image)newImage.Clone();
                old?.Dispose();
            }));
        }
    }
}

实测发现用BeginInvoke代替Invoke能减少界面卡顿,特别是当帧率超过30fps的时候。记得要克隆新图像再赋值,否则可能遇到跨线程资源访问问题。

搞定了全屏显示才发现WPF才是真香,WinForm的全屏方案得自己处理任务栏遮挡。这段代码实测有效:

csharp 复制代码
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
// 隐藏鼠标光标
Cursor.Hide();

不过要注意多显示器环境,得用Screen.AllScreens遍历显示器信息。有次现场调试就因为没处理这个,全屏显示跑到工程师的笔记本主屏去了,产线显示器反而黑着...

工艺图纸的打包压缩用System.IO.Compression挺省事,但要注意文件锁定问题。见过有人直接用File.Copy导致产线图片被占用的情况:

csharp 复制代码
using (var archive = ZipFile.Open(zipPath, ZipArchiveMode.Create))
{
    foreach (var tifFile in Directory.GetFiles(scanPath,"*.tif"))
    {
        // 用FileStream明确控制文件访问方式
        using (var fs = new FileStream(tifFile, FileMode.Open, FileAccess.Read))
        {
            var entry = archive.CreateEntry(Path.GetFileName(tifFile));
            using (var entryStream = entry.Open())
            {
                fs.CopyTo(entryStream);
            }
        }
    }
}

缺陷分类查询这块,EF Core的延迟加载在产线环境容易翻车。后来改用原生SQL查询,速度直接起飞:

csharp 复制代码
var defectList = new List<DefectItem>();
using (var conn = new SqlConnection(_config.GetConnectionString("AOI")))
{
    var sql = @"SELECT TOP 20 defect_code, defect_name 
                FROM t_defect_lib 
                WHERE category = @cat 
                ORDER BY occur_count DESC";
    defectList = conn.Query<DefectItem>(sql, new { cat = currentCategory }).ToList();
}
// Dapper的Query方法比EF快3倍左右

最后说说图片比对,用OpenCVSharp的模板匹配不如直接上EmguCV。有个取巧的办法------把标准图和检测图都转成灰度图再比对,内存占用能少三分之一:

csharp 复制代码
using (var template = new Image<Gray, byte>(standardPath))
using (var source = new Image<Gray, byte>(testPath))
{
    using (var result = source.MatchTemplate(template, TemplateMatchingType.CcoeffNormed))
    {
        result.MinMax(out _, out double[] maxValues, out _, out _);
        return maxValues[0] > 0.95 ? "OK" : "NG";
    }
}

这些模块组合起来,再配上RabbitMQ做消息队列,一个基础版的工业检测系统就搭起来了。实测在i5-8500的工控机上跑,处理500ms的超时控制完全没问题。不过千万记得要把所有图像处理放在单独的工作线程,不然界面分分钟卡成PPT------别问我怎么知道的。

相关推荐
刚子编程10 天前
C# Join 实战:左连接写法、字符串拼接与 EF Core 性能调优
开发语言·c#·solr·join
SuperherRo20 天前
服务攻防-Java组件安全&Solr搜索&Shiro鉴权&Log4j日志&JDK高版本绕过&CVE历史漏洞
java·log4j·solr·shiro·cve
HEADKON1 个月前
曲罗芦单抗Tralokinumab说明书详解:靶向IL-13治疗中重度特应性皮炎的用法与结膜炎、注射部位反应管理
solr
PGFA1 个月前
深度剖析 C# LINQ 底层执行机制:别让你的应用内存莫名其妙“爆”掉!
c#·solr·linq
切糕师学AI1 个月前
Apache Solr 详解:企业级搜索平台的核心特性与架构
架构·apache·solr
水无痕simon1 个月前
1 Solr入门到放弃
solr·lucene
大尚来也1 个月前
告别“字符串拼接”:在.NET中用LINQ重塑数据查询
.net·solr·linq
延误1 个月前
Solr中文搜索:keyword为何失效?
solr
ClouderaHadoop2 个月前
漏洞扫描发现 Solr CVE-2017-12629 对 CDH 集群影响分析
hadoop·solr·lucene·cdh
步步为营DotNet3 个月前
深度解析.NET中LINQ的延迟执行:提升性能与资源管理的关键
.net·solr·linq