0%

此篇幅主要记录学习OCR的过程经历

阅读全文 »

threshold(算子)

ddd

名字

threshold— 使用全局阈值分割图像。

签名

threshold(Image : Region : MinGray, MaxGray : )

描述

threshold从输入图像中选择灰度值 g 满足以下条件的像素:

满足条件的图像的所有点都作为一个区域返回。如果传递了多个灰度值间隔(元组MinGrayMaxGray),则为每个间隔返回一个单独的区域。对于矢量场图像,阈值不应用于灰度值,而是应用于矢量的长度。

注意力

对于整数类型的输入图像,浮点值MinGrayMaxGray被截断。

执行信息

  • 多线程类型:重入(与非独占运算符并行运行)。
  • 多线程范围:全局(可以从任何线程调用)。
  • 在元组级别自动并行化。
  • 在内部数据级别自动并行化。

参数

Image(input_object)单通道利马吉(-数组) 对象(字节 / 方向 / 循环 / 整数1 / 整数2 / uint2 / int4 / int8 / 实数 / vector_field)

输入图像。

Region(output_object)区域(-数组) 对象

分段区域。

MinGray(input_control)数字(-数组) (实数/整数)

灰度值的阈值较低。

**默认值:**128.0

**建议值:**0.0、10.0、30.0、64.0、128.0、200.0、220.0、255.0

MaxGray(input_control)数字(-数组) (实数/整数)

灰度值的上限阈值。

**默认值:**255.0

**建议值:**0.0、10.0、30.0、64.0、128.0、200.0、220.0、255.0

限制:MaxGray >= MinGray

示例(软件开发)

1
2
3
4
5
6
read_image(Image,'fabrik')
sobel_dir(Image,EdgeAmp,EdgeDir,'sum_abs',3)
threshold(EdgeAmp,Seg,50,255)
skeleton(Seg,Rand)
connection(Rand,Lines)
select_shape(Lines,Edges,'area','and',10,1000000)

复杂性

设 A 为输入区域的面积。则运行时复杂度为 O(A)。

结果

threshold如果所有参数都正确,则返回 2 (H_MSG_TRUE)。有关输入图像和输出区域的行为可以通过设置标志的值来确定*“no_object_result”,“empty_region_result”“store_empty_region”*跟set_system.如有必要,将引发异常。

可能的前身

1
histo_to_thresh`, , , , , ,`min_max_gray``sobel_amp``binomial_filter``gauss_filter``reduce_domain``fill_interlace

可能的继任者

1
connection`, , , , , , ,`dilation1``erosion1``opening``closing``rank_region``shape_trans``skeleton

选择

1
class_2dim_sup`, , , , , ,`hysteresis_threshold``dyn_threshold``binary_threshold``char_threshold``auto_threshold``dual_threshold

另请参见

1
zero_crossing`, ,`background_seg``regiongrowing

模块

基础

在使用Json序列化到本地文件时出现读写文件时文件正由另一进程使用,因此该进程无法访问该文件
具体代码实现如下:

1
2
3
4
//保存Json
string strJson = GlobalPath.SavePath.ModelJsonPath + "\\" + textBox_name.Text + ".json";
RunData.VisionParam inspectParam = InitParam();
strJson.SerializeJson(inspectParam);

序列化方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
///<summary>
///<para>将对象序列化成string,并写入到json文件中</para>
///<para>通过将 DataContractAttribute 属性 (Attribute) 应用于类,而将 DataMemberAttribute 属性 (Attribute) 应用于类成员,可以指定要序列化的属性 (Property) 和字段。或者添加SerializableAttribute属性 (Attribute) 应用于类</para>
///<para>例如:</para>
///<para>[DataContract]</para>
///<para>public struct demo</para>
///<para>{</para>
///<para>[DataMember(Order = 0)]</para>
///<para>public string name;</para>
///<para>[DataMember]</para>
///<para>public string note;</para>
///<para>[DataMember()]</para>
///<para>public int id;</para>
///<para>}</para>
///</summary>
/// <typeparam name="T">待序列化的对象类型</typeparam>
/// <param name="path">文件路径</param>
/// <param name="value">待序列化的对象</param>
/// <exception cref="ArgumentNullException">文件路径为空</exception>
/// <exception cref="SecurityException"> 调用方没有所要求的权限。</exception>
/// <exception cref="IOException">打开文件时发生 I/O 错误。</exception>
/// <exception cref="UnauthorizedAccessException">path 指定了一个只读文件。 或 - 当前平台不支持此操作。 或 - path 指定了一个目录。 或 - 调用方没有所要求的权限。</exception>
/// <exception cref="ArgumentException">path 是一个长度为零的字符串,仅包含空格,或包含一个或多个由 InvalidPathChars 定义的无效字符。</exception>
public static void SerializeJson<T>(this string path, T value)
{
try
{
if (path.IsNullOrEmpty())
{
throw new ArgumentNullException("Json->SerializeJson", "文件路径为空");
}
JsonLock.EnterWriteLock();
if (!File.Exists(path))
{
File.Create(path);
}
var serializer = new DataContractJsonSerializer(typeof(T));
using var stream = new MemoryStream();
serializer.WriteObject(stream, value);
File.WriteAllText(path, Encoding.UTF8.GetString(stream.ToArray()));
}
catch (SecurityException ex)
{
throw new SecurityException("Json->SerializeJson", ex);
}
catch (IOException ex)
{
throw new IOException("Json->SerializeJson", ex);
}
catch (UnauthorizedAccessException ex)
{
throw new UnauthorizedAccessException("Json->SerializeJson", ex);
}
catch (ArgumentException ex)
{
throw new ArgumentException("Json->SerializeJson", ex);
}
finally
{
JsonLock.ExitWriteLock();
}
}

经分析可能是由于 File.Create(path);引起的文件进程占用。

代码优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static void SerializeJson<T>(this string path, T value)
{
try
{
if (path.IsNullOrEmpty())
{
throw new ArgumentNullException("Json->SerializeJson", "文件路径为空");
}
JsonLock.EnterWriteLock();
var serializer = new DataContractJsonSerializer(typeof(T));
using var stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
serializer.WriteObject(stream, value);
}
catch (SecurityException ex)
{
throw new SecurityException("Json->SerializeJson", ex);
}
catch (IOException ex)
{
throw new IOException("Json->SerializeJson", ex);
}
catch (UnauthorizedAccessException ex)
{
throw new UnauthorizedAccessException("Json->SerializeJson", ex);
}
catch (ArgumentException ex)
{
throw new ArgumentException("Json->SerializeJson", ex);
}
finally
{
JsonLock.ExitWriteLock();
}
}

注1: 由于时间久远,之前的旧代码要求新增功能,需要升级,而之前的数据库不能放弃,想直接迁移到新电脑上直接使用

注2:因为长时间未使用EF codefirst相关操作,为了方便问题追溯,以此来记录此次碰到的各种问题

此次迁移的指令操作全部都在VS Studio 2022中的程序包管理器控制台中操作

Migration的命令如下:

1
Enable-Migrations -Force
1
Add-Migration
1
Update-Databse -Verbose

1 启动Migrations

​ 如果是初始启动,且当前没有存在旧有的数据库,直接使用 Enable-Migrations 进行 启用migration用来初始化数据库;

​ 如果存在旧有的数据库,则需要使用 Enable-Migrations -Force 来定位数据库的位置;

2 迁移Migrations

​ 使用 Add-Migration + 标签来标记数据库的记录;

3 更新到数据库

使用 Update-Databse 进行数据库更新;

操作过程中遇到问题:

SQL Server问题汇总:

  1. error: 26 - 定位指定的服务器/实例时出错 (Microsoft SQL Server,错误: -1)

分析原因:

Target database is: ‘*****’ (DataSource: .\\SQLEXPRESS, Provider: System.Data.SqlClient, Origin: Configuration).

经断点调试发现:以下位置代码中的连接字符串

1
2
3
4
public HiContext() : base("Hi.Scanner")
{
System.Diagnostics.Debug.Write(Database.Connection.ConnectionString);
}

与下面的字符串不符

1
2
3
<connectionStrings>
<add name="HiContext" connectionString="Data Source=(localdb)\\ProjectV13;Initial Catalog=Hi.Scanner;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=True;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
</connectionStrings>

改正后,出现以下问题:

Target database is: ‘Hi.Scanner’ (DataSource: (localdb)\\ProjectV13, Provider: System.Data.SqlClient, Origin: Configuration).

System.Data.SqlClient.SqlException (0x80131904):

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。(provider: SQL Network Interfaces, error: 50 - 发生了 Local Database Runtime 错误。指定的 LocalDB 实例名称无效。)

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

快速入门

创建一个新帖子

1
$ hexo new "My New Post"

More info: Writing

运行服务器

1
$ hexo server    or      $ hexo  s

More info: Server

生成静态文件

1
$ hexo generate  or      $ hexo g

More info: Generating

部署到远程站点

1
$ hexo deploy    or     $ hexo d

More info: Deployment