Commit 93679137 authored by tr's avatar tr

1、图片搜索:应用测试(采样尺寸16)

parent aa572d03
......@@ -85,6 +85,8 @@ namespace Tools.MyUtils
#endregion
#region winform:提示;帮助窗口;异步UI支持
/// <summary>
/// 提示框
/// </summary>
......@@ -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>
......@@ -125,6 +146,8 @@ namespace Tools.MyUtils
return s;
}
#endregion
#region 数据库链接处理
/// <summary>
......
This diff is collapsed.
......@@ -22,6 +22,17 @@ namespace Tools.UI
}
private void Form2_Load(object sender, EventArgs e)
{
//this.InitUI(); //算法测试
this.InitUI2(); //应用测试
}
#region 算法测试
/// <summary>
/// 初始化界面-算法测试
/// </summary>
private void InitUI()
{
//初始化图片框
List<PictureBox> boxs = new List<PictureBox> {
......@@ -43,7 +54,6 @@ namespace Tools.UI
this.GenResultView(labels_d, this.dataGridView2);
this.GenResultView(labels_p, this.dataGridView3);
}
/// <summary>
/// 初始化图片框
/// </summary>
......@@ -69,7 +79,7 @@ namespace Tools.UI
Image img = Image.FromFile(path);
pbox.Image = img;
//采样图片显示
Image thumbnail = MyUtil.ResizeImage(img, 8, 8);
Image thumbnail = ImageSearchUtil.ResizeImage(img, 8, 8);
pbox_b.Image = thumbnail;
pbox_s.Image = thumbnail.GrayImage2Bitmap();
//获取图片指纹
......@@ -97,7 +107,7 @@ namespace Tools.UI
{
for (int j = i + 1; j < labels.Count; j++)
{
var similar = MyUtil.SimilarDegree(labels[i].Text, labels[j].Text).ToString("0.##"); //相似度
var similar = ImageSearchUtil.SimilarDegree(labels[i].Text, labels[j].Text).ToString("0.##"); //相似度
DataRow drNew = dt.NewRow();
drNew["name"] = $"图{i + 1}与图{j + 1}";
drNew["similar"] = similar;
......@@ -110,9 +120,208 @@ namespace Tools.UI
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>
/// 图片尺寸调整:一般缩小为8*8
......@@ -219,6 +428,7 @@ namespace Tools.UI
//计算相似比例
return count / a.Length;
}
}
......
......@@ -117,10 +117,16 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</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>
</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>
</metadata>
<metadata name="dataGridViewTextBoxColumn1.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
......@@ -129,10 +135,25 @@
<metadata name="dataGridViewTextBoxColumn2.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">
<metadata name="dataGridViewTextBoxColumn1.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">
<metadata name="dataGridViewTextBoxColumn2.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="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>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment