找回密码
 立即注册
收起左侧

Qt编写人脸识别人脸比对ZJ识别

6
回复
11029
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2017-9-17 14:21:32 显示全部楼层 |阅读模式
本帖最后由 liudianwu 于 2017-9-18 08:37 编辑

项目需要,将刷卡抓拍到的图像和身份证图像进行比对,判断出是否为同一人,用opencv或者离线SDK做,效率低识别率低,索性直接用web api,我采用的是face++,据说支付宝刷脸也是用的该公司的库,我测试了下,准确度100%。特意花了两天时间写了个类,将处理封装了下。该类已经集成在QFramework中。返回json数据解析使用QScript解析,没有使用qt5中的json类,因为我的目标运行平台为qt4.8。
运行效果:








主要功能:
  1. /**
  2. * face++ ZJ识别+人脸识别+人脸比对等功能类 作者:feiyangqingyun(QQ:517216493) 2017-9-16
  3. * 1:可识别身份证正面信息+背面信息
  4. * 2:可识别银行卡信息
  5. * 3:可识别驾驶证+行驶证信息
  6. * 4:可进行人脸识别,人脸比对
  7. * 5:可设置请求地址+用户密钥+应用密钥
  8. * 6:直接传入图片即可,信号返回,毫秒级极速响应
  9. * 7:通用Qt4-Qt5,windows linux 嵌入式linux
  10. */
复制代码
核心代码:
  1. void Face::sendData(const QList<QHttpPart> &parts)
  2. {
  3.     //初始化消息体
  4.     QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

  5.     //添加用户密钥
  6.     QHttpPart keyPart = dataToHttpPart(key.toLatin1(), QVariant("form-data; name="api_key""));
  7.     multiPart->append(keyPart);

  8.     //添加应用密钥
  9.     QHttpPart secretPart = dataToHttpPart(secret.toLatin1(), QVariant("form-data; name="api_secret""));
  10.     multiPart->append(secretPart);

  11.     //逐个添加消息内容
  12.     foreach (QHttpPart part, parts) {
  13.         multiPart->append(part);
  14.     }

  15.     //初始化请求对象
  16.     QNetworkRequest request;
  17.     request.setUrl(QUrl(url));

  18.     //设置openssl签名配置,否则在ARM上会报错
  19.     QSslConfiguration conf = request.sslConfiguration();
  20.     conf.setPeerVerifyMode(QSslSocket::VerifyNone);
  21. #if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
  22.     conf.setProtocol(QSsl::TlsV1_0);
  23. #else
  24.     conf.setProtocol(QSsl::TlsV1);
  25. #endif
  26.     request.setSslConfiguration(conf);

  27.     //发送请求
  28.     QNetworkReply *reply = manager->post(request, multiPart);
  29.     multiPart->setParent(reply);
  30. }

  31. void Face::finished(QNetworkReply *reply)
  32. {
  33.     QString error = reply->errorString();
  34.     if (!error.isEmpty()) {
  35.         emit receiveError(error);
  36.     }

  37.     if (reply->bytesAvailable() > 0 && reply->error() == QNetworkReply::NoError) {
  38.         QString data = reply->readAll();
  39.         reply->deleteLater();

  40.         //发送接收数据信号
  41.         emit receiveData(data);

  42.         //初始化脚本引擎
  43.         QScriptEngine engine;
  44.         //构建解析对象
  45.         QScriptValue script = engine.evaluate("value=" + data);

  46.         //处理时间
  47.         int time_used = script.property("time_used").toInt32();
  48.         emit receiveTimeUsed(time_used);

  49.         //ZJ识别
  50.         QScriptValue value_cards = script.property("cards");
  51.         if(value_cards.isArray()) {
  52.             int type;
  53.             QString name, gender, id_card_number, birthday, race, address, side;
  54.             QString valid_date, issued_by;
  55.             QString valid_from, issue_date, class_type, license_number, valid_for, version, nationality;
  56.             QString vehicle_type, vin, plate_no, use_character, owner, model, register_date, engine_no;

  57.             //创建迭代器逐个解析具体值
  58.             QScriptValueIterator it(value_cards);
  59.             while (it.hasNext()) {
  60.                 it.next();

  61.                 //ZJ类型 1-身份证  2-驾驶证  3-行驶证
  62.                 type = it.value().property("type").toInt32();

  63.                 name = it.value().property("name").toString();
  64.                 gender = it.value().property("gender").toString();
  65.                 id_card_number = it.value().property("id_card_number").toString();
  66.                 birthday = it.value().property("birthday").toString();
  67.                 race = it.value().property("race").toString();
  68.                 address = it.value().property("address").toString();
  69.                 side = it.value().property("side").toString();

  70.                 valid_date = it.value().property("valid_date").toString();
  71.                 issued_by = it.value().property("issued_by").toString();

  72.                 valid_from = it.value().property("valid_from").toString();
  73.                 issue_date = it.value().property("issue_date").toString();
  74.                 class_type = it.value().property("class").toString();
  75.                 license_number = it.value().property("license_number").toString();
  76.                 valid_for = it.value().property("valid_for").toString();
  77.                 version = it.value().property("version").toString();
  78.                 nationality = it.value().property("nationality").toString();

  79.                 vehicle_type = it.value().property("vehicle_type").toString();
  80.                 vin = it.value().property("vin").toString();
  81.                 plate_no = it.value().property("plate_no").toString();
  82.                 use_character = it.value().property("use_character").toString();
  83.                 owner = it.value().property("owner").toString();
  84.                 model = it.value().property("model").toString();
  85.                 register_date = it.value().property("register_date").toString();
  86.                 engine_no = it.value().property("engine_no").toString();

  87.                 if (type == 1) {
  88.                     if (side == "front") {
  89.                         emit receiveIDCardInfoFront(name, gender, id_card_number, birthday, race, address);
  90.                     } else if (side == "back") {
  91.                         emit receiveIDCardInfoBack(valid_date, issued_by);
  92.                     }
  93.                 } else if (type == 2) {
  94.                     emit receiveDriverInfo(valid_from, gender, issued_by, issue_date, class_type, license_number,
  95.                                            valid_for, birthday, version, address, nationality, name);
  96.                 } else if (type == 3) {
  97.                     emit receiveRvehicleInfo(issue_date, vehicle_type, issued_by, vin, plate_no, use_character,
  98.                                              address, owner, model, register_date, engine_no);
  99.                 } else {
  100.                     break;
  101.                 }
  102.             }
  103.         }

  104.         //银行卡识别
  105.         QScriptValue value_bank_cards = script.property("bank_cards");
  106.         if(value_bank_cards.isArray()) {
  107.             QString number;
  108.             QPoint left_bottom, right_top, right_bottom, left_top;

  109.             //创建迭代器逐个解析具体值
  110.             QScriptValueIterator it(value_bank_cards);
  111.             while (it.hasNext()) {
  112.                 it.next();

  113.                 number = it.value().property("number").toString();

  114.                 //取出位置区域
  115.                 QScriptValue value_bound = it.value().property("bound");
  116.                 QScriptValue value_left_bottom = value_bound.property("left_bottom");
  117.                 QScriptValue value_right_top = value_bound.property("right_top");
  118.                 QScriptValue value_right_bottom = value_bound.property("right_bottom");
  119.                 QScriptValue value_left_top = value_bound.property("left_top");

  120.                 left_bottom.setY(value_left_bottom.property("y").toInt32());
  121.                 left_bottom.setX(value_left_bottom.property("x").toInt32());

  122.                 right_top.setY(value_right_top.property("y").toInt32());
  123.                 right_top.setX(value_right_top.property("x").toInt32());

  124.                 right_bottom.setY(value_right_bottom.property("y").toInt32());
  125.                 right_bottom.setX(value_right_bottom.property("x").toInt32());

  126.                 left_top.setY(value_left_top.property("y").toInt32());
  127.                 left_top.setX(value_left_top.property("x").toInt32());

  128.                 if (!number.isEmpty()) {
  129.                     emit receiveBankCardInfo(number, left_bottom, right_top, right_bottom, left_top);
  130.                 } else {
  131.                     break;
  132.                 }
  133.             }
  134.         }

  135.         //人脸识别
  136.         QScriptValue value_faces = script.property("faces");
  137.         if(value_faces.isArray()) {
  138.             QRect face_rectangle;

  139.             //创建迭代器逐个解析具体值
  140.             QScriptValueIterator it(value_faces);
  141.             while (it.hasNext()) {
  142.                 it.next();

  143.                 QScriptValue value_face_rectangle = it.value().property("face_rectangle");
  144.                 face_rectangle.setX(value_face_rectangle.property("left").toInt32());
  145.                 face_rectangle.setY(value_face_rectangle.property("top").toInt32());
  146.                 face_rectangle.setWidth(value_face_rectangle.property("width").toInt32());
  147.                 face_rectangle.setHeight(value_face_rectangle.property("height").toInt32());

  148.                 if (face_rectangle.width() > 0) {
  149.                     emit receiveFaceRect(face_rectangle);
  150.                 } else {
  151.                     break;
  152.                 }
  153.             }
  154.         }

  155.         //人脸比对
  156.         QScriptValue value_faces1 = script.property("faces1");
  157.         QScriptValue value_faces2 = script.property("faces2");
  158.         QRect face1_rectangle, face2_rectangle;
  159.         double confidence = script.property("confidence").toString().toDouble();

  160.         if(value_faces1.isArray()) {
  161.             //创建迭代器逐个解析具体值
  162.             QScriptValueIterator it(value_faces1);
  163.             while (it.hasNext()) {
  164.                 it.next();

  165.                 QScriptValue value_face_rectangle = it.value().property("face_rectangle");
  166.                 face1_rectangle.setX(value_face_rectangle.property("left").toInt32());
  167.                 face1_rectangle.setY(value_face_rectangle.property("top").toInt32());
  168.                 face1_rectangle.setWidth(value_face_rectangle.property("width").toInt32());
  169.                 face1_rectangle.setHeight(value_face_rectangle.property("height").toInt32());

  170.                 if (face1_rectangle.width() <= 0) {
  171.                     break;
  172.                 }
  173.             }
  174.         }

  175.         if(value_faces2.isArray()) {
  176.             //创建迭代器逐个解析具体值
  177.             QScriptValueIterator it(value_faces2);
  178.             while (it.hasNext()) {
  179.                 it.next();

  180.                 QScriptValue value_face_rectangle = it.value().property("face_rectangle");
  181.                 face2_rectangle.setX(value_face_rectangle.property("left").toInt32());
  182.                 face2_rectangle.setY(value_face_rectangle.property("top").toInt32());
  183.                 face2_rectangle.setWidth(value_face_rectangle.property("width").toInt32());
  184.                 face2_rectangle.setHeight(value_face_rectangle.property("height").toInt32());

  185.                 if (face2_rectangle.width() <= 0) {
  186.                     break;
  187.                 }
  188.             }
  189.         }

  190.         if (confidence > 0) {
  191.             emit receiveFaceCompare(face1_rectangle, face2_rectangle, confidence);
  192.         }
  193.     }
  194. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
参与人数 1人气 +1 收起 理由
buluorensheng + 1 必须支持!

查看全部评分总评分 : 人气 +1

回复

使用道具 举报

累计签到:29 天
连续签到:1 天
2017-9-18 15:14:08 显示全部楼层
{:soso__4011813854091704040_1:}
回复 支持 反对

使用道具 举报

累计签到:8 天
连续签到:1 天
2017-9-19 14:19:39 显示全部楼层
刘老就是牛,给力给力
回复 支持 反对

使用道具 举报

累计签到:7 天
连续签到:1 天
2017-9-20 14:36:39 显示全部楼层
服你了,就服你,关键是不开源。。。。。
回复 支持 反对

使用道具 举报

累计签到:4 天
连续签到:1 天
2017-11-7 13:07:13 显示全部楼层
写程序像写字一样那么随意
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-12-4 13:07:00 显示全部楼层
您好,请问子线程怎样访问界面线程文本框的文字或者复选框的状态
回复 支持 反对

使用道具 举报

累计签到:12 天
连续签到:1 天
2018-1-3 17:44:06 显示全部楼层
这个望而兴叹了,知识不够
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了