iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Qt结合OpenCV怎么部署yolov5
  • 233
分享到

Qt结合OpenCV怎么部署yolov5

2023-06-29 22:06:08 233人浏览 独家记忆
摘要

本篇内容主要讲解“Qt结合OpenCV怎么部署yolov5”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Qt结合OpenCV怎么部署yolov5”吧!一、新建项目 UI设计二、代码部分 main

本篇内容主要讲解“Qt结合OpenCV怎么部署yolov5”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Qt结合OpenCV怎么部署yolov5”吧!

一、新建项目 UI设计

Qt结合OpenCV怎么部署yolov5

二、代码部分 mainwindow 类

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QFileDialog>#include <QFile>#include <opencv2/opencv.hpp>#include <opencv2/dnn.hpp>#include <QMainWindow>#include <QTimer>#include <QImage>#include <QPixmap>#include <QDateTime>#include <QMutex>#include <QMutexLocker>#include <QMimeDatabase>#include <iOStream>#include <yolov5.h>#include <chrono>#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\opencv\\lib\\opencv_core453.lib")#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\opencv\\lib\\opencv_imGCodecs453.lib")#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\opencv\\lib\\opencv_imgproc453.lib")#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\opencv\\lib\\opencv_videoio453.lib")#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\opencv\\lib\\opencv_objdetect453.lib")#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\opencv\\lib\\opencv_dnn453.lib")#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\deployment_tools\\inference_engine\\lib\\intel64\\Release\\inference_engine.lib")#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\deployment_tools\\inference_engine\\lib\\intel64\\Release\\inference_engine_c_api.lib")#pragma comment(lib,"C:\\Program Files (x86)\\Intel\\openvino_2021\\deployment_tools\\inference_engine\\lib\\intel64\\Release\\inference_engine_transfORMations.lib")//LIBS+= -L "C:\Program Files (x86)\Intel\openvino_2021\opencv\lib\*.lib"//LIBS+= -L "C:\Program Files (x86)\Intel\openvino_2021\deployment_tools\inference_engine\lib\intel64\Release\*.lib"//#ifdef QT_NO_DEBUG//#pragma comment(lib,"C:\Program Files (x86)\Intel\openvino_2021\opencv\lib\opencv_core452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_imgcodecs452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_imgproc452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_imgcodecs452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_video452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_videoio452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_objdetect452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_shape452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_dnn452.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_dnn_objdetect452.lib")//#else//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_core452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_imgcodecs452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_imgproc452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_imgcodecs452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_video452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_videoio452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_objdetect452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_shape452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_dnn452d.lib")//#pragma comment(lib,"E:/opencv_build/install/x64/vc16/lib/opencv_dnn_objdetect452d.lib")//#endif//#ifdef QT_NO_DEBUG//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_core452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_imgcodecs452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_imgproc452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_imgcodecs452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_video452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_videoio452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_objdetect452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_shape452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_dnn452.lib")//#pragma comment(lib,"E:/opencv452_cuda/install/x64/vc16/lib/opencv_dnn_objdetect452.lib")//#endifQPixmap Mat2Image(cv::Mat src);QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = nullptr);    void Init();    ~MainWindow();private slots:    void readFrame(); //自定义信号处理函数    void on_openfile_clicked();    void on_loadfile_clicked();    void on_startdetect_clicked();    void on_stopdetect_clicked();    void on_comboBox_activated(const QString &arg1);private:    Ui::MainWindow *ui;    QTimer *timer;    cv::VideoCapture *capture;    YOLOV5 *yolov5;    NetConfig conf;    NetConfig *yolo_nets;    std::vector<cv::Rect> bboxes;    int IsDetect_ok = 0;};#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    setWindowTitle(QStringLiteral("YoloV5目标检测软件"));    timer = new QTimer(this);    timer->setInterval(33);    connect(timer,SIGNAL(timeout()),this,SLOT(readFrame()));    ui->startdetect->setEnabled(false);    ui->stopdetect->setEnabled(false);    Init();}MainWindow::~MainWindow(){    capture->release();    delete capture;    delete [] yolo_nets;    delete yolov5;    delete ui;}void MainWindow::Init(){    capture = new cv::VideoCapture();    yolo_nets = new NetConfig[4]{                                {0.5, 0.5, 0.5, "yolov5s"},                                {0.6, 0.6, 0.6, "yolov5m"},                                {0.65, 0.65, 0.65, "yolov5l"},                                {0.75, 0.75, 0.75, "yolov5x"}                            };    conf = yolo_nets[0];    yolov5 = new YOLOV5();    yolov5->Initialization(conf);            ui->textEditlog->append(QStringLiteral("默认模型类别:yolov5s args: %1 %2 %3")                                    .arg(conf.nmsThreshold)                                    .arg(conf.objThreshold)                                    .arg(conf.confThreshold));}void MainWindow::readFrame(){    cv::Mat frame;    capture->read(frame);    if (frame.empty()) return;    auto start = std::chrono::steady_clock::now();    yolov5->detect(frame);    auto end = std::chrono::steady_clock::now();    std::chrono::duration<double, std::milli> elapsed = end - start;    ui->textEditlog->append(QString("cost_time: %1 ms").arg(elapsed.count()));//    double t0 = static_cast<double>(cv::getTickCount());//    yolov5->detect(frame);//    double t1 = static_cast<double>(cv::getTickCount());//    ui->textEditlog->append(QStringLiteral("cost_time: %1 ").arg((t1 - t0) / cv::getTickFrequency()));    cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);    QImage rawImage = QImage((uchar*)(frame.data),frame.cols,frame.rows,frame.step,QImage::Format_RGB888);    ui->label->setPixmap(QPixmap::fromImage(rawImage));}void MainWindow::on_openfile_clicked(){    QString filename = QFileDialog::getOpenFileName(this,QStringLiteral("打开文件"),".","*.mp4 *.avi;;*.png *.jpg *.jpeg *.bmp");    if(!QFile::exists(filename)){        return;    }    ui->statusbar->showMessage(filename);    QMimeDatabase db;    QMimeType mime = db.mimeTypeForFile(filename);    if (mime.name().startsWith("image/")) {        cv::Mat src = cv::imread(filename.toLatin1().data());        if(src.empty()){            ui->statusbar->showMessage("图像不存在!");            return;        }        cv::Mat temp;        if(src.channels()==4)            cv::cvtColor(src,temp,cv::COLOR_BGRA2RGB);        else if (src.channels()==3)            cv::cvtColor(src,temp,cv::COLOR_BGR2RGB);        else            cv::cvtColor(src,temp,cv::COLOR_GRAY2RGB);        auto start = std::chrono::steady_clock::now();        yolov5->detect(temp);        auto end = std::chrono::steady_clock::now();        std::chrono::duration<double, std::milli> elapsed = end - start;        ui->textEditlog->append(QString("cost_time: %1 ms").arg(elapsed.count()));        QImage img = QImage((uchar*)(temp.data),temp.cols,temp.rows,temp.step,QImage::Format_RGB888);        ui->label->setPixmap(QPixmap::fromImage(img));        ui->label->resize(ui->label->pixmap()->size());        filename.clear();    }else if (mime.name().startsWith("video/")) {        capture->open(filename.toLatin1().data());        if (!capture->isOpened()){            ui->textEditlog->append("fail to open MP4!");            return;        }        IsDetect_ok +=1;        if (IsDetect_ok ==2)            ui->startdetect->setEnabled(true);        ui->textEditlog->append(QString::fromUtf8("Open video: %1 succesfully!").arg(filename));        //获取整个帧数QStringLiteral        long totalFrame = capture->get(cv::CAP_PROP_FRAME_COUNT);        ui->textEditlog->append(QStringLiteral("整个视频共 %1 帧").arg(totalFrame));        ui->label->resize(QSize(capture->get(cv::CAP_PROP_FRAME_WIDTH), capture->get(cv::CAP_PROP_FRAME_HEIGHT)));        //设置开始帧()        long frameToStart = 0;        capture->set(cv::CAP_PROP_POS_FRAMES, frameToStart);        ui->textEditlog->append(QStringLiteral("从第 %1 帧开始读").arg(frameToStart));        //获取帧率        double rate = capture->get(cv::CAP_PROP_FPS);        ui->textEditlog->append(QStringLiteral("帧率为: %1 ").arg(rate));    }}void MainWindow::on_loadfile_clicked(){    QString onnxFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择模型"),".","*.onnx");    if(!QFile::exists(onnxFile)){        return;    }    ui->statusbar->showMessage(onnxFile);    if (!yolov5->loadModel(onnxFile.toLatin1().data())){        ui->textEditlog->append(QStringLiteral("加载模型失败!"));        return;    }    IsDetect_ok +=1;    ui->textEditlog->append(QString::fromUtf8("Open onnxFile: %1 succesfully!").arg(onnxFile));    if (IsDetect_ok ==2)        ui->startdetect->setEnabled(true);}void MainWindow::on_startdetect_clicked(){    timer->start();    ui->startdetect->setEnabled(false);    ui->stopdetect->setEnabled(true);    ui->openfile->setEnabled(false);    ui->loadfile->setEnabled(false);    ui->comboBox->setEnabled(false);    ui->textEditlog->append(QStringLiteral("================\n"                                           "    开始检测\n"                                           "================\n"));}void MainWindow::on_stopdetect_clicked(){    ui->startdetect->setEnabled(true);    ui->stopdetect->setEnabled(false);    ui->openfile->setEnabled(true);    ui->loadfile->setEnabled(true);    ui->comboBox->setEnabled(true);    timer->stop();    ui->textEditlog->append(QStringLiteral("================\n"                                           "    停止检测\n"                                           "================\n"));}void MainWindow::on_comboBox_activated(const QString &arg1){    if (arg1.contains("s")){        conf = yolo_nets[0];    }else if (arg1.contains("m")) {        conf = yolo_nets[1];    }else if (arg1.contains("l")) {        conf = yolo_nets[2];    }else if (arg1.contains("x")) {        conf = yolo_nets[3];}    yolov5->Initialization(conf);    ui->textEditlog->append(QStringLiteral("使用模型类别:%1 args: %2 %3 %4")                            .arg(arg1)                            .arg(conf.nmsThreshold)                            .arg(conf.objThreshold)                            .arg(conf.confThreshold));}

yolov5类

yolov5.h

#ifndef YOLOV5_H#define YOLOV5_H#include <opencv2/opencv.hpp>#include <opencv2/dnn.hpp>#include <fstream>#include <sstream>#include <iostream>#include <exception>#include <QMessageBox>struct NetConfig{    float confThreshold; // class Confidence threshold    float nmsThreshold;  // Non-maximum suppression threshold    float objThreshold;  //Object Confidence threshold    std::string netname;};class YOLOV5{public:    YOLOV5(){}    void Initialization(NetConfig conf);    bool loadModel(const char* onnxfile);    void detect(cv::Mat& frame);private:    const float anchors[3][6] = {{10.0, 13.0, 16.0, 30.0, 33.0, 23.0}, {30.0, 61.0, 62.0, 45.0, 59.0, 119.0},{116.0, 90.0, 156.0, 198.0, 373.0, 326.0}};    const float stride[3] = { 8.0, 16.0, 32.0 };    std::string classes[80] = {"person", "bicycle", "car", "motorbike", "aeroplane", "bus",                              "train", "truck", "boat", "traffic light", "fire hydrant",                              "stop sign", "parking meter", "bench", "bird", "cat", "dog",                              "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe",                              "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",                              "skis", "snowboard", "sports ball", "kite", "baseball bat",                              "baseball glove", "skateboard", "surfboard", "tennis racket",                              "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl",                              "banana", "apple", "sandwich", "orange", "broccoli", "carrot",                              "hot dog", "pizza", "donut", "cake", "chair", "sofa", "pottedplant",                              "bed", "diningtable", "toilet", "tvmonitor", "laptop", "mouse",                              "remote", "keyboard", "cell phone", "microwave", "oven", "toaster",                              "sink", "refrigerator", "book", "clock", "vase", "scissors",                              "teddy bear", "hair drier", "toothbrush"};    const int inpWidth = 640;    const int inpHeight = 640;    float confThreshold;    float nmsThreshold;    float objThreshold;    cv::Mat blob;    std::vector<cv::Mat> outs;    std::vector<int> classIds;    std::vector<float> confidences;    std::vector<cv::Rect> boxes;    cv::dnn::Net net;    void drawPred(int classId, float conf, int left, int top, int right, int bottom, cv::Mat& frame);    void sigmoid(cv::Mat* out, int length);};static inline float sigmoid_x(float x){    return static_cast<float>(1.f / (1.f + exp(-x)));}#endif // YOLOV5_H

yolov5.cpp

#include "yolov5.h"using namespace std;using namespace cv;void YOLOV5::Initialization(NetConfig conf){    this->confThreshold = conf.confThreshold;    this->nmsThreshold = conf.nmsThreshold;    this->objThreshold = conf.objThreshold;    classIds.reserve(20);    confidences.reserve(20);    boxes.reserve(20);    outs.reserve(3);}bool YOLOV5::loadModel(const char *onnxfile){    try {        this->net = cv::dnn::readNetFromONNX(onnxfile);        return true;    } catch (exception& e) {        QMessageBox::critical(NULL,"Error",QStringLiteral("模型加载出错,请检查重试!\n %1").arg(e.what()),QMessageBox::Yes,QMessageBox::Yes);        return false;    }    this->net.setPreferableBackend(cv::dnn::DNN_BACKEND_INFERENCE_ENGINE);    this->net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);//    this->net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);//    this->net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);//    try {//        this->net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);//        this->net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);//    } catch (exception& e2) {//        this->net.setPreferableBackend(cv::dnn::DNN_BACKEND_DEFAULT);//        this->net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);//        QMessageBox::warning(NULL,"warning",QStringLiteral("正在使用CPU推理!\n %1").arg(e2.what()),QMessageBox::Yes,QMessageBox::Yes);//        return false;//    }}void YOLOV5::detect(cv::Mat &frame){    cv::dnn::blobFromImage(frame, blob, 1 / 255.0, Size(this->inpWidth, this->inpHeight), Scalar(0, 0, 0), true, false);    this->net.setInput(blob);    this->net.forward(outs, this->net.getUnconnectedOutLayersNames());    /generate proposals    classIds.clear();    confidences.clear();    boxes.clear();    float ratioh = (float)frame.rows / this->inpHeight, ratiow = (float)frame.cols / this->inpWidth;    int n = 0, q = 0, i = 0, j = 0, nout = 8 + 5, c = 0;    for (n = 0; n < 3; n++)   ///尺度    {        int num_grid_x = (int)(this->inpWidth / this->stride[n]);        int num_grid_y = (int)(this->inpHeight / this->stride[n]);        int area = num_grid_x * num_grid_y;        this->sigmoid(&outs[n], 3 * nout * area);        for (q = 0; q < 3; q++)    ///anchor数        {            const float anchor_w = this->anchors[n][q * 2];            const float anchor_h = this->anchors[n][q * 2 + 1];            float* pdata = (float*)outs[n].data + q * nout * area;            for (i = 0; i < num_grid_y; i++)            {                for (j = 0; j < num_grid_x; j++)                {                    float box_score = pdata[4 * area + i * num_grid_x + j];                    if (box_score > this->objThreshold)                    {                        float max_class_socre = 0, class_socre = 0;                        int max_class_id = 0;                        for (c = 0; c < 80; c++)  get max socre                        {                            class_socre = pdata[(c + 5) * area + i * num_grid_x + j];                            if (class_socre > max_class_socre)                            {                                max_class_socre = class_socre;                                max_class_id = c;                            }                        }                        if (max_class_socre > this->confThreshold)                        {                            float cx = (pdata[i * num_grid_x + j] * 2.f - 0.5f + j) * this->stride[n];  ///cx                            float cy = (pdata[area + i * num_grid_x + j] * 2.f - 0.5f + i) * this->stride[n];   ///cy                            float w = powf(pdata[2 * area + i * num_grid_x + j] * 2.f, 2.f) * anchor_w;   ///w                            float h = powf(pdata[3 * area + i * num_grid_x + j] * 2.f, 2.f) * anchor_h;  ///h                            int left = (cx - 0.5*w)*ratiow;                            int top = (cy - 0.5*h)*ratioh;   ///坐标还原到原图上                            classIds.push_back(max_class_id);                            confidences.push_back(max_class_socre);                            boxes.push_back(Rect(left, top, (int)(w*ratiow), (int)(h*ratioh)));                        }                    }                }            }        }    }    // Perform non maximum suppression to eliminate redundant overlapping boxes with    // lower confidences    vector<int> indices;    cv::dnn::NMSBoxes(boxes, confidences, this->confThreshold, this->nmsThreshold, indices);    for (size_t i = 0; i < indices.size(); ++i)    {        int idx = indices[i];        Rect box = boxes[idx];        this->drawPred(classIds[idx], confidences[idx], box.x, box.y,            box.x + box.width, box.y + box.height, frame);    }}void YOLOV5::drawPred(int classId, float conf, int left, int top, int right, int bottom, Mat &frame){    rectangle(frame, Point(left, top), Point(right, bottom), Scalar(0, 0, 255), 3);    string label = format("%.2f", conf);    label = this->classes[classId] + ":" + label;    int baseLine;    Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);    top = max(top, labelSize.height);    putText(frame, label, Point(left, top), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 255, 0), 1);}void YOLOV5::sigmoid(Mat *out, int length){    float* pdata = (float*)(out->data);    int i = 0;    for (i = 0; i < length; i++)    {        pdata[i] = 1.0 / (1 + expf(-pdata[i]));    }}

三、效果演示

Qt结合OpenCV怎么部署yolov5

到此,相信大家对“Qt结合OpenCV怎么部署yolov5”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Qt结合OpenCV怎么部署yolov5

本文链接: https://www.lsjlt.com/news/326539.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt结合OpenCV怎么部署yolov5
    本篇内容主要讲解“Qt结合OpenCV怎么部署yolov5”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Qt结合OpenCV怎么部署yolov5”吧!一、新建项目 UI设计二、代码部分 main...
    99+
    2023-06-29
  • Qt结合OpenCV部署yolov5的实现
    目录一、新建项目 UI设计二、代码部分 mainwindow 类三、效果演示分别使用了openvino,opencv_cuda进行加速。 关于演示视频及代码讲解请查看:https:/...
    99+
    2024-04-02
  • YOLOv5模型优化与部署的方法是什么
    今天小编给大家分享一下YOLOv5模型优化与部署的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。模型优化策略在实际...
    99+
    2023-07-05
  • Centos7下部署nginx(三种方式安装部署,图文结合超详细,适合初学者)
    Centos7下部署nginx ngxin是什么 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器, Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-...
    99+
    2023-08-18
    nginx 服务器 运维
  • 怎么用QT+OpenCV实现录屏功能
    这篇“怎么用QT+OpenCV实现录屏功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用QT+OpenCV实现录屏功能...
    99+
    2023-06-26
  • Java结合Vue项目打包并进行服务器部署
    目录Java后端项目打包和服务器部署Vue项目服务器部署两周前我刚刚入职实习的时候,后端的几个同事看到我需要学习如何把项目进行部署,都围过来教我怎么部署,我感觉学习到了很多,因此,记...
    99+
    2024-04-02
  • gphdfs外部表和hive怎么结合使用
    这篇文章主要介绍了gphdfs外部表和hive怎么结合使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、在所有节点上安装java1.6或以上版本二、在segment上安装...
    99+
    2023-06-03
  • QT中的部件怎么使用
    这篇文章主要介绍“QT中的部件怎么使用”,在日常操作中,相信很多人在QT中的部件怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”QT中的部件怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!【1...
    99+
    2023-07-02
  • Qt+OpenCV联合开发中图像的创建与赋值是怎样的
    这篇文章主要为大家分析了Qt+OpenCV联合开发中图像的创建与赋值是怎样的的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Qt+OpenCV联合开发中图像的...
    99+
    2023-06-29
  • Oracle_CDC该怎么部署
    今天就跟大家聊聊有关Oracle_CDC该怎么部署,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.  CDC的实施步骤(异步在线日志)1...
    99+
    2024-04-02
  • Ansible怎么部署Tomcat
    这篇文章主要讲解了“Ansible怎么部署Tomcat”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Ansible怎么部署Tomcat”吧!Ansible的特性:ansible基于Pytho...
    99+
    2023-06-27
  • docker怎么部署fastapi
    这篇文章主要介绍了docker怎么部署fastapi的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇docker怎么部署fastapi文章都会有所收获,下面我们一起来看看吧。项目结构:pycharm结构:拷贝到x...
    99+
    2023-07-05
  • 怎么部署Oracle19c dataguard
    本篇内容介绍了“怎么部署Oracle19c dataguard”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • CentOS7怎么部署L2TP
    这篇文章主要介绍“CentOS7怎么部署L2TP”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CentOS7怎么部署L2TP”文章能帮助大家解决问题。l2tp是一种工业标准的Internet隧道协议...
    99+
    2023-06-27
  • gunicorn怎么部署flask
    Gunicorn部署Flask应用的步骤如下:1、在终端或命令行中输入“pip install gunicorn”命令来安装Gunicorn;2、创建Flask应用;3、在终端或命令行中输入“flask run”命令来启动Flask应用程序...
    99+
    2023-12-19
    Flask gunicorn部署flask gunicorn
  • golang android怎么部署
    随着移动互联网的快速发展,移动应用的开发与管理成为各大企业和开发者的一个重要问题。而在移动应用的开发中,Android系统的应用开发一直处于不断发展的状态。对于许多开发者来说,如何快速高效地部署开发环境也是一个比较烦恼的问题。框架类似于 g...
    99+
    2023-05-14
  • linux golang怎么部署
    这篇文章主要讲解了“linux golang怎么部署”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux golang怎么部署”吧!要在 Linux 系统上部署 Golang 应用程序,...
    99+
    2023-07-06
  • c++怎么结合opencv实现读取多张图片并显示
    这篇文章主要介绍“c++怎么结合opencv实现读取多张图片并显示”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“c++怎么结合opencv实现读取多张图片并显示”文章能帮助大家解决问题。方法一主要函...
    99+
    2023-07-04
  • windows golang怎么部署
    Go语言是一种由谷歌公司开发推出的开源编程语言。自推出以来,它以其高效、稳定和安全的特性,迅速成为了开发者喜爱的语言之一。在Windows平台上,如何将Golang部署在服务器上呢?下面我们来详细介绍。一、环境准备在部署Golang之前,需...
    99+
    2023-05-14
  • golang怎么部署docker
    随着近年来容器化技术的火热,Docker也成为了越来越多开发者、运维人员、IT从业者等的必备工具。而Golang语言的高并发优势也让它成为了不少开发者使用的首选语言。那么,如何将Golang应用部署到Docker容器中呢?本文将为大家介绍g...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作