qt5.8(c++)实现阿里云人脸识别云接口

阿里云提供了人脸识别的api,其示例除了c/c++,其他主流语言都有相应的实例。

本人由于项目债务和集成需要,需要用c/c++实现,若只是支持win/Linux平台,采用

acl_master源码库也可行,有需要的可参考《阿里云短信服务接口的c++实现》,

阿里云的短信服务接口与人脸识别在数据签名、加密等方面是一致的。

我当前项目由于跨平台支持android编译,所以采用了qt实现阿里云的人脸识别接口。

备注:若需要静态编译实现阿里云的人脸识别,可能 qt环境需要重新静态编译network模块,追加openssl静态编译支持,

更细节的实现可以参考《qt5.8_for_vs2015 and openssl静态编译 》。

阿里云的人脸识别主要有两个难点,其一是,若你直接传输图片内容,需要对图片内容进行编码,其二是需要实现签名认证。

下面就如何实现阿里云的人脸属性识别的过程(人脸检测定位、人脸比对类似):

1)首先需要开通 阿里云 的人脸识别服务,下面是本人在阿里云的云产品通用代金券链接:

https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=pfb80n4a

开通服务后,进入 人脸识别的控制台,在其左侧栏目有个API调试,点击进去,这里标注的

请求地址是我们需要用到的,例如:https://dtplus-cn-shanghai.data.aliyuncs.com/face/attribute

另外 Access Key ID和Access Key Secret在API调用也需要,在你的头像下的AccessKeys项点击进去获取即可。

2)阿里API说明手册指出,若图片内容指定url,需要你只身配备网络存储路径,采用阿里的OSS也是不错的选择,若直接传输图片内容,需要采用base64编码,刚好qt5.8就能直接实现,下面就直接传输本地图片内容进行阿里云人脸识别API调用,记得qt工程文件需要添加,

QT += network

示例代码:

QByteArray FaceDetectObject::Image_To_Base64(QString image_path)
{
QImage image(image_path);
QByteArray ba;
QBuffer buf(&ba);
image.save(&buf,”jpg”);
QByteArray hexed = ba.toBase64();
buf.close();
return hexed;
}

3)关于人脸识别的通信接口的签名的细节要求查看官方说明文档《API校验规范》章节,其内容要求UTF-8和Base64编码,签名算法遵循RFC 2104HMAC-SHA1规范。

MD5转换示例代码:

QByteArray FaceDetectObject::getMD5(QByteArray bytes_)
{
QCryptographicHash ch(QCryptographicHash::Md5);
QByteArray ret;
ch.addData(bytes_);
ret = ch.result();
return ret;
}

HMACSha1算法示例代码:
QByteArray FaceDetectObject::HMACSha1(QByteArray key, QByteArray baseString)
{
int blockSize = 64; // HMAC-SHA-1 block size, defined in SHA-1 standard
if (key.length() > blockSize) { // if key is longer than block size (64), reduce key length with SHA-1 compression
key = QCryptographicHash::hash(key, QCryptographicHash::Sha1);
}
QByteArray innerPadding(blockSize, char(0x36)); // initialize inner padding with char “6”
QByteArray outerPadding(blockSize, char(0x5c)); // initialize outer padding with char “/”
// ascii characters 0x36 (“6”) and 0x5c (“/”) are selected because they have large
// Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance)
for (int i = 0; i < key.length(); i++) {
innerPadding[i] = innerPadding[i] ^ key.at(i); // XOR operation between every byte in key and innerpadding, of key length
outerPadding[i] = outerPadding[i] ^ key.at(i); // XOR operation between every byte in key and outerpadding, of key length
}
// result = hash ( outerPadding CONCAT hash ( innerPadding CONCAT baseString ) ).toBase64
QByteArray total = outerPadding;
QByteArray part = innerPadding;
part.append(baseString);
total.append(QCryptographicHash::hash(part, QCryptographicHash::Sha1));
QByteArray hashed = QCryptographicHash::hash(total, QCryptographicHash::Sha1);
/// 注意——>把字符串hashed转换为Hex,内存中的ASCII码arrayFromHexString
QByteArray arrayFromHexString = QByteArray::fromHex(hashed.toHex());
qDebug()<<”hmacSha1内存中的ASCII码 arrayFromHexString \n”<

ifndef FACEDETECTOBJECT_H

define FACEDETECTOBJECT_H

include

include

include

include

include

include

include

include

class FaceDetectObject
: public QObject
{
Q_OBJECT
public:
FaceDetectObject(QObject * parent = 0);
~FaceDetectObject();

private:
QByteArray getMD5(QByteArray bytes_);
QByteArray HMACSha1(QByteArray key, QByteArray baseString);
QByteArray Image_To_Base64(QString image_path);
QImage Base64_To_Image(QByteArray bytearray,QString save_Path);
QByteArray Image_To_ByteArray(QString image_path);
QImage ByteArray_To_Image(QByteArray bytearray,QString save_Path);
public slots:
void do_get();
void do_post_img(QString imgFile);
void do_post(QByteArray bytearray);
void do_post_al(QByteArray bytearray);
private slots:
void finishedReplay();
void slotError(QNetworkReply::NetworkError net_error);
void downloadProgress(qint64 bytesSent, qint64 bytesTotal);
private:
QNetworkAccessManager *manager;
QUrl url;
QNetworkReply *reply;
};

endif // FACEDETECTOBJECT_H

include “facedetectobject.h”

include

include

include

include

include

include

include

FaceDetectObject::FaceDetectObject(QObject * parent)
: QObject(parent)
{
// //test
// QByteArray src = Image_To_ByteArray(“fdtimg.jpg”);
// QImage dest = ByteArray_To_Image(src,”fdtimg_c.jpg”);
manager =new QNetworkAccessManager(this);
url = QUrl(“http://www.baidu.com/“);
reply = Q_NULLPTR;
}

FaceDetectObject::~FaceDetectObject()
{

}

void FaceDetectObject::do_get()
{
QNetworkRequest request;
request.setUrl(url);
if(reply != Q_NULLPTR) {//更改reply指向位置钱一定要保证之前的定义了自动delete
reply->deleteLater();
}
reply = manager->get(request);
// connect(reply, &QNetworkReply::finished, this, &FaceDetectThread::finishedReplay);
connect(reply, SIGNAL(finished()), this, SLOT(finishedReplay()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(slotError(QNetworkReply::NetworkError)));
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),
this,SLOT(downloadProgress(qint64,qint64)));
qDebug() << “start get”;
}

void FaceDetectObject::do_post_img(QString imgFile)
{
qDebug()<<”do_post_img and imgfile=”<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值