1、提供了网站页面的接口
![](https://img2020.cnblogs.com/blog/508489/202110/508489-20211002222811961-767257283.png)
![](https://img2020.cnblogs.com/blog/508489/202110/508489-20211002222813191-488545015.jpg)
这种上传方法,效率相对比较低,如果全部使用的话,还是需要使用API。(注:图库管理仅供测试体验,实际业务中对图片库的管理操作(入库、删除、更新),请以API接口调用结果为准。)
2、该接口实现单张图片入库,入库时需要同步提交图片及可关联至本地图库的摘要信息(具体变量为brief,具体可传入图片在本地标记id、图片url、图片名称等);同时可提交分类维度信息(具体变量为tags,最多可传入2个tag),方便对图库中的图片进行管理、分类检索。**注:重复添加完全相同的图片会返回错误。**
public void SimilarAddDemo() {
var image = File.ReadAllBytes("图片文件路径");
// 调用相似图检索—入库, 图片参数为本地图片,可能会抛出网络等异常,请使用try/catch捕获
var result = client.SimilarAdd(image);
Console.WriteLine(result);
// 如果有可选参数
var options = new Dictionary<string, object>{
{"brief", "{"name":"周杰伦", "id":"666"}"},
{"tags", "100,11"}
};
// 带参数调用相似图检索—入库, 图片参数为本地图片
result = client.SimilarAdd(image, options);
Console.WriteLine(result);
}
public void SimilarAddUrlDemo() {
var url = "http//www.x.com/sample.jpg";
// 调用相似图检索—入库, 图片参数为远程url图片,可能会抛出网络等异常,请使用try/catch捕获
var result = client.SimilarAddUrl(url);
Console.WriteLine(result);
// 如果有可选参数
var options = new Dictionary<string, object>{
{"brief", "{"name":"周杰伦", "id":"666"}"},
{"tags", "100,11"}
};
// 带参数调用相似图检索—入库, 图片参数为远程url图片
result = client.SimilarAddUrl(url, options);
Console.WriteLine(result);
}
根据此编写代码:
private void btnAdd_Click(object sender, EventArgs e)
{
//鉴权
var APP_ID = "24936407";
var API_KEY = "yLFm8KRYpgMSHujjuFVs955r";
var SECRET_KEY = "6jIxRriVGZRax4Ba62GHcrXds4qinUXn ";
var client = new Baidu.Aip.ImageSearch.ImageSearch(API_KEY, SECRET_KEY);
//读取图片
DirectoryInfo dinfo = new DirectoryInfo("E:/未来项目/SMD皮肤镜/参考资料/excel模板/图库");
//获取指定目录下的全部子目录及文件类型
FileSystemInfo[] fsinfos = dinfo.GetFileSystemInfos();
int iNumber = 0;
foreach (FileSystemInfo fsinfo in fsinfos)
{
// 调用相似图检索—入库, 图片参数为本地图片,可能会抛出网络等异常,请使用try/catch捕获
string strFileName = fsinfo.FullName;
var image = File.ReadAllBytes(strFileName);
var options = new Dictionary<string, object>();
string strBrief = "{"name":"" + fsinfo.Name + "", "id":"666"}";
string strTags = iNumber.ToString() + ",1";
options.Add("brief", strBrief);
options.Add("tags", strTags);
var result = client.SimilarAdd(image, options);
iNumber++;
}
}
}
![](https://img2020.cnblogs.com/blog/508489/202110/508489-20211002222813900-1417192667.jpg)
这样的话,第一分类都做出来了,而且有摘要标注。(但是发现丢了10张,按照它的意思是重复的会丢掉)
二、搜索代码
完成入库后,可使用该接口实现相似图检索。支持传入指定分类维度(具体变量tags)进行检索,返回结果支持翻页(具体变量pn、rn)。
//鉴权
var APP_ID = "24936407";
var API_KEY = "yLFm8KRYpgMSHujjuFVs955r";
var SECRET_KEY = "6jIxRriVGZRax4Ba62GHcrXds4qinUXn ";
var client = new Baidu.Aip.ImageSearch.ImageSearch(API_KEY, SECRET_KEY);
var image = File.ReadAllBytes("e:/template/lena.jpg");
// 调用相似图检索—检索, 图片参数为本地图片,可能会抛出网络等异常,请使用try/catch捕获
var result = client.SimilarSearch(image);
字段 | 是否必选 | 类型 | 说明 |
---|---|---|---|
log_id | 是 | uint64 | 唯一的log id,用于问题定位 |
result_num | 是 | uint32 | 检索结果数 |
result | 是 | object[] | 结果数组 |
+cont_sign | 是 | string | 图片签名,可以用来删除图片或定位问题 |
+score | 是 | float | 图片相关性,取值范围0-1,越接近1代表越相似 |
+brief | 是 | string | add时添加的brief信息 |
has_more | 是 | bool | 是否还有下一页,返回值:true、false;如果不分页,不用关注该字段 |
自己检索自己是没有问题的
![](https://img2020.cnblogs.com/blog/508489/202110/508489-20211002222814535-391790626.png)
三、准确性测试和界面改造
1、我尝试对原图像进行一些处理
这里是进行了缩放,这样的话主体区域应该不会变化
![](https://img2020.cnblogs.com/blog/508489/202110/508489-20211002222814900-355056162.png)
结果符合预期
2、我尝试找到类似的图片
![](https://img2020.cnblogs.com/blog/508489/202110/508489-20211002222815242-1604876454.png)
这个就不是很符合预期,看来这个图库还是需要整理。
![](https://img2020.cnblogs.com/blog/508489/202110/508489-20211002222815781-881459582.jpg)
3、界面改造成为可以显示搜索结果的
![](https://img2020.cnblogs.com/blog/508489/202110/508489-20211002222816138-1865932607.jpg)
这样看来,确实蛮像的。
private void button2_Click(object sender, EventArgs e)
{
//鉴权
var APP_ID = "24936407";
var API_KEY = "yLFm8KRYpgMSHujjuFVs955r";
var SECRET_KEY = "6jIxRriVGZRax4Ba62GHcrXds4qinUXn ";
var client = new Baidu.Aip.ImageSearch.ImageSearch(API_KEY, SECRET_KEY);
var image = File.ReadAllBytes("E:/未来项目/SMD皮肤镜/参考资料/excel模板/1.jpg");
// 调用相似图检索—检索, 图片参数为本地图片,可能会抛出网络等异常,请使用try/catch捕获
var result = client.SimilarSearch(image);
string str = result.ToString();
string strFirst = result.First.ToString();
string strSecond = result.First.Next.First.First.First.First.ToString();
//反序列化
Dictionary<string, string> values = JsonConvert.DeserializeObject<Dictionary<string, string>>(strSecond);
string strPath = @"E:/未来项目/SMD皮肤镜/参考资料/excel模板/图库/" + values.First().Value.ToString();
pictureBox1.Image = Bitmap.FromFile(strPath);
}
}
4、扩展
现在已经有词库了,那么可以据此从网络搜索数据,得出统一的处理方法,几个反馈做下去,就可以将这个做实。