Skip to content

Latest commit

 

History

History
130 lines (113 loc) · 7.45 KB

File metadata and controls

130 lines (113 loc) · 7.45 KB

Contour Analysis 轮廓分析

2017暑假短学期C#作业 实验报告

陈泓宇 3130000240 2017年9月11日

一、关于CA的一些资料(翻译自所给材料)

什么是轮廓分析所必需的

CA允许描述,存储,比较和查找以外部轮廓 - 轮廓形式呈现的对象。

CA允许有效地解决模式识别的主要问题 - 转置,转动和对象图像的重新定标。 CA方法对这些转换是不变的。

主要概念

我们定义了这样一个对象轮廓。轮廓是物体的边界,一个点(像素),将物体与背景分离。 在CA中,轮廓由由复数组成的序列编码。在轮廓上,被称为起点的点是固定的。然后,扫描轮廓(允许 - 顺时针),并且每个偏移矢量由复数a + ib表示。其中x轴上的点偏移,y轴上的b偏移。关于前一点的偏移。

二、介绍原始项目(翻译自所给材料)

一般识别算法
  1. 初步处理图像 - 平滑,过滤噪音,对比度提高
  2. 图像的二值化和物体轮廓的选择
  3. 轮廓周边,正方形,波峰因子,分形等的初始过滤
  4. 轮廓的强制长度均匀,平滑
  5. 搜索所有发现的轮廓,搜索与给定轮廓类似的模板最大值
CA 库

库包括两个项目。第一个项目 ContourAnalysis - 实现轮廓分析的基本功能 - 创建轮廓,轮廓,均衡,评估ICF和ACF的标量积,比较和搜索模板。

  • Contour - 创建和存储轮廓。它包含轮廓的基本操作 - 标量积,缩放,均衡,归一化,频谱评估,评估ACF和ICF。
  • Template用于创建模板的基础。该类存储轮廓,其ACF,描述符ACF,初始轮廓(面积)的线性参数,轮廓的范数。此外,模板具有用作识别值的名称。
  • TemplateFinder 可以快速搜索给定轮廓的模板。该类的操作结果是FoundTemplateDesc,其中包含初始轮廓,并为给定轮廓找到模板。
  • 另外,相对于模板, FoundTemplateDesc包含相似度,旋转角度和轮廓的比例。

第二个项目 - ContourAnalysisProcessing - 包含初步处理图像,轮廓选择,过滤和识别的方法。此外,它还包含用于自动生成用于识别打印符号的模板的工具。

项目 ContourAnalysisProcessing 使用库OpenCV(EmguCV .NET包装器)对图像进行操作。

  • ImageProcessor 用于图像处理。它也存储模板的基础。
    • 方法 ImageProcessor.ProcessImage()在输入端接收图像。操作的结果是发现的轮廓列表( ImageProcessor.samples )和识别的轮廓列表( ImageProcessor.foundTemplates )。
  • ImageProcessor 还包含搜索轮廓的设置。 ImageProcessor 的工作原理如下:
  1. 首先,图像将被转换成灰度级
  2. 然后由 AdaptiveThreshold 进行二值化
  3. 提取轮廓
  4. 轮廓线性参数(长度,平方等)
  5. 轮廓均衡,有计算ACF和ACF描述符
  6. 然后是最合适的模板
  • 静态类 TemplateGenerator 用于自动生成某个字体的数字模板。

除了两个库项目,还有一个演示示例,展示了使用网络摄像头的图书馆的操作。该演示包含用于创建和编辑模板,识别调整的工具,并允许从网络摄像头生成轮廓的识别,并且还允许创建增强现实。

三、我所做的工作

将演示示例翻译成中文

步骤
  1. 通读材料,理解并熟悉Contour Analysis相关概念
  2. 打开工程、了解程序大致分为几个模块,找到入口
  3. 编译并运行工程,熟悉程序的功能
  4. 遍历所有的功能,并将所有需要翻译的地方(label、button等)依照理解翻译成中文(设置Text属性)
心得

这个任务看似十分简单,但是通过这个工作,我熟悉了CA的各种概念(会体现在后面的工作中),以及整个工程,了解了它的每个功能以及如何实现它们。

编写窗口“小贴士”来简单介绍CA和告诉用户如何使用示例程序

步骤
  1. 右键ContourAnalysisDemo->添加->新建项

  2. 弹出的对话框选择Windows窗体,名称改为Tips.cs

  3. 点击Tips.cs[设计]标签,设计窗体(包括label、bottom、pictureBox 和 RichTextBox)

  4. 打开写字板,撰写准备在Tips窗体中RichTextBox中展示的内容

  5. 将写好的rtf文件添加到工程文件中,并将属性中的“高级”中的“复制到输出目录”一项改成“始终复制”;将“生成操作”一项改成“嵌入的资源”

  6. 编写事件部分,模拟翻页,代码如下(此处代码不包括关闭窗口按钮和“关于”按钮): ` private int RichTextBoxPage = 0; private int TotalPages = 4; private string[] RTFAddr = { "1.rtf","2.rtf","3.rtf","4.rtf" };

     public Tips()
     {
         InitializeComponent();
         richTextBox1.LoadFile(RTFAddr[RichTextBoxPage], RichTextBoxStreamType.RichText);
    
     }
    
     private void LastPage_Click(object sender, EventArgs e)
     {
         RichTextBoxPage = (RichTextBoxPage + TotalPages - 1) % TotalPages;
         richTextBox1.LoadFile(RTFAddr[RichTextBoxPage], RichTextBoxStreamType.RichText);
     }
    
     private void NextPage_Click(object sender, EventArgs e)
     {
         RichTextBoxPage = (RichTextBoxPage + 1) % TotalPages;
         richTextBox1.LoadFile(RTFAddr[RichTextBoxPage], RichTextBoxStreamType.RichText);
     }
    

7. 在MainForm.cs的工具栏中添加按钮,并为按钮添加事件,是tips窗口能在主程序中打开 ![](8.png) private void toolStripButton1_Click(object sender, EventArgs e) { Tips f1 = new Tips(); f1.Show(); }`

  1. 在MainForm.cs 中的初始化函数中添加语句Tips f2 = new Tips();f2.Show(); 使Tips窗口能在程序运行时打开,并在窗口的属性中找到TopMost 将其设置为True 使窗口能够置顶
心得

这个部分的重点是关于Buttom和RichTextBook事件的编写部分,用到了RichTextBox.LoadFile()方法。

不过关于RichTextBox如何显示几页不同的文字我也有过搜索资料和考量。最后选择了写进.rtf文件再读取的方式,因为这样更灵活,具有更好的可维护性可重用性

编写“关于”窗口 介绍程序信息。

步骤
  1. 右键ContourAnalysisDemo->添加->新建项(同前一项工作的第一步)
  2. 弹出的对话框选择 “关于”框
  3. 修改Text部分和程序AboutBox1.cs中的初始化部分,只保留 InitializeComponent();
  4. 在Tips.cs中添加按钮和事件,使AboutBox1能够在Tips窗口中被打开

#####疑问 这个是我在看各种C#项中偶然看到的,它应该是一个编写好的窗口模板,全部默认编译运行以后就能够自动显示项目名称、版本号、作者和公司等信息。我自己推断加上上网搜索以后查到这些信息应该是存在AssemblyInfo.cs中,于是去修改了这个文件。可是这个AboutBox依然显示原来的信息。无奈之下我只有把原有程序中的变量和赋值语句全部删掉,使它变成一个普通的窗口,然后自己赋值Text。 由于时间关系(这个假期还有另外的事情),这个问题我暂时没有解决,先记下,希望有空回顾的时候可以解决掉。