精华内容
下载资源
问答
  • 机器人Cozmo学会使用TensorFlow和FloydHub识别日常物体。 设置 安装 virtualenv ~ /.env/cozmo -p python3 source ~ /.env/cozmo/bin/activate git clone https://www.github.com/whatrocks/cozmo-tensorflow cd ...
  • 百度大脑通用物体识别使用攻略

    千次阅读 2019-11-28 16:40:18
    通用物体与场景识别支持超过 10 万类常见物体和场景识别,接口返回图片内 1 个或多个物体的名称,并可获取百科信息。适用于图像或视频内容分析、拍照识图等业务场景。 支持识别动物、植物、商品、建筑、风景、动漫、...

    作者:busyboxs

    API 介绍

    通用物体与场景识别支持超过 10 万类常见物体和场景识别,接口返回图片内 1 个或多个物体的名称,并可获取百科信息。适用于图像或视频内容分析、拍照识图等业务场景。

    支持识别动物、植物、商品、建筑、风景、动漫、食材、公众人物等10万个常见物体及场景,接口返回大类及细分类的名称结果。

    接口描述

    该请求用于通用物体及场景识别,即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中的多个物体及场景标签。

    请求说明

    请求 url

    https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general

    请求参数
    在这里插入图片描述
    返回说明

    返回参数
    在这里插入图片描述
    返回实例

    {
    	"log_id": "1418961236584752678",
    	"result_num": 5,
    	"result": [
    		{
    			"score": 0.764778,
    			"root": "商品-电脑办公",
    			"baike_info": {
    				"baike_url": "http://baike.baidu.com/item/%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91/213561",
    				"image_url": "http://imgsrc.baidu.com/baike/pic/item/63d0f703918fa0ec125a44b4269759ee3c6ddbed.jpg",
    				"description": "笔记本电脑(NoteBook Computer,简称为:NoteBook),亦称笔记型、手提或膝上电脑(英语:Laptop Computer,简称为Laptop),是一种小型、可方便携带的个人电脑。笔记本电脑的重量通常重1-3千克。其发展趋势是体积越来越小,重量越来越轻,而功能却越来越强大。像Netbook,也就是俗称的上网本。笔记本电脑跟PC的主要区别在于其便携带性。"
    			},
    			"keyword": "笔记本电脑"
    		},
    		{
    			"score": 0.526428,
    			"root": "商品-电脑办公",
    			"keyword": "电脑"
    		},
    		{
    			"score": 0.354558,
    			"root": "商品-电脑办公",
    			"keyword": "笔记本"
    		},
    		{
    			"score": 0.181704,
    			"root": "商品-数码产品",
    			"keyword": "台式电脑"
    		},
    		{
    			"score": 0.008778,
    			"root": "商品-数码产品",
    			"keyword": "平板电脑"
    		}
    	]
    }
    

    接口调用实现

    获取 access_token

    要调用百度 AI API 的接口,需要创建对应的应用并获取 access_token.

    创建应用

    首先登陆百度 AI 控制台( https://console.bce.baidu.com/?fromai=1#/aip/overview ),然后点击右侧导航栏里面的 “图像识别”。
    在这里插入图片描述
    然后点击创建应用
    在这里插入图片描述
    填好“应用名称”和“应用描述”后点击“创建应用”。
    在这里插入图片描述
    创建好应用之后,进入“应用列表”,就能看到应用的相关信息,我们需要的是 API Key 和 Secret Key。
    在这里插入图片描述

    import requests
    from utils import pic_base64, draw_zh, get_token_key
    
    class General(object):
    
        def __init__(self, image_base64, token_key, baike_num=0):
            self.image_base64 = image_base64
            self.token_key = token_key
            self.baike_num = baike_num
            self.data = self.get_data()
    
        def get_data(self):
            request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general"
            params_d = dict()
            params_d['image'] = str(self.image_base64, encoding='utf-8')
            params_d['baike_num'] = self.baike_num
            access_token = self.token_key
            request_url = request_url + "?access_token=" + access_token
            res = requests.post(url=request_url,
                                data=params_d,
                                headers={'Content-Type': 'application/x-www-form-urlencoded'})
            data = res.json()
            assert 'error_code' not in data, f'Error: {data["error_msg"]}'
            return data
    
        def get_result_num(self):
            return self.data['result_num']
    
        def get_log_id(self):
            return self.data['log_id']
    
        def get_result(self):
            return self.data['result']
    
        def parse_data(self):
            result_num = self.get_result_num()
            result = self.get_result()
            res = list()
            for i in range(result_num):
                if i < self.baike_num:
                    res.append((result[i]['keyword'], result[i]['score'], result[i]['baike_info']))
                else:
                    res.append((result[i]['keyword'], result[i]['score'], None))
            return res
            
            
    def detect(image_name, color):
        token_key = 'your token key'
        # image_name = 'images/001.png'
        image = cv2.imread(image_name)
        image_base64 = pic_base64(image_name)
        general = General(image_base64, token_key, 1)
        obj = ObjectDetect(image_base64, token_key)
        general_data = general.parse_data()
        bbox = obj.parse_data()
        name = general_data[0][0]
        score = general_data[0][1]
        baike = general_data[0][2]
        image = obj.draw_bbox(image, color)
        # draw_zh(image, name, bbox[0], bbox[1] - 16, color)
        cv2.cvtColor(image, cv2.COLOR_BGR2RGB, image)
        return image, name, score, baike
    

    QT 实现界面展示

    首先使用 qtdesigner 设计好界面,同时创建好按钮的槽函数,界面的设计如下图所示:
    在这里插入图片描述
    然后将 .ui 文件通过 PyUIC 转换为 .py 文件,并在生成的 .py 文件中添加槽函数的实现,具体的代码如下:

    ”上传图像“按钮对应的代码

    def on_upload_clicked(self):
        self.groupBox.setVisible(False)
        self.pushButton.setEnabled(False)
        fname = QtWidgets.QFileDialog.getOpenFileName(QtWidgets.QWidget(), 'Open file', self.file_path,
                                                      'Image file (*.jpg *.gif *.png)')
        if fname[0] != '':
            self.file_path = os.path.dirname(fname[0])
            self.imagePath = fname[0]
        pixmap = QtGui.QPixmap(self.imagePath)
        height, width = pixmap.height(), pixmap.width()
        if width > height:
            pixmapscared = pixmap.scaledToWidth(800)
        else:
            pixmapscared = pixmap.scaledToHeight(600)
        self.label_img.setPixmap(pixmapscared)
        # self.label_img.setScaledContents(True)
        self.detect.setEnabled(True)
        self.pushButton_2.setEnabled(True)
    

    “图像识别”按钮对应的代码 ,该代码实现了图像通用物体与场景识别。

    def on_recognition_clicked(self):
        self.isbaike.setVisible(True)
        str_warm = '未查到相关信息'
        img, name, score, baike = detect(self.imagePath, self.color)
        pixmap = QtGui.QPixmap(self.imagePath)
        height, width = pixmap.height(), pixmap.width()
        if width > height:
            pixmapscared = pixmap.scaledToWidth(800)
        else:
            pixmapscared = pixmap.scaledToHeight(600)
        self.label_img.setPixmap(pixmapscared)
        self.groupBox.setVisible(True)
        # self.label_img.setScaledContents(True)
        self.cls.setText(name)
        self.score.setText(str(score))
        self.detect.setEnabled(True)
        if baike:
            self.description.setText(baike['description'])
            self.baikeurl.setText(baike['baike_url'])
            self.picurl.setText(baike['image_url'])
        else:
            self.description.setText(str_warm)
            self.baikeurl.setText(str_warm)
            self.picurl.setText(str_warm)
    

    “主体检测”按钮对应的代码 ,该代码实现了图像主体检测

    def on_detect_clicked(self):
        self.groupBox.setVisible(False)
        self.groupBox_2.setVisible(False)
        self.pushButton_2.setEnabled(False)
        self.isbaike.setVisible(False)
        self.cls.setText(" ")
        self.score.setText(" ")
        img, name, score, _ = detect(self.imagePath, self.color)
        height, width, bytesPerComponent = img.shape
        bytesPerLine = bytesPerComponent * width
        Qimg = QtGui.QImage(img.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888)
        pixmap = QtGui.QPixmap.fromImage(Qimg)
        if width > height:
            pixmapscared = pixmap.scaledToWidth(800)
        else:
            pixmapscared = pixmap.scaledToHeight(600)
        self.label_img.setPixmap(pixmapscared)
        # self.label_img.setScaledContents(True)
        self.detect.setEnabled(False)
        self.pushButton.setEnabled(True)
    

    “边框颜色”按钮对应的代码, 该代码实现了改变主体检测中主体边框的颜色

    def on_choose_color(self):
        self.groupBox.setVisible(False)
        color = QtWidgets.QColorDialog.getColor()
        self.color = color.getRgb()[:3]
        from detectimage import detect
        img, name, score, _ = detect(self.imagePath, self.color)
        height, width, bytesPerComponent = img.shape
        bytesPerLine = bytesPerComponent * width
        Qimg = QtGui.QImage(img.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888)
        pixmap = QtGui.QPixmap.fromImage(Qimg)
        if width > height:
            pixmapscared = pixmap.scaledToWidth(800)
        else:
            pixmapscared = pixmap.scaledToHeight(600)
        self.label_img.setPixmap(pixmapscared)
        # self.label_img.setScaledContents(True)
        self.cls.setText(" ")
        self.score.setText(" ")
    

    实例运行效果图
    在这里插入图片描述
    在这里插入图片描述
    代码打包

    可以使用 pyinstaller 将代码打包

    首先安装 pyinstaller

    pip install pyinstaller
    然后将代码打包

    pyinstaller ruun.py
    最终会在主文件下生成 dist 文件夹和 build 文件夹,可执行文件在 dist 文件夹下。

    源码地址

    源代码:https://github.com/busyboxs/qt-baidu-image-recognizition
    可执行文件链接:https://pan.baidu.com/s/11J09VeWzl2W2pcNeHz0Ovw 提取码:tm9i
    可执行文件路径 ~/BaiDuDetect/dist/ruun/ruun.exe

    展开全文
  • 通用物体识别使用攻略

    千次阅读 2019-11-28 17:04:56
    作者:让天涯 一、需求描述 大家在出去旅游的时候,往往会对...而如果能够使用百度的【通用物体与场景识别】技术,只需要简单的拍照上传,就能知道这个物品是什么,这个景点叫什么名字,它的由来它的故事等等,那么...

    作者:让天涯

    一、需求描述

    大家在出去旅游的时候,往往会对景点里的特色事物感兴趣,而一般情况下,如果没有导游的介绍,我们不太清楚这个景区里的特色景点是什么,有时候即使看到了一个事物,都不认识它,只能等着导游来介绍,这样的话,旅游的可玩性、自由度都大大降低了。

    而如果能够使用百度的【通用物体与场景识别】技术,只需要简单的拍照上传,就能知道这个物品是什么,这个景点叫什么名字,它的由来它的故事等等,那么基本上可以脱离导游,自己一行人按照自己的喜好去游玩,不仅自由,还能增长见识,这样的旅游才有意思,否则的话,只能跟着导游走。

    二、应用价值

    利用百度【通用物体与场景识别】技术,识别自己旅游/生活中遇到的不认识的物体、场景,了解其背景,增长见识。

    三、使用攻略

    说明:本文采用C# 语言,开发环境为.Net Core 2.1,采用在线API接口方式实现。
    (1)、登陆 百度智能云-管理中心 创建 “图像识别”应用,获取 “API Key ”和 “Secret Key” :https://console.bce.baidu.com/ai/?_=1561555561720&fromai=1#/ai/imagerecognition/overview/index
    (2)、根据 API Key 和 Secret Key 获取 AccessToken。

        ///
    
    
        /// 获取百度access_token
        ///
        /// API Key
        /// Secret Key
        ///
        public static string GetAccessToken(string clientId, string clientSecret)
        {
            string authHost = "https://aip.baidubce.com/oauth/2.0/token";
            HttpClient client = new HttpClient();
            List> paraList = new List>();
            paraList.Add(new KeyValuePair("grant_type", "client_credentials"));
            paraList.Add(new KeyValuePair("client_id", clientId));
            paraList.Add(new KeyValuePair("client_secret", clientSecret));
    
    
            HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;
            string result = response.Content.ReadAsStringAsync().Result;
            JObject jo = (JObject)JsonConvert.DeserializeObject(result);
            string token = jo["access_token"].ToString();
            return token;
        }
    

    (3)、调用API接口获取识别结果

    1、在Startup.cs 文件 的 Configure(IApplicationBuilder app, IHostingEnvironment env) 方法中开启虚拟目录映射功能:
    
            string webRootPath = HostingEnvironment.WebRootPath;//wwwroot目录
    
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(
                    Path.Combine(webRootPath, "Uploads", "BaiduAIs")),
                RequestPath = "/BaiduAIs"
            });
    
    2、 建立Index.cshtml文件
    
    2.1 前台代码:
    由于html代码无法原生显示,只能简单说明一下:
    
    主要是一个form表单,需要设置属性enctype="multipart/form-data",否则无法上传图片;
    
    form表单里面有两个控件:
    
    一个Input:type="file",asp-for="FileUpload" ,上传图片用;
    
    一个Input:type="submit",asp-page-handler="Advanced" ,提交并返回识别结果。
    
    一个img:src="@Model.curPath",显示识别的图片。
    
    最后显示后台 msg 字符串列表信息,如果需要输出原始Html代码,则需要使用@Html.Raw()函数。
    

    2.2 后台代码:

        [BindProperty]
        public IFormFile FileUpload { get; set; }
        private readonly IHostingEnvironment HostingEnvironment;
        public List msg = new List();
        public string curPath { get; set; }
    
    
        public BodySearchModel(IHostingEnvironment hostingEnvironment)
        {
            HostingEnvironment = hostingEnvironment;
        }
    
        public async Task OnPostAdvancedAsync()
        {
            if (FileUpload is null)
            {
                ModelState.AddModelError(string.Empty, "本地图片!");
            }
            if (!ModelState.IsValid)
            {
                return Page();
            }
            msg = new List();
    
            string webRootPath = HostingEnvironment.WebRootPath;//wwwroot目录
            string fileDir = Path.Combine(webRootPath, "Uploads//BaiduAIs//");
            string imgName = await UploadFile(FileUpload, fileDir);
    
            string fileName = Path.Combine(fileDir, imgName);
            string imgBase64 = GetFileBase64(fileName);
            curPath = Path.Combine("/BaiduAIs/", imgName);//需在Startup.cs 文件 的 Configure(IApplicationBuilder app, IHostingEnvironment env)方法中开启虚拟目录映射功能
    
            string result = GetImageJson(imgBase64, “你的API KEY”, “你的SECRET KEY”);
            JObject jo =(JObject)JsonConvert.DeserializeObject(result);
            try
            {
                List msgList = jo["result"].ToList();
                int number = int.Parse(jo["result_num"].ToString());
                int curNumber = 1;
                msg.Add("返回结果:" + number + "");
                foreach (JToken ms in msgList)
                {
                    if (number > 1)
                    {                       
                        msg.Add("第 " + (curNumber++).ToString() + " 条:");
                    }
                    msg.Add("置信度:" + ms["score"].ToString());
                    msg.Add("标签:" + ms["root"].ToString());
                    msg.Add("名称:" + ms["keyword"].ToString());
                    if (ms["baike_info"] != null)
                    {
                        msg.Add("百科词条:");
                        if (ms["baike_info"]["baike_url"] != null)
                        {
                            msg.Add("页面链接");
                        }
                        if (ms["baike_info"]["description"] != null)
                        {
                            msg.Add("内容描述:" + ms["baike_info"]["description"].ToString());
                        }
                        if (ms["baike_info"]["image_url"] != null)
                        {
                            msg.Add("");
                        }
                    }
                }
            }
            catch(Exception e1)
            {
                msg.Add(result);
            }
            return Page();
        }
    
        ///
    
    
        /// 上传文件,返回文件名
        ///
        /// 文件上传控件
        /// 文件绝对路径
        ///
        public static async Task UploadFile(IFormFile formFile, string fileDir)
        {
            if (!Directory.Exists(fileDir))
            {
                Directory.CreateDirectory(fileDir);
            }
            string extension = Path.GetExtension(formFile.FileName);
            string imgName = Guid.NewGuid().ToString("N") + extension;
            var filePath = Path.Combine(fileDir, imgName);
    
    
            using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
            {
                await formFile.CopyToAsync(fileStream);
            }
    
            return imgName;
        }
    
    
        ///
    
    
        /// 返回图片的base64编码
        ///
        /// 文件绝对路径名称
        ///
        public static String GetFileBase64(string fileName)
        {
            FileStream filestream = new FileStream(fileName, FileMode.Open);
            byte[] arr = new byte[filestream.Length];
            filestream.Read(arr, 0, (int)filestream.Length);
            string baser64 =  Convert.ToBase64String(arr);
            filestream.Close();
            return baser64;
        }
    
    
        ///
    
    
        /// 图像识别Json字符串
        ///
        /// 图片base64编码
        /// API Key
        /// Secret Key
        ///
        public static string GetImageJson(string strbaser64, string clientId, string clientSecret)
        {
            string token = GetAccessToken(clientId, clientSecret);
            string host = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general?access_token=" + token;
            Encoding encoding = Encoding.Default;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
            request.Method = "post";
            request.KeepAlive = true;
            string str = "image=" + HttpUtility.UrlEncode(strbaser64)+”&baike_num=5“;
            byte[] buffer = encoding.GetBytes(str);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
            string result = reader.ReadToEnd();
            return result;
        }
    

    四、效果测试
    1、页面:
    在这里插入图片描述
    2、识别结果:

    2.1
    在这里插入图片描述
    完整识别结果:
    返回结果:5

    第 1 条:

    置信度:0.797064

    标签:

    名称:诸城恐龙博物馆

    百科词条:

    页面链接

    内容描述:诸城恐龙博物馆位于山东省诸城市,成立于2001年5月9日,是中国第一个县(市)级恐龙博物馆,展出了目前世界上最高大的巨型鸭嘴龙化石骨架和100多件恐龙化石。巨龙馆(诸城恐龙博物馆)。国家4A级旅游景区,建筑面积5400平方米,馆内陈列着世界上最高大的鸭嘴恐龙化石骨架——“巨大诸城龙”(高9.1米,长16.6米),被中外专家誉为“世界第一龙”。展示有世界上最大的“巨型诸城暴龙”和最原始的“诸城中国角龙”等化石骨架以及恐龙骨骼化石、蛋化石等极具代表性的恐龙化石。珍藏于神妙龙骨厅的巨大恐龙股骨化石被誉为“华夏第一奇骨”。先后接待了30多位国家领导人、众多的社会知名人士和数以百万的中外游客。
    在这里插入图片描述
    根据识别结果可以看出,通用物体的识别结果还是比较准确的,再加上可以显示百度百科信息,这样的话,就能够得到更多更详细的知识了。
    当然,对于动物、植物、花卉、地标等百度有专门的识别接口,可以得到更加准确的信息,不过一般情况下,可以调用【通用物体与场景识别】接口来识别,如果识别结果不太满意的话,再调用专门接口进行详细的识别。

    展开全文
  • tensorflow移植到Android端,可以对照片中的物体进行分类检测,相比opencv而言,在很大程度上提高了识别率以及正确率,用了就知道
  • 简单记录一下最近项目中需要实现的需求: 需要通过语音识别或者 拍照、相册等来识别物体 , 通过集成百度AI提供的SDK 实现本次功能。 废话不多讲 直接开始: 需要接入百度智能云 那首先肯定是需要注册百度云账号 ...

    简单记录一下最近项目中需要实现的需求: 需要通过语音识别或者 拍照、相册等来识别物体 , 通过集成百度AI提供的SDK  实现本次功能。

    废话不多讲  直接开始:

    需要接入百度智能云 那首先肯定是需要注册百度云账号 然后生成如下所需要的的参数:

    然后需要在百度AI官方网站上下载所需SDK。

    里面有很多类似资源 像我上面所提到的语音识别也是在这里接入

    好了 其实我们所需要的的就是这四个jar包:

    把他们放到app下的libs中 添加完成后 就可以使用就可以在工程中使用ImageClassify Java SDK了

    接下来就是敲代码时间了:

    初始化 将开始生成的APP_ID、API_KEY与SECRET_KEY 传入:

    也可以设置代理服务器地址 但不是必须的 

        client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
        client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理

    初始化完成之后 那便是调用了 直接说说拍照图像识别吧 跟相册逻辑一样

    通过某个按钮调相机拍照 传入AipImageClassify
     bt_photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 //调起相机的方法
                  getPhotograph(client);
                
              }
      });

    然后就是获取拍照图片的本地路径(相册选取也一样) 这个功能很常见 不多说 

    拿到图片的本地Path之后就是调用图像识别的接口了

    // 传入可选参数调用接口
    HashMap<String, String> options = new HashMap<String, String>();
    options.put("baike_num", "5");//返回百科信息的结果数,默认不返回 
           
    // 参数为本地路径
    String image = 获取的本地图片路径;
    JSONObject res = client.advancedGeneral(image, options);
    Log.d("识别", res.toString(2));
    

    这样就获取了 识别之后图像数据的Json对象  是不是很简单O(∩_∩)O

    接下来的事情就简单 ,直接解析Json

    new Gson().fromJson(res.toString(), DistinguishEntry.class);

    DistinguishEntry是拿到Json数据后生成的实体类  我拍照识别了一包抽纸  然后拿到了返回的数据  一般获取到的数据格式是这样的:

    {
    	"log_id": 1667655392543040043,
    	"result_num": 5,
    	"result": [{
    		"score": 0.827138,
    		"root": "商品-日用品",
    		"keyword": "抽纸"
    	}, {
    		"score": 0.647101,
    		"root": "商品-清洁用品",
    		"keyword": "纸品湿巾"
    	}, {
    		"score": 0.476177,
    		"root": "商品-日用品",
    		"keyword": "纸巾"
    	}, {
    		"score": 0.252748,
    		"root": "商品-卫生用品",
    		"keyword": "餐巾纸"
    	}, {
    		"score": 0.04131,
    		"root": "商品-生活用品",
    		"keyword": "婴儿尿裤"
    	}]
    }

    好了讲完了  其实还是蛮简单的 特此记录一下

     

     

    展开全文
  • 1. 识别物体或场景名称 支持识别动物、植物、商品、建筑、风景、动漫、食材、公众人物等 10 万个常见物体及场景,接口返回大类及细分类的名称结果。 2. 获取百科信息 支持获取图片识别结果对应的百科信息,接口返回...

    目前通用物体和场景识别支持超过 10 万类常见物体和场景识别,接口返回图片内 1 个或多个物体的名称,并可获取百科信息。适用于图像或视频内容分析、拍照识图等业务场景。

    功能介绍

    1. 识别物体或场景名称

    支持识别动物、植物、商品、建筑、风景、动漫、食材、公众人物等 10 万个常见物体及场景,接口返回大类及细分类的名称结果。

    2. 获取百科信息

    支持获取图片识别结果对应的百科信息,接口返回百科词条 URL、图片和摘要描述,可选择是否需要返回百科信息。

    应用场景

    • 图片内容分析与推荐:对用户浏览的图片或观看的视频内容进行识别,根据识别结果给出相关内容推荐或广告展示。广泛应用于新闻资讯类、视频类 app 等内容平台中
    • 拍照识图:根据用户拍摄照片,识别图片中物体名称及百科信息,提高用户交互体验,广泛应用于智能手机厂商、拍照识图及科普类 app 中
    • 拍照闯关趣味营销:设计线上营销活动,根据用户拍摄照片,自动识别图片中物体信息是否符合活动要求,提升用户交互体验,减少人工审核成本

    接口描述

    该请求用于通用物体及场景识别,即对于输入的一张图片(可正常解码,且长宽比适宜),输出图片中的多个物体及场景标签。

    请求说明

    • HTTP 方法: POST
    • 请求 URL: https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general
    • URL参数: access_token
    • Header 参数: Content-Type = application/x-www-form-urlencoded
    • Body 参数:见下表
    参数 是否必选 类型 可选值范围 说明
    image true string - 图像数据,base64 编码,要求 base64 编码后大小不超过 4M,最短边至少 15px,最长边最大4096px,支持 jpg/png/bmp 格式。注意:图片需要 base64 编码、去掉编码头(data:image/jpg;base64,)后,再进行 urlencode
    baike_num integer 0 返回百科信息的结果数,默认不返回

    返回说明

    返回参数如下表:

    字段 是否必选 类型 说明
    log_id uint64 唯一的 log id,用于问题定位
    result_num unit32 返回结果数目,及 result 数组中的元素个数
    result arrry(object) 标签结果数组
    +keyword string 图片中的物体或场景名称
    +score float 置信度,0 - 1
    +root string 识别结果的上层标签,有部分钱币、动漫、烟酒等 tag 无上层标签
    +baike_info object 对应识别结果的百科词条名称
    ++baike_url string 对应识别结果百度百科页面链接
    ++image_url string 对应识别结果百科图片链接
    ++description string 对应识别结果百科内容描述

    返回示例如下:

    {
    	"log_id": "4269290077301074002",
    	"result_num": 5,
    	"result": [
    		{
    			"score": 0.203018,
    			"root": "植物-树",
    			"baike_info": {
    				"baike_url": "http://baike.baidu.com/item/%E6%A0%91/2699484",
    				"image_url": "http://imgsrc.baidu.com/baike/pic/item/6159252dd42a2834218a2c2154b5c9ea15cebfef.jpg",
    				"description": "树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树;"
    			},
    			"keyword": "树"
    		},
    		{
    			"score": 0.15084,
    			"root": "自然风景-其他",
    			"keyword": "风景"
    		},
    		{
    			"score": 0.100728,
    			"root": "自然风景-天空",
    			"keyword": "天空"
    		},
    		{
    			"score": 0.052704,
    			"root": "商品-工艺品",
    			"keyword": "工艺品"
    		},
    		{
    			"score": 0.003729,
    			"root": "商品-工艺品",
    			"keyword": "佛像"
    		}
    	]
    }
    

    C++ 代码实现调用

    这里假设已经将环境配置好了,环境配置的文章可以参考 Windows 下使用 Vcpkg 配置百度 AI 图像识别 C++开发环境(VS2017)

    为了方便,首先根据返回参数定义了一个结构体,该结构体包括了返回参数中的参数,如下:

    struct GeneralInfo {
    	std::string keyword;
    	float score;
    	std::string root;
    	std::string baikeurl;
    	std::string imageurl;
    	std::string baikedesc;
    
    	void print() {
    		std::cout << std::setw(30) << std::setfill('-') << '\n';
    		std::cout << "keyword: " << keyword << "\n";
    		std::cout << "score: " << std::fixed << std::setprecision(4) << score << "\n";
    		std::cout << "root: " << root << "\n";
    		if (baikeurl != "null")
    			std::cout << "baikeurl: " << baikeurl << "\n";
    		if (imageurl != "null")
    			std::cout << "imageurl: " << imageurl << "\n";
    		if (baikedesc != "null")
    			std::cout << "baikedesc: " << baikedesc << "\n";
    	}
    };
    

    然后定义了一个类来调用接口并获取结果

    class General
    {
    public:
    	General();
    	~General();
    
    	Json::Value request(std::string imgBase64, std::map<std::string, std::string>& options);
    
    	int getResultNum();
    
    	// get all return results
    	void getAllResult(std::vector<GeneralInfo>& results);
    
    	// only get first result
    	void getResult(GeneralInfo& result);
    
    
    private:
    	Json::Value obj_;
    	std::string url_;
    	uint32_t result_num_;
    	// file to save token key
    	std::string filename_;
    };
    

    类中的私有成员 obj_ 表示返回结果对应的 json 对象。url_ 表示请求的 url,result_num_ 表示返回结果数,filename_ 表示用于存储 access token 的文件的文件名。

    request 函数输入请求图像的 base64 编码以及请求参数,返回一个 json 对象,json 对象中包含请求的结果。

    getAllResult 将所有返回结果存放到一个 vector 中。getResult 只返回第一条结果,也就是分数最高的结果。


    完整代码如下

    General.h 代码如下:

    #pragma once
    #include "util.h"
    
    struct GeneralInfo {
    	std::string keyword;
    	float score;
    	std::string root;
    	std::string baikeurl;
    	std::string imageurl;
    	std::string baikedesc;
    
    	void print() {
    		std::cout << std::setw(30) << std::setfill('-') << '\n';
    		std::cout << "keyword: " << keyword << "\n";
    		std::cout << "score: " << std::fixed << std::setprecision(4) << score << "\n";
    		std::cout << "root: " << root << "\n";
    		if (baikeurl != "null")
    			std::cout << "baikeurl: " << baikeurl << "\n";
    		if (imageurl != "null")
    			std::cout << "imageurl: " << imageurl << "\n";
    		if (baikedesc != "null")
    			std::cout << "baikedesc: " << baikedesc << "\n";
    	}
    };
    
    class General
    {
    public:
    	General();
    	~General();
    
    	Json::Value request(std::string imgBase64, std::map<std::string, std::string>& options);
    
    	int getResultNum();
    
    	// get all return results
    	void getAllResult(std::vector<GeneralInfo>& results);
    
    	// only get first result
    	void getResult(GeneralInfo& result);
    
    
    private:
    	Json::Value obj_;
    	std::string url_;
    	uint32_t result_num_;
    	// file to save token key
    	std::string filename_;
    };
    
    void generalTest();
    
    

    General.cpp 代码如下:

    #include "General.h"
    
    General::General()
    {
    	filename_ = "tokenKey";
    	url_ = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general";
    }
    
    
    General::~General()
    {
    }
    
    Json::Value General::request(std::string imgBase64, std::map<std::string, std::string>& options)
    {
    	std::string response;
    	Json::Value obj;
    	std::string token;
    	
    	// 1. get HTTP post body
    	std::string body;
    	mergeHttpPostBody(body, imgBase64, options);
    
    	// 2. get HTTP url with access token
    	std::string url = url_;
    	getHttpPostUrl(url, filename_, token);
    
    	// 3. post request, response store the result
    	int status_code = httpPostRequest(url, body, response);
    	if (status_code != CURLcode::CURLE_OK) {
    		obj["curl_error_code"] = status_code;
    		obj_ = obj;
    		return obj; // TODO: maybe should exit 
    	}
    
    	// 4. make string to json object
    	generateJson(response, obj);
    
    	// if access token is invalid or expired, we will get a new one
    	if (obj["error_code"].asInt() == 110 || obj["error_code"].asInt() == 111) {
    		token = getTokenKey();
    		writeFile(filename_, token);
    		return request(imgBase64, options);
    	}
    
    	obj_ = obj;
    
    	checkErrorWithExit(obj);
    
    	result_num_ = getResultNum();
    
    	return obj;
    }
    
    int General::getResultNum()
    {	
    	return obj_["result_num"].asInt();
    }
    
    void General::getAllResult(std::vector<GeneralInfo>& results)
    {
    	results.reserve(result_num_);
    	GeneralInfo tmp;
    
    	for (uint32_t i = 0; i < result_num_; ++i) {
    		tmp.keyword = UTF8ToGB(obj_["result"][i]["keyword"].asString().c_str());
    		tmp.score = obj_["result"][i]["score"].asFloat();
    		tmp.root = UTF8ToGB(obj_["result"][i]["root"].asString().c_str());
    		tmp.baikeurl = obj_["result"][i]["baike_info"].get("baike_url", "null").asString();
    		tmp.imageurl = obj_["result"][i]["baike_info"].get("image_url", "null").asString();
    		tmp.baikedesc = UTF8ToGB(obj_["result"][i]["baike_info"].get("description", "null").asString().c_str());
    		results.push_back(tmp);
    	}
    }
    
    void General::getResult(GeneralInfo& result)
    {
    	result.keyword = UTF8ToGB(obj_["result"][0]["keyword"].asString().c_str());
    	result.score = obj_["result"][0]["score"].asFloat();
    	result.root = UTF8ToGB(obj_["result"][0]["root"].asString().c_str());
    	result.baikeurl = obj_["result"][0]["baike_info"].get("baike_url", "null").asString();
    	result.imageurl = obj_["result"][0]["baike_info"].get("image_url", "null").asString();
    	result.baikedesc = UTF8ToGB(obj_["result"][0]["baike_info"].get("description", "null").asString().c_str());
    }
    
    
    void generalTest()
    {
    
    	std::cout << "size: " << sizeof(GeneralInfo) << "\n";
    
    	// read image and encode to base64
    	std::string imgFile = "./images/cat.jpg";
    	std::string imgBase64;
    	imgToBase64(imgFile, imgBase64);
    
    	// set options
    	std::map<std::string, std::string> options;
    	options["baike_num"] = "5";
    
    
    	Json::Value obj;
    	General generalObj;
    	obj = generalObj.request(imgBase64, options);
    	
    	GeneralInfo result;
    	generalObj.getResult(result);
    	result.print();
    
    	std::vector<GeneralInfo> results;
    	generalObj.getAllResult(results);
    
    	for (auto & vec : results) {
    		vec.print();
    	}
    }
    
    

    util.h 代码如下:

    #pragma once
    #include <curl/curl.h>
    #include <string>
    #include <map>
    #include <iostream>
    #include <fstream>
    #include <json/json.h>
    #include <iomanip>
    #include <opencv2/opencv.hpp>
    #include "base64.h"
    
    size_t writeCallback(void *ptr, size_t size, size_t nmemb, void *userdata);
    std::string getTokenKey();
    int readImageFile(const char *filename, std::string& out);
    void imgToBase64(std::string &imgFile, std::string &imgBase64);
    int writeFile(const std::string & fileString, const std::string &str);
    int readFile(const std::string & fileString, std::string &str);
    std::string UTF8ToGB(const char* str);
    void mergeHttpPostBody(std::string &body, std::string imgBase64, std::map<std::string, std::string>& options);
    void getHttpPostUrl(std::string &url, std::string &filename, std::string &token);
    int httpPostRequest(std::string &url, std::string &body, std::string &response);
    void generateJson(std::string &response, Json::Value &obj);
    void checkErrorWithExit(Json::Value &obj);
    
    

    util.cpp 代码如下:

    #include "util.h"
    
    // callback function for curl
    size_t writeCallback(void *ptr, size_t size, size_t nmemb, void *userdata)
    {
    	std::string *str = dynamic_cast<std::string *>((std::string *)userdata);
    	str->append((char *)ptr, size * nmemb);
    	return size * nmemb;
    }
    
    // get access token from server by get method
    std::string getTokenKey() {
    	std::string url = "https://aip.baidubce.com/oauth/2.0/token";
    	std::string apikey = "FP6E0dqEnGTPAXMYpUDXW7tb";
    	std::string secritkey = "MoNhkCh3VhtXpMft7Xoj4hQy4iHVbNZu";
    	std::map<std::string, std::string> params;
    	std::string response;
    
    	params["grant_type"] = "client_credentials";
    	params["client_id"] = apikey;
    	params["client_secret"] = secritkey;
    
    	// append url with parameters
    	for (auto it = params.begin(); it != params.end(); ++it) {
    		url += (it == params.begin() ? "?" : "&") + it->first + "=" + it->second;
    	}
    
    	CURL *curl = curl_easy_init();
    
    	struct curl_slist * slist = NULL;
    
    	curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
    	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);  // set callback function
    	curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); // set var to receive return info from callback function
    	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, true);
    	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
    	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
    	curl_easy_setopt(curl, CURLOPT_VERBOSE, false);
    
    	int status_code = curl_easy_perform(curl);
    
    	curl_easy_cleanup(curl);
    	curl_slist_free_all(slist);
    
    	Json::Value obj;
    	if (status_code != CURLcode::CURLE_OK) {
    		obj["curl_error_code"] = status_code;
    		return obj.toStyledString();
    	}
    
    	// parse json string
    	JSONCPP_STRING error;
    	Json::CharReaderBuilder builder;
    	const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
    	reader->parse(response.data(), response.data() + response.size(), &obj, &error);
    	std::string access_token = obj["access_token"].asString();
    
    	return access_token;
    }
    
    // read image file [https://stackoverflow.com/questions/9612121/how-to-read-image-files-and-store-it-in-memorystdstring-in-c]
    int readImageFile(const char *filename, std::string& out) {
    	std::ifstream in(filename, std::ios::in | std::ios::binary);
    	if (in) {
    		std::ostringstream oss;
    		oss << in.rdbuf();
    		out.assign(oss.str());
    		return 0;
    	}
    	else {
    		std::cerr << "Can't open image!" << std::endl;
    		return -1;
    	}
    }
    
    void imgToBase64(std::string &imgFile, std::string &imgBase64) {
    	// read image and encode to base64
    	std::string out;
    	readImageFile(imgFile.c_str(), out);
    	imgBase64 = base64_encode(out.c_str(), (int)out.size());
    }
    
    int writeFile(const std::string & fileString, const std::string &str) {
    	std::ofstream out(fileString, std::ios::binary);
    	if (out.is_open()) {
    		out << str;
    		out.close();
    	}
    
    	return 0;
    }
    
    int readFile(const std::string & fileString, std::string &str) {
    	std::ifstream in(fileString);
    	if (!in.is_open()) {
    		str = "";
    		return -1;
    	}
    
    	char buffer[256];
    	while (!in.eof()) {
    		in.getline(buffer, sizeof(buffer));	
    	}
    
    	str = buffer;
    	return 0;
    }
    
    
    std::string UTF8ToGB(const char* str)
    {
    	std::string result;
    	WCHAR *strSrc;
    	LPSTR szRes;
    
    	int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    	strSrc = new WCHAR[i + 1];
    	MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);
    
    	i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
    	szRes = new CHAR[i + 1];
    	WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
    
    	result = szRes;
    	delete[]strSrc;
    	delete[]szRes;
    	return result;
    }
    
    void mergeHttpPostBody(std::string &body, std::string imgBase64, std::map<std::string, std::string>& options) {
    	body = "image=" + std::string(curl_escape(imgBase64.c_str(), int(imgBase64.size()))) + "&";
    	// append body with options
    	for (auto it = options.begin(); it != options.end(); ++it) {
    		body += std::string(curl_escape(it->first.c_str(), (int)it->first.size()))
    			+ "=" + std::string(curl_escape(it->second.c_str(), (int)it->second.size())) + "&";
    	}
    }
    
    // first get token from file (if exist), then add token to url
    void getHttpPostUrl(std::string &url, std::string &filename, std::string &token) {
    	// if token file is not exist, a new one should be create
    	if (readFile(filename, token) < 0) {
    		token = getTokenKey();
    		writeFile(filename, token);
    	}
    
    	url = url + "?access_token=" + token;
    }
    
    int httpPostRequest(std::string &url, std::string &body, std::string &response) {
    	struct curl_slist * slist = NULL;
    
    	CURL *curl = curl_easy_init();
    
    	// set headers, actually this is used by default
    	std::string headers = "Content-Type:application/x-www-form-urlencoded";
    	slist = curl_slist_append(slist, headers.c_str());
    
    	curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
    	curl_easy_setopt(curl, CURLOPT_POST, true);
    	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body.data());
    	curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, body.size());
    	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
    	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);
    	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, true);
    	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
    	curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
    	curl_easy_setopt(curl, CURLOPT_VERBOSE, false);
    
    	int status_code = curl_easy_perform(curl);
    
    	curl_easy_cleanup(curl);
    	curl_slist_free_all(slist);
    
    	return status_code;
    }
    
    void generateJson(std::string &response, Json::Value &obj) {
    	// parse json string
    	JSONCPP_STRING error;
    	Json::CharReaderBuilder builder;
    	const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
    	reader->parse(response.data(), response.data() + response.size(), &obj, &error);
    }
    
    void checkErrorWithExit(Json::Value &obj)
    {
    	if (obj.get("error_code", "null")) {
    		std::cerr << obj.get("error_code", "null") << " : " << obj.get("error_msg", "null") << std::endl;
    		system("pause");
    		exit(EXIT_FAILURE);
    	}
    }
    

    运行结果

    在这里插入图片描述

    展开全文
  • 2. 为什么要使用tensorflow在手机端进行物体检测: 前一篇博客中讲到,将opencv移植到android中,检测到指定物体自动拍照,虽然说是功能确实可以实现,但是opencv毕竟比较落后了,识别的错误率还是很大的,于是...
  • AR拍照、AR购物、AR教育、AR搜索等丰富应用场景,凭借着AR技术的加持,为用户带来更优质的沉浸式体验,为用户创造更多价值。 例如,在运动健身应用中,AR的人体识别技术,能精准识别用户健身操练时的姿态是否符合...
  • 一、需求描述 大家在出去旅游的时候,往往会对...而如果能够使用百度的【通用物体与场景识别】技术,只需要简单的拍照上传,就能知道这个物品是什么,这个景点叫什么名字,它的由来它的故事等等,那么基本上可以...
  • 在果壳看到这篇文章关于树莓派视频拍照系统,就转载过来分享给大家,是很有用的。 本文主要内容摘自本作者的一篇论文,未全部写出,还请见谅。参考文章文末列出。如转载本文,请注明本文出处! 本系统具有无人值守...
  • 3.手机摄像头实时预览识别物体颜色。 4.色差计功能:用于各种产品颜色品质控制。 5.潘通和劳尔色库及浏览和查询功能,近3万种颜色,可对选取色点快速匹配色卡分析。 6.测色仪:手机拍照识别受到摄像头质量、光照等...
  • HIAI的文字识别能力

    2020-09-17 20:58:45
    Huawei HiAI 是华为开发的智能识别的SDK,能够智能识别图像、人脸、物体等,我们使用华为手机拍照时,拍摄界面会智能识别出动物、人脸、风景等,然后智能调整拍摄参数。这里就是使用了HIAI的能力。本文仅demo演示...
  • 整体功能:是为了实现车牌自动跟踪,检测,并拍照,定位,识别,但是跟踪和拍照等于没有实现。 实现功能: 能实现视频中物体跟踪,但必须是手动圈住才行,摄像头是usb摄像头. 打开车牌图片,能进行定位,车牌分割...
  •  整体功能:是为了实现车牌自动跟踪,检测,并拍照,定位,识别,但是跟踪和拍照等于没有实现。  实现功能: 能实现视频中物体跟踪,但必须是手动圈住才行,摄像头是usb摄像头。  这个程序也是根据参考网友的一些...
  • 整体功能:是为了实现车牌自动跟踪,检测,并拍照,定位,识别,但是跟踪和拍照等于没有实现。 实现功能: 能实现视频中物体跟踪,但必须是手动圈住才行,摄像头是usb摄像头. 打开车牌图片,能进行定位,车牌分割,...
  • 就拿现在的只能手机来说吧,现在很多智能手机都必须有人脸识别解锁、拍照自动美颜、拍照物体识别等等功能,这些都是AI技术的功劳。在此也不多说了,让我们来见证奇迹的发生。  1、首先我们先准备好跑代...
  • 摘要:地标识别,基于深度学习及大规模图像训练,支持上千种物体识别及场景识别,广泛应用于拍照识图、幼教科普、图片分类等场景。本文将为大家带来6种关于地标识的算法整理和总结。
  • 机器视觉主要应用于生产线的产品制造过程中,执行某种特定的任务,比如在识别物体加工表面的裂痕、是否正确密封等,因此基于人工设计的图像特征有很大的局限性,往往是针对特定的任务设计的,不具备普遍适用性。...
  • 指纹识别的欺骗方法

    2010-10-30 13:10:00
    现在的指纹识别还是挺高级的,工作原理大体是这样: 当有物体接触到感应器时,首先是感应器表面的传感器侦测物体表面的凹凸情况,如果符合一般手指的情况就进行拍照,并将图像送去执行指纹识别算法,根据识别...
  • 来自机器人周围数字距离传感器的输入数据将帮助它在其环境中导航,并且摄像头会为物体识别拍照。 机器人的当前动作显示在背面的 OLED 上,还有一个指南针,以帮助导航和定位。 伺服电机用于控制机器人和诱捕机构的...
  • 之前介绍了构建Azure AI的人脸识别服务Demo,那么对于物体识别如何呢?今天我就给大家介绍演示构建自定义视觉的Demo实现物品识别,比如我先用机器学习训练它告诉杯子长什么样,给他最少5张杯子的图片即可完成训练...
  • 按下街机按钮,“门铃”响铃并拍照 - 然后在Google Cloud上查看。添加Vision可实现强大的原型设计! 硬件组件: 谷歌AIY语音× 1 Raspberry Pi 3型号B....使用Vision API,您可以识别人物,物体,地标,品牌等。
  • 我们的生活正因AI技术的落地应用而不断走向智能化 —— 拍照搜索、视频中物体定位、AR眼镜、无人零售货柜、安防领域中的人脸识别、制造业中的缺陷检测、医学领域中的病灶检测、农业领域中的害虫...
  • 得到二值化图像后,我们便可以寻找要识别物体了。在此使用九宫格的方式提取连通分量,原理其实很简单,就是在九宫格里寻找连在一起的像素,如果能找到便将该像素便将该像素的坐标(位于X行,y列)写入到链表里。如此...
  • 假设相片里主体是一把椅子,也有其他物体但不占主要篇幅,用过php调用数据库中预存图片做对比,之后识别出相片里的物体是椅子,拍照角度和物体颜色不定,如何实现呢?
  • 现有工业视觉相机,通过利用Socket通信使相机和机器人相连接,任意旋转待检测物体后,相机拍照即可识别物体的位置,视觉相机检测物体的位置通过Socket发送给机器人端,机器人根据发送过来的数据完成对被检测到物体...
  • 垃圾分类小程序

    千次阅读 2019-07-19 16:26:32
    并且接入了云数据库和百度云的拍照识别。 2、垃圾分类的深度学习项目,使用Python抓取了相关的垃圾分类数据,建模之后,使用OpenCV实现物体的检测和拍照,然后使用Tensorflow进行深度学习训练。 项目地址: ...
  • Learning_1

    2017-09-17 18:58:29
    本资源是用于实现相机拍照功能的APP,能够从相册中选取相片,并实现对照片中出现的物体进行识别的功能,能够达到基本准确,界面简洁美观.
  • 什么是计算机视觉?

    2020-04-10 16:24:50
    如果突然有人问你,计算机视觉是什么?肯定会脑袋一片空白。... 物体识别 自动驾驶中行人识别跟踪,车道线检测,交通标志识别 充当机器人的眼睛进行抓取 等等。 计算机视觉是计算机科学的一个...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

拍照识别物体