通过C#调用百度图片搜索

一、图库创建
1、提供了网站页面的接口

这种上传方法,效率相对比较低,如果全部使用的话,还是需要使用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++;
            }
        } 
 }

这样的话,第一分类都做出来了,而且有摘要标注。(但是发现丢了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_iduint64唯一的log id,用于问题定位
result_numuint32检索结果数
resultobject[]结果数组
+cont_signstring图片签名,可以用来删除图片或定位问题
+scorefloat图片相关性,取值范围0-1,越接近1代表越相似
+briefstringadd时添加的brief信息
has_morebool是否还有下一页,返回值:true、false;如果不分页,不用关注该字段

自己检索自己是没有问题的

三、准确性测试和界面改造
1、我尝试对原图像进行一些处理
    这里是进行了缩放,这样的话主体区域应该不会变化
结果符合预期
2、我尝试找到类似的图片
这个就不是很符合预期,看来这个图库还是需要整理。
3、界面改造成为可以显示搜索结果的
这样看来,确实蛮像的。

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、扩展
    现在已经有词库了,那么可以据此从网络搜索数据,得出统一的处理方法,几个反馈做下去,就可以将这个做实。







附件列表

    目前方向:图像处理,人工智能
    原文地址:https://www.cnblogs.com/jsxyhelu/p/15362922.html