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------别问我怎么知道的。

相关推荐
LFly_ice7 天前
LINQ语法
服务器·solr·linq
爱编程的鱼1 个月前
C# var 关键字详解:从入门到精通
开发语言·c#·solr
酥酥禾2 个月前
C# LINQ常用语法
solr·lucene
李白你好3 个月前
Solr任意文件读取-快速利用工具
solr
代码的余温3 个月前
ElasticSearch对比Solr
大数据·elasticsearch·solr
playStudy3 个月前
从0到1玩转 Google SEO
python·搜索引擎·github·全文检索·中文分词·solr·lucene
健康平安的活着4 个月前
es7.x es的高亮与solr高亮查询的对比&对比说明
大数据·elasticsearch·solr
运维行者_4 个月前
使用Applications Manager进行 Apache Solr 监控
运维·网络·数据库·网络安全·云计算·apache·solr
chenglin0164 个月前
ClickHouse、Doris、OpenSearch、Splunk、Solr系统化分析
clickhouse·solr·lucene