Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
F
Ftt_Common
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Ftt_Common
Commits
93679137
Commit
93679137
authored
Dec 16, 2020
by
tr
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1、图片搜索:应用测试(采样尺寸16)
parent
aa572d03
Changes
4
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1022 additions
and
555 deletions
+1022
-555
Utils.cs
Tools/MyUtils/Utils.cs
+23
-0
wImageSearch.Designer.cs
Tools/UI/wImageSearch.Designer.cs
+756
-543
wImageSearch.cs
Tools/UI/wImageSearch.cs
+218
-8
wImageSearch.resx
Tools/UI/wImageSearch.resx
+25
-4
No files found.
Tools/MyUtils/Utils.cs
View file @
93679137
...
@@ -85,6 +85,8 @@ namespace Tools.MyUtils
...
@@ -85,6 +85,8 @@ namespace Tools.MyUtils
#
endregion
#
endregion
#
region
winform
:提示;帮助窗口;异步
UI
支持
/// <summary>
/// <summary>
/// 提示框
/// 提示框
/// </summary>
/// </summary>
...
@@ -108,6 +110,25 @@ namespace Tools.MyUtils
...
@@ -108,6 +110,25 @@ namespace Tools.MyUtils
}
}
}
}
}
}
/// <summary>
/// 异步UI支持
/// </summary>
/// <param name="frm"></param>
/// <param name="action"></param>
public
static
void
AsyncUI
(
this
Form
frm
,
Action
action
)
{
if
(
frm
.
Disposing
||
frm
.
IsDisposed
)
return
;
//
if
(
frm
.
InvokeRequired
)
frm
.
Invoke
(
action
);
else
action
();
}
#
endregion
#
region
序号生成
/// <summary>
/// <summary>
/// 生成定长序号
/// 生成定长序号
/// </summary>
/// </summary>
...
@@ -125,6 +146,8 @@ namespace Tools.MyUtils
...
@@ -125,6 +146,8 @@ namespace Tools.MyUtils
return
s
;
return
s
;
}
}
#
endregion
#
region
数据库链接处理
#
region
数据库链接处理
/// <summary>
/// <summary>
...
...
Tools/UI/wImageSearch.Designer.cs
View file @
93679137
This diff is collapsed.
Click to expand it.
Tools/UI/wImageSearch.cs
View file @
93679137
...
@@ -22,6 +22,17 @@ namespace Tools.UI
...
@@ -22,6 +22,17 @@ namespace Tools.UI
}
}
private
void
Form2_Load
(
object
sender
,
EventArgs
e
)
private
void
Form2_Load
(
object
sender
,
EventArgs
e
)
{
//this.InitUI(); //算法测试
this
.
InitUI2
();
//应用测试
}
#
region
算法测试
/// <summary>
/// 初始化界面-算法测试
/// </summary>
private
void
InitUI
()
{
{
//初始化图片框
//初始化图片框
List
<
PictureBox
>
boxs
=
new
List
<
PictureBox
>
{
List
<
PictureBox
>
boxs
=
new
List
<
PictureBox
>
{
...
@@ -43,7 +54,6 @@ namespace Tools.UI
...
@@ -43,7 +54,6 @@ namespace Tools.UI
this
.
GenResultView
(
labels_d
,
this
.
dataGridView2
);
this
.
GenResultView
(
labels_d
,
this
.
dataGridView2
);
this
.
GenResultView
(
labels_p
,
this
.
dataGridView3
);
this
.
GenResultView
(
labels_p
,
this
.
dataGridView3
);
}
}
/// <summary>
/// <summary>
/// 初始化图片框
/// 初始化图片框
/// </summary>
/// </summary>
...
@@ -69,7 +79,7 @@ namespace Tools.UI
...
@@ -69,7 +79,7 @@ namespace Tools.UI
Image
img
=
Image
.
FromFile
(
path
);
Image
img
=
Image
.
FromFile
(
path
);
pbox
.
Image
=
img
;
pbox
.
Image
=
img
;
//采样图片显示
//采样图片显示
Image
thumbnail
=
My
Util
.
ResizeImage
(
img
,
8
,
8
);
Image
thumbnail
=
ImageSearch
Util
.
ResizeImage
(
img
,
8
,
8
);
pbox_b
.
Image
=
thumbnail
;
pbox_b
.
Image
=
thumbnail
;
pbox_s
.
Image
=
thumbnail
.
GrayImage2Bitmap
();
pbox_s
.
Image
=
thumbnail
.
GrayImage2Bitmap
();
//获取图片指纹
//获取图片指纹
...
@@ -97,7 +107,7 @@ namespace Tools.UI
...
@@ -97,7 +107,7 @@ namespace Tools.UI
{
{
for
(
int
j
=
i
+
1
;
j
<
labels
.
Count
;
j
++)
for
(
int
j
=
i
+
1
;
j
<
labels
.
Count
;
j
++)
{
{
var
similar
=
My
Util
.
SimilarDegree
(
labels
[
i
].
Text
,
labels
[
j
].
Text
).
ToString
(
"0.##"
);
//相似度
var
similar
=
ImageSearch
Util
.
SimilarDegree
(
labels
[
i
].
Text
,
labels
[
j
].
Text
).
ToString
(
"0.##"
);
//相似度
DataRow
drNew
=
dt
.
NewRow
();
DataRow
drNew
=
dt
.
NewRow
();
drNew
[
"name"
]
=
$"图
{
i
+
1
}
与图
{
j
+
1
}
"
;
drNew
[
"name"
]
=
$"图
{
i
+
1
}
与图
{
j
+
1
}
"
;
drNew
[
"similar"
]
=
similar
;
drNew
[
"similar"
]
=
similar
;
...
@@ -110,9 +120,208 @@ namespace Tools.UI
...
@@ -110,9 +120,208 @@ namespace Tools.UI
dgv
.
DataSource
=
dt
.
DefaultView
;
dgv
.
DataSource
=
dt
.
DefaultView
;
}
}
#
endregion
#
region
应用测试
//采样尺寸
int
size
=
16
;
//源图片hash
string
original_ahash
=
""
;
string
original_dhash
=
""
;
string
original_phash
=
""
;
//图片库路径
string
imgPath
=
$@"F:\图片查询\ImageSearch-master\images"
;
//预处理缓存
DataTable
dtHash
=
null
;
/// <summary>
/// 初始化界面-应用测试
/// </summary>
private
void
InitUI2
()
{
//控件初始化
this
.
picOriginal
.
SizeMode
=
PictureBoxSizeMode
.
Zoom
;
this
.
imageList1
.
ImageSize
=
new
Size
(
100
,
100
);
this
.
lvResult
.
LargeImageList
=
this
.
imageList1
;
this
.
lvResult
.
View
=
View
.
LargeIcon
;
//默认值
this
.
tbPath
.
Text
=
imgPath
;
this
.
SetImage
(
$@"
{
imgPath
}
\28b80b371ef525ab5aadf6a4cc765e36"
);
//添加事件
this
.
btnSelectPicture
.
Click
+=
BtnSelectPicture_Click
;
this
.
btnSelectPath
.
Click
+=
BtnSelectPath_Click
;
this
.
btnSearch
.
Click
+=
BtnSearch_Click
;
}
}
public
static
class
MyUtil
/// <summary>
/// 事件:选择图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private
void
BtnSelectPicture_Click
(
object
sender
,
EventArgs
e
)
{
var
dlg
=
new
OpenFileDialog
()
{
Multiselect
=
false
,
Filter
=
"图片|*.jpg;*.jpeg;*.png;*.gif;*.bmp;"
,
InitialDirectory
=
Utils
.
DesktopPath
,
};
if
(
dlg
.
ShowDialog
()
==
DialogResult
.
OK
)
{
this
.
SetImage
(
dlg
.
FileName
);
}
}
/// <summary>
/// 事件:选择图片库路径
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private
void
BtnSelectPath_Click
(
object
sender
,
EventArgs
e
)
{
var
dlg
=
new
FolderBrowserDialog
()
{
Description
=
"请选择图片源目录"
,
ShowNewFolderButton
=
false
,
RootFolder
=
Environment
.
SpecialFolder
.
Desktop
,
};
if
(
dlg
.
ShowDialog
()
==
DialogResult
.
OK
)
{
this
.
tbPath
.
Text
=
dlg
.
SelectedPath
;
this
.
dtHash
=
null
;
//清空预处理
}
}
/// <summary>
/// 事件:
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private
void
BtnSearch_Click
(
object
sender
,
EventArgs
e
)
{
//先清空
this
.
lvResult
.
Items
.
Clear
();
this
.
imageList1
.
Images
.
Clear
();
Task
.
Run
(()
=>
{
//图片库预处理
if
(
dtHash
==
null
)
this
.
Pretreatment
();
//去重
var
existList
=
new
List
<
string
>();
//查找
var
rate
=
0.9
;
var
rows
=
dtHash
.
Select
(
$"rate_aHash >
{
rate
}
OR rate_dHash >
{
rate
}
OR rate_pHash >
{
rate
}
"
).
ToList
();
rows
.
ForEach
(
dr
=>
{
var
fileName
=
dr
[
"fileName"
].
ToString
();
var
imgkey
=
new
FileInfo
(
fileName
).
Name
;
var
picName
=
$"
{
dr
[
"rate_aHash"
]}
_
{
dr
[
"rate_dHash"
]}
_
{
dr
[
"rate_pHash"
]}
"
;
if
(!
existList
.
Contains
(
picName
))
{
this
.
AsyncUI
(()
=>
{
this
.
imageList1
.
Images
.
Add
(
imgkey
,
Image
.
FromFile
(
fileName
));
this
.
lvResult
.
Items
.
Add
(
picName
,
imgkey
);
});
existList
.
Add
(
picName
);
}
});
});
}
/// <summary>
/// 图片预处理
/// </summary>
private
void
Pretreatment
()
{
//缓存表够造表
dtHash
=
new
DataTable
()
{
Columns
=
{
{
"fileName"
,
typeof
(
string
)
},
{
"aHash"
,
typeof
(
string
)
},
{
"dHash"
,
typeof
(
string
)
},
{
"pHash"
,
typeof
(
string
)
},
{
"original_aHash"
,
typeof
(
string
)
},
{
"original_dHash"
,
typeof
(
string
)
},
{
"original_pHash"
,
typeof
(
string
)
},
{
"rate_aHash"
,
typeof
(
decimal
)
},
{
"rate_dHash"
,
typeof
(
decimal
)
},
{
"rate_pHash"
,
typeof
(
decimal
)
},
},
};
//文件列表
var
fileNames
=
Directory
.
GetFiles
(
imgPath
).
ToList
();
//生成Hash
foreach
(
string
fname
in
fileNames
)
{
var
img
=
this
.
GetImage
(
fname
);
if
(
img
==
null
)
{
File
.
Delete
(
fname
);
continue
;
}
var
drNew
=
dtHash
.
NewRow
();
drNew
[
"fileName"
]
=
fname
;
var
aHash
=
ImageSearch
.
aHash
(
img
,
size
);
var
dHash
=
ImageSearch
.
dHash
(
img
,
size
);
var
pHash
=
ImageSearch
.
pHash
(
img
,
size
);
drNew
[
"aHash"
]
=
aHash
;
drNew
[
"dHash"
]
=
dHash
;
drNew
[
"pHash"
]
=
pHash
;
drNew
[
"original_aHash"
]
=
this
.
original_ahash
;
drNew
[
"original_dHash"
]
=
this
.
original_dhash
;
drNew
[
"original_pHash"
]
=
this
.
original_phash
;
drNew
[
"rate_aHash"
]
=
ImageSearchUtil
.
SimilarDegree
(
this
.
original_ahash
,
aHash
).
ToString
(
"0.##"
);
drNew
[
"rate_dHash"
]
=
ImageSearchUtil
.
SimilarDegree
(
this
.
original_dhash
,
dHash
).
ToString
(
"0.##"
);
drNew
[
"rate_pHash"
]
=
ImageSearchUtil
.
SimilarDegree
(
this
.
original_phash
,
pHash
).
ToString
(
"0.##"
);
drNew
.
EndEdit
();
dtHash
.
Rows
.
Add
(
drNew
);
//释放临时变量
img
.
Dispose
();
}
}
/// <summary>
/// 设置图片框图片
/// </summary>
/// <param name="fileName"></param>
private
void
SetImage
(
string
fileName
)
{
if
(!
File
.
Exists
(
fileName
))
throw
new
ArgumentException
();
var
img
=
this
.
GetImage
(
fileName
);
if
(
img
==
null
)
return
;
this
.
picOriginal
.
Image
=
img
;
this
.
original_ahash
=
ImageSearch
.
aHash
(
img
,
size
);
this
.
original_dhash
=
ImageSearch
.
dHash
(
img
,
size
);
this
.
original_phash
=
ImageSearch
.
pHash
(
img
,
size
);
}
/// <summary>
/// 获取图片对象
/// </summary>
/// <param name="fileName"></param>
private
Image
GetImage
(
string
fileName
)
{
Image
img
=
null
;
try
{
img
=
Image
.
FromFile
(
fileName
);
}
catch
(
Exception
ex
)
{
//Utils.TipException(ex);
}
return
img
;
}
#
endregion
}
/// <summary>
///
/// </summary>
public
static
class
ImageSearchUtil
{
{
/// <summary>
/// <summary>
/// 图片尺寸调整:一般缩小为8*8
/// 图片尺寸调整:一般缩小为8*8
...
@@ -219,6 +428,7 @@ namespace Tools.UI
...
@@ -219,6 +428,7 @@ namespace Tools.UI
//计算相似比例
//计算相似比例
return
count
/
a
.
Length
;
return
count
/
a
.
Length
;
}
}
}
}
...
...
Tools/UI/wImageSearch.resx
View file @
93679137
...
@@ -117,10 +117,16 @@
...
@@ -117,10 +117,16 @@
<resheader
name=
"writer"
>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</resheader>
<metadata
name=
"
Column2
.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<metadata
name=
"
dataGridViewTextBoxColumn5
.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
<value>
True
</value>
</metadata>
</metadata>
<metadata
name=
"Column3.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<metadata
name=
"dataGridViewTextBoxColumn6.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
</metadata>
<metadata
name=
"dataGridViewTextBoxColumn5.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
</metadata>
<metadata
name=
"dataGridViewTextBoxColumn6.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
<value>
True
</value>
</metadata>
</metadata>
<metadata
name=
"dataGridViewTextBoxColumn1.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<metadata
name=
"dataGridViewTextBoxColumn1.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
...
@@ -129,10 +135,25 @@
...
@@ -129,10 +135,25 @@
<metadata
name=
"dataGridViewTextBoxColumn2.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<metadata
name=
"dataGridViewTextBoxColumn2.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
<value>
True
</value>
</metadata>
</metadata>
<metadata
name=
"dataGridViewTextBoxColumn
5
.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<metadata
name=
"dataGridViewTextBoxColumn
1
.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
<value>
True
</value>
</metadata>
</metadata>
<metadata
name=
"dataGridViewTextBoxColumn
6
.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<metadata
name=
"dataGridViewTextBoxColumn
2
.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
<value>
True
</value>
</metadata>
</metadata>
<metadata
name=
"Column2.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
</metadata>
<metadata
name=
"Column3.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
</metadata>
<metadata
name=
"Column2.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
</metadata>
<metadata
name=
"Column3.UserAddedColumn"
type=
"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
>
<value>
True
</value>
</metadata>
<metadata
name=
"imageList1.TrayLocation"
type=
"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
>
<value>
17, 17
</value>
</metadata>
</root>
</root>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment