调用libcurl库获取人脸识别结果

一、openssl库的编译安装

  1. 工作目录下新建文件夹,官网下载openssl库压缩包并解压至该文件夹

1|wget https://www.openssl.org/source/openssl-1.1.1.tar.gz
2|tar -vxf openssl-1.1.1.tar.gz

  1. 进入解压后文件目录即openssl-1.1.1a,执行可执行文件config

1|./config

  1. 编译

1|make

在这里插入图片描述
4. 下载安装

1|sudo make install

在这里插入图片描述

二、libcurl库编译安装

  1. 网页下载curl-7.71.1.tar.gz压缩包
    通过共享文件夹将其拷贝至工作目录下新建的httpHandler文件中并解压并进入解压后文件即curl-7.71.1

1|tar -vxf curl-7.71.1.tar.gz
2|cd curl-7.71.1

  1. 运行configure, --prefix=$PWD/_install:指定编译生成的文件全部放在$PWD/_install路径文件夹里($代表获取当前路径),而–with-ssl将之前下载安装的openssl库配置到libcurl库中,使其能够访问支持https协议的网页。

1|./configure --prefix=$PWD/_install --with-ssl

在这里插入图片描述

  1. 编译

1|make

在这里插入图片描述
3. 下载安装

2|sudo make install

在这里插入图片描述
三、编程实现人脸识别并成功获取识别网页数据结果

  1. post请求代码
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>


#define true 1
#define false 0
typedef unsigned int bool;


char buffer[20480] = {'\0'};

size_t readData( void *ptr, size_t size, size_t nmemb, void *stream)
{
        strncpy(buffer, ptr, 20480);
        printf("=====================================get data=========================================\n");
        printf("%s\n", buffer);
}
char *getBase64FromPic(char *filePath)
{
        char *bufPic;
        char cmd[128] = {'\0'};
        int filelen;
        int fd;
        sprintf(cmd, "base64 %s > tmpfile", filePath);
        system(cmd);

        fd = open("./tmpfile", O_RDWR);
        filelen = lseek(fd, 0, SEEK_END);
        bufPic = (char *)malloc(filelen+2);
        lseek(fd, 0, SEEK_SET);
        memset(bufPic, '\0', filelen+2);
        read(fd, bufPic, filelen+2);
        close(fd);

        system("rm tmpfile -f");

        return bufPic;

}

bool postUrl()
{
        char *bufPic1;
        char *bufPic2;
        char *key = "8Pn4fG9m4bTrtDqf6CVbB8";
        char *secret = "1a0bf505815a4f8d8d7228e10c369f9e";
        int typeId = 21;
        char *format = "xml";
        char *postString;

        bufPic1 = getBase64FromPic("./jzt1.jpg");
        bufPic2 = getBase64FromPic("./jzt2.jpg");
        postString = (char *)malloc(strlen(key)+strlen(secret)+strlen(bufPic1)+strlen(bufPic2)+128);
        //连接postString
        sprintf(postString, "&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s", bufPic1, bufPic2, key, secret, typeId, format);

        CURL *curl;
        CURLcode res;
        curl = curl_easy_init();
        if (curl)
        {
                curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
                curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);    // 指定post内容
                curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do");   // 指定url
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);
                res = curl_easy_perform(curl);
                printf("acquire success: %d\n", res);
                if (strstr(buffer, "是") != NULL ){
                        printf("the same person\n");
                }
                else {
                        printf("different person\n");
                }

                curl_easy_cleanup(curl);
        }
        return true;
}
int main(void)
{
        postUrl();
}
~ 
  1. 运行结果
    在这里插入图片描述
    网页数据:
    在这里插入图片描述
    总结:在按照上述步骤配置安装openssl库时没有出现任何报错,但是在对faceDemo1.c进行编译时运行时,即:
1|gcc faceDemo1.c -I curl-7.71.1/_install/include/ -L curl-7.71.1/_install/lib/ -lcurl

2|./a.out

运行结果并不是上图所示,只返回了"acquire success:1",ping www.baidu.com也能ping得通,代码检查了也没啥问题,所以我就一直对openssl库重复进行上述安装操作,最终也无济于事。随后我又重新开启设置了一台虚拟机,也是按照上述操作进行openssl库、libcurl库的安装,编译运行a.out时出现了报错:
./a.out:./a.out: error while loading shared libraries: libcurl.so.4: cannot open shared
对此,我在网上参考了一些解决方法(也踩了一些雷),方法如下:

1|将libcurl.so.4拷贝至根目录下/usr/local/lib/(sudo cp....)

2|命令行输入su进入超级用户模式,然后再vim /etc/ld.so.conf.d/usr-libs.conf,在该文件中输入/usr/local/lib并保存退出

3|ldconfig (更新/etc/ld.so.cache文件)

4|exit (退出超级用户模式)

此时,在编译faceDemo1.c运行a.out时就能得到json数据,然后我又在我先前的虚拟机上进行该操作后,编译运行也能得出正确的结果(真的是心累,第一个虚拟机编译运行a.out如果报错,早就可以把问题解决掉,浪费了我太多时间在配置openssl库上,真的搞心态),最后以上所有操作均可在树莓派上进行(在树莓派上编译时即:gcc faceDemo1.c -I curl-7.71.1/_install/include/ -L curl-7.71.1/_install/lib/ -lcurl 如果出现以下报错)
在这里插入图片描述
即:

./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_keylog_callback@OPENSSL_1_1_1'
./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_post_handshake_auth@OPENSSL_1_1_1'
./curl-7.71.1/_install/lib//libcurl.so: undefined reference to `SSL_CTX_set_ciphersuites@OPENSSL_1_1_1'

此时,可在编译命令最后加上“-lssl -lcrypto”再次编译即可生成a.out,如下图所示:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值