QT5视频抽针并上传(百度windows图像识别)

本文介绍了一个使用百度API进行图像识别的应用案例,包括了如何通过C++与OpenCV处理图像并发送HTTP请求来获取图像标签及其概率的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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\n", 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文竹、文竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值