zoukankan      html  css  js  c++  java
  • QT5视频抽针并上传(百度windows图像识别)

    #pragma once
    #include <QObject>
    #include <QEventLoop>
    #include <opencv2/opencv.hpp>
    #include <opencv2/core/core.hpp>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QNetworkReply>
    #include <QHttpPart>
    #include <opencv2/imgproc/types_c.h>
    #include <opencv2/imgproc/imgproc_c.h>
    #include <opencv2/imgcodecs/legacy/constants_c.h>
    
    struct baiduData {
        QString label;
        int prob;
    };
    
    class baiduapi : public QObject
    {
        Q_OBJECT
    public:
        baiduapi();
        baiduData run(cv::Mat img);
    
    private:
        QString m_strServerAddr =  "http://192.168.1.54:24401?threshold=0.15";
    };
    #include "baiduapi.h"
    #include <QUrlQuery>
    #include <QFile>
    #include <QUuid>
    #include <QJsonParseError>
    #include <QJsonObject>
    #include <QJsonArray>
    #include <QJsonValue>
    #include <QJsonDocument>
    #include <QDebug>
    #include <vector>
    
    baiduapi::baiduapi()
    {}
    
    baiduData baiduapi::run(cv::Mat img)
    {
        QNetworkAccessManager* m_pNetWorkManager = new QNetworkAccessManager();
    
        baiduData info;
        if (m_strServerAddr.isEmpty()) {
            return info;
        }
    
        std::vector<uchar> buff;
        std::vector<int> param = std::vector<int>(2);
        param[0] = CV_IMWRITE_JPEG_QUALITY;
        param[1] = 95;
        cv::imencode(".jpg", img, buff, param);
        unsigned char* tem = &*buff.begin();
        const char* temp1 = reinterpret_cast<const char*>(tem);
        QByteArray sb = QByteArray(temp1, buff.size());
    
        QNetworkRequest request;
    
        request.setUrl(m_strServerAddr);
    
        request.setRawHeader(QString("Content-Type").toLatin1(), QString("application/octet-stream").toLatin1());
        QNetworkReply* reply = m_pNetWorkManager->post(request, sb);
    
        QEventLoop eventLoop;
        connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
        eventLoop.exec();
        /// 错误处理
        if (reply->error() == QNetworkReply::NoError)
        {
            //qDebug() << "request protobufHttp NoError";
        }
        else
        {
            qDebug() << "request protobufHttp handle errors here";
            QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
            //statusCodeV是HTTP服务器的相应码,reply->error()是Qt定义的错误码,可以参考QT的文档
            qDebug("request protobufHttp found error ....code: %d %d
    ", statusCodeV.toInt(), (int)reply->error());
            //qDebug(qPrintable(reply->errorString()));
        }
        /// 请求返回的结果
        QByteArray responseByte = reply->readAll();
        QJsonParseError jsonpe;
        QJsonDocument json = QJsonDocument::fromJson(responseByte, &jsonpe);
        if (jsonpe.error == QJsonParseError::NoError)
        {
            if (json.isObject())
            {
                QJsonObject obj = json.object();
                if (obj.contains("results"))
                {
                    QJsonObject::Iterator it;
                    QJsonArray results = obj["results"].toArray();
                    if (results.count() > 0) {
                        //qDebug() << obj["results"].toString();
                        qDebug() << QByteArray::fromPercentEncoding(responseByte).data();
                    }
                    for (int i = 0;i< results.count();i++)
                    {
                        //将value转成QJsonArray或QJsonObject,继续遍历
                        QJsonObject item = results[i].toObject();
    
                        if (item.contains("label")&&item["label"] == "211")
                        {
                            QJsonValue conf = item["confidence"];
                            double probs = conf.toDouble()*100;
                            info.prob = static_cast<int>(probs);
                            info.label = item["label"].toString();
                        }
                    }
                }
            }
            else
            {
                qDebug() << "error, shoud json object";
            }
        }
        else
        {
            qDebug() << "error:" << jsonpe.errorString();
        }
        return info;
    }
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/yamboo/p/13889579.html
Copyright © 2011-2022 走看看