网站建设的经营范围,qq腾讯官网登录入口,网站的制作与调试,网站设建设表单一、翔云 人工智能开放平台
API文档开发示例下载
二、编译openSSL支持libcurl的https访问
安装SSL依赖库openSSL(使用工具wget)libcurl库重新配置#xff0c;编译#xff0c;安装运行#xff08;运行需添加动态库为环境变量#xff09;
三、编程实现人脸识别 四、Base6…一、翔云 人工智能开放平台
API文档开发示例下载
二、编译openSSL支持libcurl的https访问
安装SSL依赖库openSSL(使用工具wget)libcurl库重新配置编译安装运行运行需添加动态库为环境变量
三、编程实现人脸识别 四、Base64编码 五、RGB颜色模型(用于表示图像中的颜色信息) 六、BMP 图像以像素矩阵的形式存储 七、Base64数据格式转换 八、加入图片base64编码 九、人脸识别完整代码及功能点实现现象
一、翔云 人工智能开放平台
翔云 人工智能开放平台 下面通过人工智能OCR识别平台翔云的使用掌握调库调API开发的一般步骤其他的平台也基本类似。
API文档 开发示例下载 C示例代码 strPostData.Format(_T(img%skey%ssecret%stypeId%dformatxml),strImageBase64,strKey,strSecret,nTypeID);Java示例代码
java大多直接调库非常简洁这也是它开发效率高的原因之一。
二、编译openSSL支持libcurl的https访问 那是因为在编译libcurl库的时候由于翔云接口是https:开头的需要选择支持SSL。
./configure --with -ssl我们访问的接口是https开头的要进行身份验证和数据加密的体现在我们的key和secret。 那我们就要回到/curl-7.71.1路径下删除rm _install -rf上次编译出来的文件夹重新编译支持SSL的库。由/docs/INSTALL.md我们可以得知要想支持SSL就得./configure --with-ssl
chmod x configure
sudo ./configure --prefix$PWD/_install --with-ssl编译错误
cheking for SSL_connect in -lssl... (cached)no no
configure:error:openSSL libs and/or directories were not found where specified!安装SSL依赖库openSSL(使用工具wget) 想要支持SSL必须要有依赖库需要系统中已经安装好了SSL。 我们需要安装openSSL.tar
利用linux的开源工具下载wget是Linux中的一个下载文件的工具wget是在Linux下开发的开放源代码的软件。
百度搜索技巧wget openSSL.tar
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
tar xvf openssl-1.1.1a.tar.gz进入文件夹直接去看他的INSTALL。 为了避免到时候编译这个curl又要去配置SSL这个库我们直接把SSL安装到默认的系统位置去一般默认是在/usr/local底下所以不指定安装路径了直接在/openssl-1.1.1a路径下配置
./config
make
sudo make install安装配置openssl库时间比较长建议网络稳定ssh建议用MobaXtermvscodessh安装可能会掉 加 sudo就肯定安装在了 usr/local 中非工作目录无权限 libcurl库重新配置编译安装
回到/curl-7.71.1/目录下重新进行配置:
chmod x configure
sudo ./configure --prefix$PWD/_install --with-ssl
sudo make
make install运行运行需添加动态库为环境变量
生成了可执行文件./a.out直接运行可能会报错我没有报错可能是我用的Ubuntu22.04。
原因是运行时要链接动态库没有添加环境变量
cd /home/orangepi/curl-7.71.1/_install/lib
export LD_LIBRARY_PATH/home/orangepi/curl-7.71.1/_install/lib永久有效配置环境变量要改配置文件
在Linux系统上如果你希望将libcurl库的路径添加到永久环境变量中你可以编辑shell配置文件例如bash的.bashrc文件。以下是在bash shell中将libcurl库路径添加到LD_LIBRARY_PATH环境变量的步骤 打开.bashrc文件可以使用文本编辑器如nano、vim、gedit等。 nano ~/.bashrc在文件的末尾添加以下行其中/path/to/libcurl是libcurl库的实际路径。 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/path/to/libcurl替换/path/to/libcurl为libcurl库的实际路径。 保存并关闭文件。 使更改生效。可以通过运行以下命令重新加载.bashrc文件 source ~/.bashrc或者你可以注销并重新登录。
现在libcurl库的路径将在每次启动新shell时自动添加到LD_LIBRARY_PATH中。这确保了libcurl库在系统范围内可用。请注意这只对当前用户生效。如果你希望所有用户都能访问libcurl库你可能需要将环境变量设置添加到/etc/environment文件中这需要超级用户权限。
echo $PATH // 获得当前环境变量的值
pwd // 获得当前路径修改工作目录下的 .bashrc 隐藏文件配置命令终端的
vi /home/orangepi/.bashrc 在文件最后一行加入
export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/orangepi/curl-7.71.1/_install/libsource /home/orangepi/.bashrc 加载配置文件马上生效配置。三、编程实现人脸识别
翔云人脸识别API文档 ocr.c
#include stdio.h
#include curl/curl.h
#include string.h
#include stdlib.h// 定义bool类型和常量
typedef unsigned int bool; // 数据类型别名用typedef
#define true 1
#define false 0// 回调函数读取从OCR后台返回的数据 前面打开百度的例子是将内容读取到本地文件fd里面
size_t readData(void *ptr, size_t size, size_t nmemb, void *stream)
{// 在这里处理返回的数据例如保存到文件或进行其他处理char buf[1024] {\0};strncpy(buf, ptr, 1024);printf( get data \n);printf(%s\n, buf);return size * nmemb;
}// 根据文档接口调用方法为post请求
bool postUrl()
{CURL *curl;CURLcode res;char *postString NULL; // 空指针要开辟空间// 根据翔云平台的接口要求 分开定义然后字符串拼接char *img1 NULL; // 图片base64流char *img2 NULL;char *key JFD5c1iBh9LVqPkkZMxxxx;char *secret 76f444813fc945bd9543e4d7e086xxxx;int typeId 21;char *format xml;// 字符串拼接postString (char *)malloc(strlen(key) strlen(secret) 2048);sprintf(postString, img1%simg2%skey%ssecret%stypeId%dformat%s, , , key, secret, typeId, format);curl curl_easy_init();if (curl){// 指定cookie缓存文件if (curl_easy_setopt(curl, CURLOPT_COOKIEFILE, /tmp/cookie.txt) ! CURLE_OK){fprintf(stderr, Failed to set cookie file\n);// 处理错误return false; // 在设置失败时直接返回}// 指定post传输内容get请求将URL和postString一次性发送curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);// 指定urlcurl_easy_setopt(curl, CURLOPT_URL, https://netocr.com/api/faceliu.do);// 回调函数读取返回值curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);// 执行请求res curl_easy_perform(curl);if (res ! CURLE_OK){fprintf(stderr, curl_easy_perform() failed: %s\n, curl_easy_strerror(res));// 处理错误return false;}// 清理资源curl_easy_cleanup(curl);}// 释放动态分配的内存free(postString);return true;
}int main(void)
{postUrl();return 0;
}编译
gcc ocr.c -I /home/orangepi/curl-7.71.1/_install/include/ -L /home/orangepi/curl-7.71.1/_install/lib/ -lcurl运行
成功运行后已经可以看到已经收到了翔云后台的反馈
四、Base64编码
Base64 是一种二进制到文本编码方式通过将二进制数据编码为 ASCII 字符集中的字符使得数据能够以文本形式传输而不会被改变。Base64 编码通常用于在文本协议中传输二进制数据例如电子邮件的附件、图片的网址传输等。
Base64 编码的基本原理是将每三个字节的数据24 位转换为四个 Base64 字符。这样原始数据的大小会增加约 1/3。
Base64 字符集通常包含 64 个字符包括
26 个大写字母 A-Z26 个小写字母 a-z10 个数字 0-9两个额外字符 和 /
Base64 不使用常见的字符因此它是一种安全的编码方式适用于在文本协议中传输二进制数据。
编码过程如下
将数据按每三个字节24 位进行分组。将每组数据划分为四个 6 位的片段。将这些 6 位的片段转换为 Base64 字符。
Base64 解码则是编码的逆过程将 Base64 字符转换回原始的二进制数据。在编码和解码过程中Base64 字符集提供了一种标准的、文本友好的表示形式使得数据在各种环境中都能够被正确处理。
示例
原始数据 Hello, World!
Base64 编码SGVsbG8sIFdvcmxkIQ在编程中大多数编程语言都提供了 Base64 编码和解码的库或函数方便开发者在应用中使用。
五、RGB颜色模型(用于表示图像中的颜色信息)
RGBRed, Green, Blue是一种颜色模型用于表示图像中的颜色信息。在 RGB 模型中每个像素的颜色由红色R、绿色G、蓝色B三个分量的亮度组合而成。每个分量的取值通常在 0 到 255 之间其中 0 表示最小亮度255 表示最大亮度。
RGB 数据表示一个图像的颜色信息通常以矩阵的形式存储。每个像素由一个或多个字节组成其中每个字节对应一个颜色分量。在常见的图像文件格式中像素的存储顺序通常是连续的按行或按列排列。
以下是一个简单的示例展示了一个 3x3 的图像的 RGB 数据
| R0 G0 B0 | R1 G1 B1 | R2 G2 B2 |
| R3 G3 B3 | R4 G4 B4 | R5 G5 B5 |
| R6 G6 B6 | R7 G7 B7 | R8 G8 B8 |这里每组 R G B 表示一个像素的红、绿、蓝三个分量的值。在实际应用中图像的大小可能是数百乃至数千像素而 RGB 数据的表示会更加庞大。
在编程中处理 RGB 数据通常需要使用专门的图像处理库例如 OpenCVOpen Source Computer Vision Library等。这些库提供了丰富的函数和工具方便开发者对图像进行处理、分析和操作。 BMPBitmap是一种位图图像文件格式它是一种无损压缩的图像格式通常以.bmp为文件扩展名。BMP 文件格式最初由Microsoft开发用于Windows平台。
六、BMP 图像以像素矩阵的形式存储
BMP 图像以像素矩阵的形式存储每个像素可以用来表示图像中的一个点而每个点的颜色信息则通过RGBRed, Green, Blue三个分量来表示。BMP 文件格式支持不同的颜色深度包括1位、4位、8位、16位、24位和32位等多种格式。
BMP 文件的结构包括文件头和图像数据两个主要部分 文件头Bitmap File Header 包含了文件的一些基本信息比如文件类型、文件大小、图像的偏移等。 信息头Bitmap Information Header 包含了关于图像的详细信息如图像的宽度、高度、颜色平面数、每像素比特数等。 颜色表Color Table 针对使用调色板的图像包含了调色板中的颜色信息。 图像数据 包含了图像的实际像素数据。
BMP 文件通常比较简单易于理解和解析。然而由于它不使用压缩算法因此可能占用较大的存储空间尤其是对于彩色图像。在实际应用中更常见的图像格式如JPEG、PNG等采用了更高效的压缩算法。
常见的图像格式
有许多不同的图像格式每种格式都有其特定的用途和优势。以下是一些常见的图像格式 JPEGJoint Photographic Experts Group 一种有损压缩格式适用于照片和真彩图像。它通过牺牲一些图像细节来实现更小的文件大小。 PNGPortable Network Graphics 一种无损压缩格式适用于图标、图形和带有透明背景的图像。PNG支持多种颜色深度和透明度。 GIFGraphics Interchange Format 一种支持动画和透明度的格式。GIF适用于简单的图形但由于其有限的颜色深度不适用于照片。 BMPBitmap 一种无损格式适用于简单的图像。BMP文件通常较大因为它们未经压缩。 TIFFTagged Image File Format 一种灵活的格式适用于存储高质量的图像和照片。TIFF支持无损压缩和多页文档。 WEBP 由Google开发的一种图像格式支持有损和无损压缩同时具有较小的文件大小。 SVGScalable Vector Graphics 一种矢量图形格式适用于图标和图形。SVG图像可缩放而不失真。 RAW 一种未经处理的图像格式通常由数码相机生成。RAW格式保留了更多的图像信息但文件较大。 ICOIcon 用于存储图标的格式通常用于Windows应用程序。
这只是一小部分常见的图像格式实际上还有许多其他专用格式和变种每种都适用于不同的用途。选择图像格式时通常要考虑图像的内容、用途、质量和文件大小。
七、Base64数据格式转换
Base64是一种将二进制数据编码成ASCII字符串的方法通常用于在文本协议中传输二进制数据。你可以使用Base64编码工具对图像进行编码以下是一个示例
base64 test.jpg test_base64.txt这将把 test.jpg 图像文件编码为Base64并将结果保存到 test_base64.txt 文件中。
如果你想要将Base64字符串解码回二进制数据可以使用以下命令
base64 -d test_base64.txt test_decoded.jpg这将从 test_base64.txt 文件中读取Base64字符串并将其解码为 test_decoded.jpg 图像文件。
请注意Base64编码会增加数据的大小因为它将二进制数据转换为文本形式。在网络传输中使用它可以确保数据以文本的形式传递但需要考虑到编码和解码的性能开销。
常用的Base64加密解密工具网站
一些常用的Base64加密解密工具网站包括
Base64 编码解码 - 在线工具Online Base64 编码解码Base64 编码/解码工具
请记住在使用在线工具时要谨慎特别是在处理敏感数据时因为在线服务可能会记录你的数据。如果你处理敏感信息请尽量使用本地工具。
八、加入图片base64编码 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一可用于在HTTP环境下传递较长的标识信息。 在Linux下生成图片的base64编码
base64 test.jpg#include stdio.h
#include stdlib.h
#include string.h
#include fcntl.h
#include unistd.hchar* getBase64FromFile(const char* filePath)
{char cmd[256] {\0};char* base64Buf NULL;// 使用安全的方式构建命令snprintf(cmd, sizeof(cmd), base64 %s | tr -d \n tmpFile, filePath);//图片的base64流导入到文件中if (system(cmd) -1) {perror(Error executing system command);return NULL;}int fd open(./tmpFile, O_RDWR);if (fd -1) {perror(Error opening file);return NULL;}// 计算文件大小int fileLen lseek(fd, 0, SEEK_END);lseek(fd, 0, SEEK_SET);// 动态分配内存base64Buf (char*)malloc(fileLen 1);if (base64Buf NULL) {perror(Error allocating memory);close(fd);return NULL;}memset(base64Buf, \0, fileLen 1);// 读取文件内容到字符串(base64流)if (read(fd, base64Buf, fileLen) -1) {perror(Error reading file);free(base64Buf);close(fd);return NULL;}close(fd);// 删除临时文件if (remove(tmpFile) -1) {perror(Error deleting temporary file);}return base64Buf;
}int main() {const char* filePath your_file_path_here;char* base64String getBase64FromFile(filePath);if (base64String ! NULL) {printf(Base64 String:\n%s\n, base64String);// 释放动态分配的内存free(base64String);}return 0;
}九、人脸识别完整代码及功能点实现现象
ocr.c
#include stdio.h
#include curl/curl.h
#include string.h
#include stdlib.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include unistd.h// 定义bool类型和常量
typedef unsigned int bool; // 数据类型别名用typedef
#define true 1
#define false 0char ocrReturnBuf[1024] {\0}; // 全局变量用来接收从OCR后台返回的数据// 回调函数读取从OCR后台返回的数据(把从后台的数据拷贝给ocrReturnBuf)
size_t readData(void *ptr, size_t size, size_t nmemb, void *stream)
{size_t totalSize size * nmemb;// 为了避免溢出计算实际拷贝的长度size_t copySize (totalSize (sizeof(ocrReturnBuf) - 1)) ? totalSize : (sizeof(ocrReturnBuf) - 1);// 拷贝数据到 ocrRetBuf 中memcpy(ocrReturnBuf, ptr, copySize);// 手动添加字符串终结符ocrReturnBuf[copySize] \0;return totalSize;
}char *getBase64FromFile(const char *filePath)
{char cmd[256] {\0};char *base64Buf NULL;// 使用安全的方式构建命令snprintf(cmd, sizeof(cmd), base64 %s | tr -d \n tmpFile, filePath);if (system(cmd) -1) {perror(Error executing system command);return NULL;}int fd open(./tmpFile, O_RDWR);if (fd -1) {perror(Error opening file);return NULL;}// 计算文件大小int fileLen lseek(fd, 0, SEEK_END);lseek(fd, 0, SEEK_SET);// 动态分配内存base64Buf (char *)malloc(fileLen 1);if (base64Buf NULL) {perror(Error allocating memory);close(fd);return NULL;}memset(base64Buf, \0, fileLen 1);// 读取文件内容到字符串if (read(fd, base64Buf, fileLen) -1) {perror(Error reading file);free(base64Buf);close(fd);return NULL;}close(fd);// 删除临时文件if (remove(tmpFile) -1) {perror(Error deleting temporary file);}return base64Buf;
}// 根据文档接口调用方法为post请求
bool postUrl()
{CURL *curl;CURLcode res;// 根据翔云平台的接口要求 分开定义然后字符串拼接char *img1 getBase64FromFile(/home/orangepi/smart_home/test/test1_JPEG.webp); // 图片base64流char *img2 getBase64FromFile(/home/orangepi/smart_home/test/test2_JPEG.webp);char *key JFD5c1iBh9LVqPkkZMxxxx;char *secret 76f444813fc945bd9543e4d7e086xxxx;int typeId 21;char *format xml;int len strlen(key) strlen(secret) strlen(img1) strlen(img2) 128; // 分配空间不够会导致栈溢出char* postString (char*)malloc(len);memset(postString, \0, len);//因为postString是一个指针不能用sizeof来计算其指向的大小// 字符串拼接sprintf(postString, img1%simg2%skey%ssecret%stypeId%dformat%s, img1, img2, key, secret, typeId, format);curl curl_easy_init();if (curl){// 指定cookie缓存文件// if (curl_easy_setopt(curl, CURLOPT_COOKIEFILE, /tmp/cookie.txt) ! CURLE_OK)// {// fprintf(stderr, Failed to set cookie file\n);// return false; // 在设置失败时直接返回// }// 指定post传输内容get请求将URL和postString一次性发送curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);// 指定urlcurl_easy_setopt(curl, CURLOPT_URL, https://netocr.com/api/faceliu.do);// 回调函数读取返回值curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);// 执行请求res curl_easy_perform(curl);if (res ! CURLE_OK) {fprintf(stderr, curl_easy_perform() failed: %s\n, curl_easy_strerror(res));// 处理错误return false;}//字符串检索 判断翔云后台返回的一大堆字符串中有没有“否”if (strstr(ocrReturnBuf,否) ! NULL) { printf(不是同一个人\n);}else{printf(是同一个人\n);}// 清理资源curl_easy_cleanup(curl);}// 释放动态分配的内存free(img1);free(img2);free(postString);return true;
}int main(void)
{postUrl();return 0;
}编译
gcc ocr.c -I /home/orangepi/curl-7.71.1/_install/include/ -L /home/orangepi/curl-7.71.1/_install/lib/ -lcurl运行