您现在的位置是:首页 > 正文

QT多媒体简单应用

2024-04-01 05:23:34阅读 3

一、QMediaPlayer类

多媒体(Multimedia)是多种媒体的综合,一般包括文本,声音和图像等多种媒体形式。在计算机系统中,多媒体指组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体。使用的媒体包括文字、图片、照片、声音、动画和影片,以及程式所提供的互动功能。Qt 的多媒体模块提供了音频、视频、录音、摄像头拍照和录像等功能

Qt 多媒体模块提供了很多类, 主要有 QMediaPlayer, QSound、 QSoundEffect、QAudioOutput、QAudioInput、 QAudioRecorder、 QVideoWidget。在 Qt 里使用使用 Qt 多媒体模块,需要在 pro 项目文件里添加如下语句:

QT += multimedia

QMediaPlayer常用函数:

//设置播放的媒体

[slot] void QMediaPlayer::setMedia(const QMediaContent &media, QIODevice *stream = nullptr);

//设置播放列表

void setPlaylist(QMediaPlaylist *playlist);

//播放列表需要设置播放模式,使用播放列表的成员函数设置

void setPlaybackMode(QMediaPlaylist::PlaybackMode mode);

循环播放:QMediaPlaylist::Loop

随机播放:QMediaPlaylist::Random

play() ------- 播放

stop() ------- 停止

pause() ------ 暂停

//当前播放媒体

QMediaContent currentMedia() const;

//设置音量

void setVolume(int volume);

//设置进度

void setPosition(qint64 position);

常用信号:

1.状态改变

[signal] void QMediaPlayer::stateChanged(QMediaPlayer::State state);

多媒体停止状态:QMediaPlayer::StoppedState  0

多媒体运行状态:QMediaPlayer::PlayingState   1

多媒体暂停状态:QMediaPlayer::PauseState     2

2.播放媒体改变(歌曲切换)

[signal] void QMediaPlayer::currentMediaChanged(const QMediaContent &media);

3.播放周期(总长度)改变(歌曲切换)

[signal] void QMediaPlayer::durationChanged(qint64 duration);

4.播放进度改变(快进/快退)

[signal] void QMediaPlayer::positionChanged(qint64 position);

QMediaPlaylist播放列表

1.添加媒体,如歌曲,视频

bool QMediaPlaylist::addMedia(const QMediaContent &content);

2.删除媒体

bool QMediaPlaylist::removeMedia(int pos);

3.清空媒体

bool QMediaPlaylist::clear();

4.设置当前媒体 注意与CurrentRow的区别

[slot] void QMediaPlaylist::setCurrentIndex(int playlistPosition);

若是播放视频,QMediaPlayer提供了成员函数,用来指定视频输出窗口

 使用了视频播放窗口,需要在项目中添加如下内容

//在项目文件中添加

QT += multimedia multimediawidgets

//在头文件中添加

#include <QVideoWidget>

 注意:子窗口全屏播放与恢复

全屏播放:Qt通过子窗口的成员函数showFullScreen实现窗口全屏,但是只允许顶层窗口全屏子窗口如果要全屏必须先升级成顶层窗口

QWidget ------------ setWindowFlags(Qt::Window); //设置为顶层窗口

QWidget ------------ showFullScreen(); //将顶层窗口设置为全屏

恢复播放:子窗口退出全屏,也必须先恢复成子窗口,再通过showNormal成员函数退出全屏

QWidget ------------ setWindowFlags(Qt::SubWindow); //设置为子窗口

QWidget ------------ showNormal(); //子窗口正常显示

二、QTextToSpeech类

Qt5.8开始加入文字转语音的功能,使用QTextToSpeech类,使用该类需要在项目文件中加入texttospeech模块。

QT += texttospeech

使用步骤:

1.选择语音引擎

//获取可支持的语音引擎

[static] QStringList QTextToSpeech::availableEngines();

//构造QTextToSpeech对象可以选择引擎

QTextToSpeech::QTextToSpeech(const QString &engine, QObject *parent = nullptr); 

2.选择语言,声音类型,音量,音调和语速

注意:前两步不操作就使用默认

3.转换

[slot] void QTextToSpeech::say(const QString &text);

//调用系统的语音模块播放文本信息

1. QTextToSpeech tts = new QTextToSpeech(this); //创建对象

2. tts->say(QString("内容")); //要转换的文字

 三、QCamera类

摄像头是视频输入/捕获的硬件,在不同的系统和硬件环境下,可以选择不同的处理方法,主要介绍在windows如何处理摄像头的信息。

在工程中使用QCamera相关操作,需要在工程中添加多媒体模块,多媒体模块中包含了处理摄像头的类

QT += multimedia multimediawidgets

 QCameraInfo(摄像头信息类)

//返回当前系统中可用的摄像头信息:返回摄像头信息的链表

[static] QList<QCameraInfo> QCameraInfo::availableCameras(QCamera::Position position = QCamera::UnspecifiedPosition);

//获取摄像头的描述信息

QString QCameraInfo::description() const;

//获取摄像头的设备名

QString QCameraInfo::deviceName() const;

QCamera(摄像头类)

 //构造函数,两种方式,传入摄像头描述或者设备名

QCamera::QCamera(const QCameraInfo &cameraInfo, QObject *parent = nullptr); QCamera::QCamera(const QByteArray &deviceName, QObject *parent = nullptr);

//设置显示窗口

void QCamera::setViewfinder(QVideoWidget *viewfinder); void QCamera::setViewfinder(QGraphicsVideoItem *viewfinder); void QCamera::setViewfinder(QAbstractVideoSurface *surface);

//槽函数

//开始采集

[slot] void QCamera::start();

//停止采集

[slot] void QCamera::stop();

QCameraImageCapture(摄像头截屏类)

//构造函数:

QCameraImageCapture::QCameraImageCapture(QMediaObject *mediaObject, QObject *parent = nullptr);

//截屏槽函数:参数就是截屏图片的保存路径

[slot] int QCameraImageCapture::capture(const QString &file = QString());

//截屏完成信号,id代表截屏的编号,preview就是截屏的图像

[signal] void QCameraImageCapture::imageCaptured(int id, const QImage &preview);

四、简易音乐播放器

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QListWidgetItem>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_platBtn_clicked();

    void on_stopBtn_clicked();

    void on_pauseBtn_clicked();

    void on_prevBtn_clicked();

    void on_nextBtn_clicked();

    void on_clearBtn_clicked();

    void on_delBtn_clicked();

    void on_addBtn_clicked();

    void on_listWidget_itemDoubleClicked(QListWidgetItem *item);

    void on_verticalSlider_sliderMoved(int position);


    void on_horizontalSlider_sliderMoved(int position);

private:
    Ui::MainWindow *ui;
    QMediaPlayer *player; //播放器
    QMediaPlaylist *playlist;  //播放列表
    QString music_duration;   //记录当前媒体周期

};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    player = new QMediaPlayer(this);
    playlist = new QMediaPlaylist(this);

    //设置播放列表模式
    playlist->setPlaybackMode(QMediaPlaylist::Loop);  //循环模式

    //设置播放器的播放列表
    player->setPlaylist(playlist);

    //周期改变,
    connect(player,&QMediaPlayer::durationChanged,this,[&](quint64 duration){
        //设置进度条的最大值
        ui->horizontalSlider->setRange(0,duration);
        //显示周期
        music_duration = QString("%1:%2").arg(duration/1000/60,2,10,QLatin1Char('0')).arg(duration/1000%60,2,10,QLatin1Char('0'));
        ui->pro->setText(QString("00:00/%1").arg(music_duration));
        //显示切换歌曲
        ui->listWidget->setCurrentRow(playlist->currentIndex());
    });

    //进度改变
    connect(player,&QMediaPlayer::positionChanged,this,[&](quint64 position){
        //更新进度条
        ui->horizontalSlider->setValue(position);
        //qDebug()<<position/1000/60<<":"<<position/1000%60;
        ui->pro->setText(QString("%1:%2/%3").arg(position/1000/60,2,10,QLatin1Char('0')).arg(position/1000%60,2,10,QLatin1Char('0')).arg(music_duration));
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

//播放
void MainWindow::on_platBtn_clicked()
{
    //指定播放文件
    int row = ui->listWidget->currentRow();
    playlist->setCurrentIndex(row);

    //开始播放
    player->play();
    //设置音量
    player->setVolume(ui->verticalSlider->value());


    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(true);

}

//停止
void MainWindow::on_stopBtn_clicked()
{
    player->stop();
    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(false);

}

//暂停 / 继续
void MainWindow::on_pauseBtn_clicked()
{
    if(player->state() == QMediaPlayer::PlayingState)
    {
        player->pause();
        ui->pauseBtn->setText("继续");

    }
    else if(player->state() == QMediaPlayer::PausedState)
    {
        player->play();
        ui->pauseBtn->setText("暂停");
    }
}

//上一首
void MainWindow::on_prevBtn_clicked()
{
    int row = ui->listWidget->currentRow();
    if(row == 0)
    {
        row = ui->listWidget->count()-1;
    }
    else
        row--;

    ui->listWidget->setCurrentRow(row);
    playlist->setCurrentIndex(row);

    player->play();
    player->setVolume(ui->verticalSlider->value());

    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(true);
}

//下一首
void MainWindow::on_nextBtn_clicked()
{
    int row = ui->listWidget->currentRow();
    if(row == ui->listWidget->count()-1)
    {
        row  = 0;
    }
    else
        row++;

    ui->listWidget->setCurrentRow(row);
    playlist->setCurrentIndex(row);

    player->play();
    player->setVolume(ui->verticalSlider->value());

    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(true);

}



void MainWindow::on_clearBtn_clicked()
{
    ui->listWidget->clear();
    playlist->clear();
}

void MainWindow::on_delBtn_clicked()
{
    int row = ui->listWidget->currentRow();
    //取出该项
    QListWidgetItem *item = ui->listWidget->takeItem(row);
    if(item)
    {
        delete item;
    }

    //再删除playList播放列表中的
    playlist->removeMedia(row);

}
//添加音乐
void MainWindow::on_addBtn_clicked()
{
    QStringList music_files =  QFileDialog::getOpenFileNames(this,"选择音乐文件","/home/xiaochao/qt/myMusic","*.mp3 *.WAV");
    //去重
    for(int i = 0;i<ui->listWidget->count();i++)
    {
        for(int j = 0;j<music_files.count();j++)
        {
            if(ui->listWidget->item(i)->text() == music_files.at(j))
            {
                music_files.removeAt(j);
                break;
            }
        }
    }

    //如果无文件添加
    if(music_files.isEmpty())return ;

    //将音乐文件同时添加到playlist播放列表和listWidget显示列表中
    for(int i = 0;i<music_files.count();i++)
    {
        QString file = music_files.at(i);
        playlist->addMedia(QUrl::fromLocalFile(file));
    }
    ui->listWidget->addItems(music_files);
    ui->listWidget->setCurrentRow(0); //定位


}

//双击播放
void MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
    //指定播放文件
    int row = ui->listWidget->currentRow();
    playlist->setCurrentIndex(row);

    //开始播放
    player->play();
    //设置音量
    player->setVolume(ui->verticalSlider->value());


    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(true);
}

//音量调节
void MainWindow::on_verticalSlider_sliderMoved(int position)
{
    player->setVolume(position);
    ui->vol->setText(QString("音量:%1").arg(position)); //更新显示
}

//歌曲进度调节

void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
    player->setPosition(position);
}

运行效果:

 

五、简易视频播放器

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QListWidgetItem>
#include <QVideoWidget> //video专门的播放窗口

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    bool eventFilter(QObject *watched, QEvent *event);

private slots:
    void on_platBtn_clicked();

    void on_stopBtn_clicked();

    void on_pauseBtn_clicked();

    void on_prevBtn_clicked();

    void on_nextBtn_clicked();


    void on_addBtn_clicked();

    void on_delBtn_clicked();

    void on_clearBtn_clicked();

    void on_horizontalSlider_sliderMoved(int position);

    void on_listWidget_itemDoubleClicked(QListWidgetItem *item);

    void on_fullBtn_clicked();

    void on_verticalSlider_sliderMoved(int position);

private:
    Ui::MainWindow *ui;
    QMediaPlayer *player;  //播放器
    QMediaPlaylist *playlist; //播放列表
    QVideoWidget *vw;    //播放窗口
    QString video_duration; //视频的播放时长
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QKeyEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    player = new QMediaPlayer(this);
    playlist = new QMediaPlaylist(this);
    vw = new QVideoWidget(this);
    //安装过滤器:在按下esc时退出全屏
    vw->installEventFilter(this);

    ui->horizontalLayout->addWidget(vw);//将播放视频的窗口添加到布局中
    //设置播放器显示的窗口
    player->setVideoOutput(vw);
    //设置播放列表的播放模式:循环模式
    playlist->setPlaybackMode(QMediaPlaylist::Loop);
    //设置播放器的播放列表
    player->setPlaylist(playlist);

    //周期改变,
    connect(player,&QMediaPlayer::durationChanged,this,[&](quint64 duration){
        //设置进度条的最大值
        ui->horizontalSlider->setRange(0,duration);
        //显示周期
        video_duration = QString("%1:%2:%3").arg(duration/1000/60/60,2,10,QLatin1Char('0'))
                                            .arg(duration/1000/60%60,2,10,QLatin1Char('0'))
                                            .arg(duration/1000%60,2,10,QLatin1Char('0'));
        ui->pro->setText(QString("00:00:00/%1").arg(video_duration));
        //显示切换歌曲
        ui->listWidget->setCurrentRow(playlist->currentIndex());
    });

    //进度改变
    connect(player,&QMediaPlayer::positionChanged,this,[&](quint64 position){
        //更新进度条
        ui->horizontalSlider->setValue(position);
        //qDebug()<<position/1000/60<<":"<<position/1000%60;
        ui->pro->setText(QString("%1:%2:%3/%4").arg(position/1000/60/60,2,10,QLatin1Char('0'))
                         .arg(position/1000/60%60,2,10,QLatin1Char('0'))
                         .arg(position/1000%60,2,10,QLatin1Char('0'))
                         .arg(video_duration));
    });
}


bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyevent = dynamic_cast<QKeyEvent *>(event);
        if(keyevent->key() == Qt::Key_Escape)
        {
            //恢复为子窗口
            vw->setWindowFlag(Qt::SubWindow);
            //退出全屏,正常显示
            vw->showNormal();
            vw->setParent(this);
            ui->horizontalLayout->addWidget(vw);
        }
    }
    return QWidget::eventFilter(watched,event);
}


MainWindow::~MainWindow()
{
    delete ui;
}


//播放视频
void MainWindow::on_platBtn_clicked()
{
    //指定播放文件
    int row = ui->listWidget->currentRow();
    playlist->setCurrentIndex(row);

    //开始播放
    player->play();
    //设置音量
    player->setVolume(ui->verticalSlider->value());


    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(true);
}

void MainWindow::on_stopBtn_clicked()
{
    player->stop();
    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(false);
}

void MainWindow::on_pauseBtn_clicked()
{
    if(player->state() == QMediaPlayer::PlayingState)
    {
        player->pause();
        ui->pauseBtn->setText("继续");

    }
    else if(player->state() == QMediaPlayer::PausedState)
    {
        player->play();
        ui->pauseBtn->setText("暂停");
    }
}

//切换上一个
void MainWindow::on_prevBtn_clicked()
{
    int row = ui->listWidget->currentRow();
    if(row == 0)
    {
        row = ui->listWidget->count()-1;
    }
    else
        row--;

    ui->listWidget->setCurrentRow(row);
    playlist->setCurrentIndex(row);

    player->play();
    player->setVolume(ui->verticalSlider->value());

    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(true);
}

void MainWindow::on_nextBtn_clicked()
{
    int row = ui->listWidget->currentRow();
    if(row == ui->listWidget->count()-1)
    {
        row  = 0;
    }
    else
        row++;

    ui->listWidget->setCurrentRow(row);
    playlist->setCurrentIndex(row);

    player->play();
    player->setVolume(ui->verticalSlider->value());

    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(true);
}



//添加视频
void MainWindow::on_addBtn_clicked()
{
    QStringList video_files =  QFileDialog::getOpenFileNames(this,"选择视频文件","/home/xiaochao/qt/myVideo","*.mp4 *.avi *.mkv");
    //去重
    for(int i = 0;i<ui->listWidget->count();i++)
    {
        for(int j = 0;j<video_files.count();j++)
        {
            if(ui->listWidget->item(i)->text() == video_files.at(j))
            {
                video_files.removeAt(j);
                break;
            }
        }
    }

    //如果无文件添加
    if(video_files.isEmpty())return ;

    //将音乐文件同时添加到playlist播放列表和listWidget显示列表中
    for(int i = 0;i<video_files.count();i++)
    {
        QString file = video_files.at(i);
        playlist->addMedia(QUrl::fromLocalFile(file));
    }
    ui->listWidget->addItems(video_files);
    ui->listWidget->setCurrentRow(0); //定位

}

void MainWindow::on_delBtn_clicked()
{
    int row = ui->listWidget->currentRow();
    //取出该项
    QListWidgetItem *item = ui->listWidget->takeItem(row);
    if(item)
    {
        delete item;
    }

    //再删除playList播放列表中的
    playlist->removeMedia(row);
}

void MainWindow::on_clearBtn_clicked()
{
    ui->listWidget->clear();
    playlist->clear();
}


//双击播放
void MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
    //指定播放文件
    int row = ui->listWidget->currentRow();
    playlist->setCurrentIndex(row);

    //开始播放
    player->play();
    //设置音量
    player->setVolume(ui->verticalSlider->value());


    ui->pauseBtn->setText("暂停");
    ui->pauseBtn->setEnabled(true);
}

void MainWindow::on_fullBtn_clicked()
{
    //vw升级为顶层窗口
    vw->setWindowFlag(Qt::Window);
    //vw全屏
    vw->showFullScreen();
}

void MainWindow::on_verticalSlider_sliderMoved(int position)
{

     player->setVolume(position);
     ui->vol->setText(QString("音量:%1").arg(position)); //更新显示
}

void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
    player->setPosition(position);
}

运行效果:

 

六、简易摄像机

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QCamera>
#include <QCameraInfo>
#include <QVideoWidget>
#include <QCameraImageCapture>  //截屏类

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:

    void on_startBtn_clicked();

    void on_stopBtn_clicked();

    void on_screenBtn_clicked();

private:
    Ui::MainWindow *ui;
    QCamera *ca;     //摄像头对象
    QVideoWidget *vw;  //显示窗口对象
    QCameraImageCapture *cap;//截屏对象
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCameraImageCapture>  //截屏类
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //获取系统可用的摄像头
    QList<QCameraInfo> infos = QCameraInfo::availableCameras();
    //遍历显示
    foreach(QCameraInfo info,infos)
    {
        ui->comboBox->addItem(info.deviceName());
    }

}

MainWindow::~MainWindow()
{
    delete ui;
}



//开始采集
void MainWindow::on_startBtn_clicked()
{
    //摄像头对象
    ca = new QCamera(ui->comboBox->currentText().toUtf8(),this);
    //截屏对象
    cap = new QCameraImageCapture(ca,this);

    //连接截屏成功的信号
    connect(cap,&QCameraImageCapture::imageCaptured,this,[&](int id, const QImage &preview){
        qDebug()<<id;

        QPixmap map = QPixmap::fromImage(preview);
        //保存图片
        QString picpath = QString("D:\\Data\\qt\\mycamera\\%1.jpg").arg(id);
        map.save(picpath);
        map = map.scaled(ui->pic->size());
        ui->pic->setPixmap(map);
    });
    //摄像头显示窗口对象
    vw = new QVideoWidget(ui->widget);
    //调整大小
    vw->resize(ui->widget->size());
    //设置摄像头显示窗口
    ca->setViewfinder(vw);
    vw->show();

    //开始采集
    ca->start();

    ui->startBtn->setEnabled(false);
    ui->stopBtn->setEnabled(true);
    ui->screenBtn->setEnabled(true);

}

//停止采集
void MainWindow::on_stopBtn_clicked()
{
    //停止采集
    ca->stop();
    //隐藏窗口
    vw->show();
    delete ca;
    delete vw;

    ui->startBtn->setEnabled(true);
    ui->stopBtn->setEnabled(false);
    ui->screenBtn->setEnabled(false);

}

//截图
void MainWindow::on_screenBtn_clicked()
{
    cap->capture();
    //cap->capture("D:\\Data\\qt\\mycamera\\1.jpg");//截屏保存的路径,此时不能显示图片,图片还可能没有保存成功
}

运行效果

 

网站文章

  • 开启安全测试评估专业赛道:永信至诚“数字风洞”产品体系战略发布

    开启安全测试评估专业赛道:永信至诚“数字风洞”产品体系战略发布

    11月19日,永信至诚产品战略发布会上,面向安全测试评估领域的“数字风洞”产品体系战略发布,标志着永信至诚作为网络靶场和人才建设领军企业,再次以“产品乘服务”的价值体系,开启网络安全测试评估专业赛道。...

    2024-04-01 05:22:52
  • Mysql中实现批量模糊查询

    在查询条件后面反复添加OR id LIKE CONCAT(’%’,’**’,’%’) AND id LIKE CONCAT(&#39;%&#39;, #{IdStr}, &#39;%&#39;) &amp;

    2024-04-01 05:22:45
  • object detection

    object detection

    1.yolo2.RCNN步骤:1.采用selective search生成候选区域(region proposal)2.将候选区域输入到一个预训练的网络(fine-tuning)3.每个类别训练一个SVM分类器,用regressor对候选框进行回归缺点:时间和内存消耗太大,训练SVM和回归的时候都需要用网络生成的特征作为输入3.Fast R-CNN4.Faster R-CNN[...

    2024-04-01 05:22:37
  • MultiProcess进程池的设计(三)主进程和子进程间的通信

    在前面的章节我们已经详细介绍了多进程的用途及多进程的启动关闭。这个章节是多进程的一个核心章节,主要是介绍多进程的通信。一个大型的平台或者一个大型的系统往往具备一个多个进程,但是有些进程未必是在启动时候就有一定的任务,有时候它会空闲下来,在主进程没有下放任务的时候,子进程会空闲等待。但是在主进程有工作任务的时候,子进程必须要启动,完成相关的操作。    还有在子进程完成任务时候也要告知主进程相关

    2024-04-01 05:21:55
  • pyecharts简单实用,折线图,箱型图,多饼图/玫瑰图,世界图

    pyecharts简单实用,折线图,箱型图,多饼图/玫瑰图,世界图

    pycharts简单使用前言一、折线图二、箱型图三、饼图/玫瑰图四、世界图总结 前言 借一次小项目(小到练手的,嘿嘿),第一次接触到pyecharts,使用感觉嘎嘎舒服,在这里记录一下,一共四张图,折...

    2024-04-01 05:21:47
  • 软件设计七大原则

    软件设计七大原则http://c.biancheng.net/view/8508.html

    2024-04-01 05:21:38
  • Java中的UDP通信(网络编程 一) 最新发布

    Java中使用UDP通信的基本原理

    2024-04-01 05:20:58
  • Spring注入:配置与注解 热门推荐

    之前在某电商公司的时候也接触过一点Spring,不过了解不深,只是大概知道这个东西的存在。现在在一家公司实习的时候,才系统的看了一下Spring,这个框架网上的解释都很多,但主要都会介绍一下关于spring注入这一点,其实spring还有拦截的功能,而spring本身又是可以通过注解来使用,也可以通过配置文件使用,比较复杂,这里粗略介绍spring的注入层面,后面也许会写一篇关于spring MV

    2024-04-01 05:20:51
  • LambdaTest

    LambdaTest

    真机测试

    2024-04-01 05:20:42
  • linux的网卡配置device,linux网卡配置讲解

    ifconfig 网卡名称 (查看网卡信息,不加则为查看所有up状态网卡信息)ifconfig 网卡名称 IP地址/掩码ifdown 网卡名称ifup 网卡名称service network rest...

    2024-04-01 05:20:35