案例分享:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)

简介: 案例分享:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)

需求

  1. 屏幕分辨率1920 x 1080;

  2. 白平衡、冻结、自动背光、自动光源等功能;’

  2. 拍照功能,可设置拍照路径(U盘,SD卡,内置存储);

  3. 录像功能,可设置录像路径(U盘,SD卡,内置存储);

  4. 亮度调整,摄像头光源亮度调整;

  5. 物理按键,包括拍照、录像、上下左右、菜单、默认亮度、选择等等;

  6. 定制开机界面;

  7. 照片、视频九宫格浏览控件;

  8. 照片浏览器;

  9. 视频播放器;

  10. 可查看照片、视频同时支持按键对照片和视频的操作;

  11. 对存储控件的资源浏览器控件’,并可对其复制、粘贴、删除等操作;

  12. 设置时间日期,仿苹果滑动效果;

  13. 其他各种定制控件;

注意

  受限于成本(方案整体成本,较同行业较低),不断压缩的成本,导致该产品的出现关键难点,其在于fpga上的仿arm跑linux的芯片性能等同于2011年的arm水平,经过fpga+arm+qt三方的代码优化和内存优化。’


相关博客

  《案例分享:Qt+Arm基于RV1126平台的内窥镜软硬整套解决方案(实时影像、冻结、拍照、录像、背光调整、硬件光源调整,其他产品也可使用该平台,如视频监控,物联网产品等等)


关于定制

  支持相关的软硬shang业定制(非shang业勿扰,无ye务不讨论技术细节)


Demo

  

  

  

  

  

软件界面

  

  

  

  

  


关键代码

EndoscopeWidget.h

#ifndef ENDOSCOPEWIDGET_H
#define ENDOSCOPEWIDGET_H
#include <QWidget>
#include <QButtonGroup>
#include <QThread>
#include <QLabel>
#ifdef LINUX
#include "X264Manager.h"
extern "C" {
    #include "fpga_comm_app.h"
    #include "common.h"
}
#endif
#ifndef LINUX
#define LOCAL_DIR       ("local")
#define USB1_DIR        ("usb1")        // usb
#define USB2_DIR        ("usb2")        // usb默认路径
#endif
#define PICTURE_DIR     ("Picture")
#define VIDEO_DIR       ("Video")
#define DEBUG_X264_SRC   (1)    // 1 - 模拟数据源测试x264, 0 - 使用fpga数据源操作x264库
#define DEBUG_SAVE_PATH  (1)    // 1 - 存储到应用目录下(arm、pc均可用), 0 - 存储到U盘(必须在arm上)
#define MKDIR_USE_SHELL  (1)    // 1 - 使用mkdir创建目录, 0 - 使用qt自带的创建目录(建议使用1)
#define SKIP_FRAMES      (0)    // 1 - 是跳帧编码, 0 - 不跳帧
#define SKIP_NUM         (0)    // 跳帧时有用,当前帧数 % SKIP_NUM== 0时跳帧
#define X264_USE_THREAD  (0)    // 1 - x264编码使用另外的线程(需要拷贝缓存), 0 - 主线程直接调用
#define CFG_FILE         ("cfg") // 配置文件
namespace Ui {
class EndoscopeWidget;
}
class EndoscopeWidget : public QWidget
{
    Q_OBJECT
public:
    enum LANGUAGE_TYPE {        // 语言类型
        LANGUAGE_TYPE_CHINESE_SIMPLE = 0x00,
        LANGUAGE_TYPE_ENGLISH,
        LANGUAGE_TYPE_CHINESE_TRADITION
    };
    enum SAVE_LOCATION {        // 存储位置
        SAVE_LOCATION_LOCAL = 0x00,
        SAVE_LOCATION_USB1,
        SAVE_LOCATION_USB2
    };
    enum FUNCTION_TYPE {        // 功能类型
        FUNCTION_TYPE_NO_USE = 0x00,
        FUNCTION_TYPE_PHTOTO,
        FUNCTION_TYPE_RECORD,
        FUNCTION_TYPE_FREEZE,
        FUNCTION_TYPE_WHITE_BALANCE_CORRECT
    };
public:
    explicit EndoscopeWidget(QWidget *parent = 0);
    ~EndoscopeWidget();
signals:
    void signal_recvYuv(QByteArray byteArray);
protected:
    void addFont();                                             // 添加字体
    void loadCfg();                                             // 加载配置文件
    void saveCfg();                                             // 存储配置文件
    void updateDate();                                          // 更新日期
    void updateLocateState();                                   // 更新本地local位置使能
    void mkdir(QString currentDir);                             // 切换存储的时候需要创建文件夹
protected:
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);
protected slots:
    void slot_labelInfoTimeOut();
protected slots:
    void slot_backgroundLightBrightnessValueChanged(int value);
    void slot_lightSourceBrightnessValueChanged(int value);
protected slots:
    void slot_dateChanged();                                    // 日期改变更新
    void slot_languageButtonClicked(QAbstractButton *pBtn);     // 语言按钮(中文简体、English、中文繁体)
    void slot_locateLocationClicked(QAbstractButton *pBtn);     // 存储位置(本机、USB1,USB2)
    void slot_key1ButtonClicked(QAbstractButton *pBtn);         // 按键一功能(不用、拍照、录像、冻结、白平衡校正)
    void slot_key2ButtonClicked(QAbstractButton *pBtn);         // 按键二功能(不用、拍照、录像、冻结、白平衡校正)
    void slot_doubleClickedVideoFile(QString filePath);         // 双击选中视频文件
private slots:                                                  // 左侧菜单
    void on_pushButton_photograph_clicked();                    // 拍照
    void on_pushButton_record_clicked(bool checked);            // 录像
    void on_pushButton_freezeScreen_clicked(bool checked);      // 冻结
    void on_pushButton_whiteBalanceCorrect_clicked();           // 白平衡校正
    void on_pushButton_defaultLight_clicked();                  // 默认亮度
    void on_pushButton_photoSee_clicked();                      // 图片查看
private slots:                                                  // 右侧菜单
    void on_pushButton_lightSourceSet_clicked();                // 光源亮度设置
    void on_pushButton_dateSet_clicked();                       // 时间日期设置
    void on_pushButton_languageSet_clicked();                   // 语言设置
    void on_pushButton_key1Set_clicked();                       // 按键一设置
    void on_pushButton_key2Set_clicked();                       // 按键二设置
    void on_pushButton_backgroundLightSet_clicked();            // 背光亮度设置
    void on_pushButton_photoVideoSet_clicked();                 // 照片/录像文件设置
    void on_pushButton_set_clicked(bool checked);               // 设置返回
private slots:                                                  // 文件操作:左侧操作图片菜单
    void on_pushButton_delete_clicked();                        // 文件操作:删除
    void on_pushButton_selectAll_clicked();                     // 文件操作:选择所有
    void on_pushButton_copy_clicked();                          // 文件操作:复制
    void on_pushButton_paste_clicked();                         // 文件操作:粘贴
    void on_pushButton_back_clicked();                          // 文件操作:返回
private slots:
    void on_pushButton_startPlay_clicked();                     // 播放器:播放
    void on_pushButton_pause_clicked();                         // 播放器:暂停
    void on_pushButton_resume_clicked();                        // 播放器:恢复
    void on_pushButton_stop_clicked();                          // 播放器:停止
    void on_pushButton_playerBack_clicked();                    // 播放器:返回
private:
    Ui::EndoscopeWidget *ui;
    QList<QString> _listCopyFile;                               // 复制的文件列表
    QButtonGroup _buttonGroupLanguage;                          // 语言选择
    QButtonGroup _buttonGroupKey1Function;                      // 按键1功能
    QButtonGroup _buttonGroupKey2Function;                      // 按键2功能
    QButtonGroup _buttonLocation;                               // 存储位置
    QString _filePath;                                          // 播放地址
    bool _isLoopSaveImageIndex;
    int _imageIndex;                                            // 当天拍照的序号(从0开始)
    bool _isLoopSaveVideoIndex;
    int _videoIndex;                                            // 当天录像的序号(从0开始)
    QString _cfgFile;                                           // 配置文件
    LANGUAGE_TYPE _language;                                    // 当前语言
    SAVE_LOCATION _saveLocation;                                // 当前存储位置
    FUNCTION_TYPE _key1Function;                                // 按键1功能
    FUNCTION_TYPE _key2Function;                                // 按键2功能
    int _backgroundLightBrightness;                             // 背光亮度
    int _lightSourceBrightness;                                 // 光源亮度
    QString _storeDir;
    QString _photoDir;                                          // 辅助变量:当前拍照文件夹
    QString _videoDir;                                          // 辅助变量:当前视频文件夹
    QString _fileName;                                          // 辅助变量:存储文件名称
#ifdef LINUX
    static QThread *_pX264ManagerThread;                        // x264视频编码线程
    static X264Manager *_pX264Manager;                          // x264管理类
    static int _index;
private:
    QTimer *_pTimer;
protected slots:
    void slot_timeOut();
public:
    static bool _recording;
    static int fpga_com_read_record_data_handler_t(char *buffer, int length);
#endif
    QTimer *_pTimerInfo;                                        // 计时器用于显示
    QLabel *_pLabelRecIcon;                                     // 图标
    QLabel *_pLabelRecord;                                      // 图标
    QLabel *_pLabelInfo;                                        // 提示Label
};
#endif // ENDOSCOPEWIDGET_H

EndoscopeWidget.cpp

#include "EndoscopeWidget.h"
#include "ui_EndoscopeWidget.h"
#include <QStyleOption>
#include <QPaintEvent>
#include <QPainter>
#include <QDebug>
#include <QDate>
#include <QFontDatabase>
#include <QButtonGroup>
#include <QProcess>
#include <QMessageBox>
#include "DateTime2Widget.h"
//#include "JpegManager.h"
#ifdef LINUX
QThread *EndoscopeWidget::_pX264ManagerThread = 0;
X264Manager *EndoscopeWidget::_pX264Manager = 0;
bool EndoscopeWidget::_recording = false;
int EndoscopeWidget::_index = 0;
#endif
EndoscopeWidget::EndoscopeWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::EndoscopeWidget),
    _imageIndex(1),
    _isLoopSaveImageIndex(false),
    _videoIndex(1),
    _cfgFile(CFG_FILE),                     // 配置文件
    _language(LANGUAGE_TYPE_CHINESE_SIMPLE),// 默认语言(未加载配置文件之前)
    _saveLocation(SAVE_LOCATION_LOCAL),     // 默认存储在本地(未加载配置文件之前)
    _key1Function(FUNCTION_TYPE_NO_USE),    // 默认按键1无功能(未加载配置文件之前)
    _key2Function(FUNCTION_TYPE_NO_USE),    // 默认按键2无功能(未加载配置文件之前)
    _backgroundLightBrightness(3),
    _lightSourceBrightness(9),
    _pLabelRecIcon(0),
    _pLabelRecord(0),
    _pLabelInfo(0),
    _pTimerInfo(0),
#ifdef LINUX
    _pTimer(0),
#endif
    _isLoopSaveVideoIndex(false)
{
    ui->setupUi(this);
    // 加载配置文件
    loadCfg();
    // 加入自带的字体 “Roboto-Condensed”
    addFont();
    // rec图标和提示信息
    {
        _pLabelRecIcon = new QLabel(this);
        _pLabelRecIcon->setStyleSheet("border-image: url(:/images/recIcon.png);");
        _pLabelRecIcon->show();
        _pLabelRecord = new QLabel(this);
        _pLabelRecord->setStyleSheet("border-image: url(:/images/rec.png);");
        _pLabelRecord->show();
        _pLabelInfo = new QLabel(this);
        _pLabelInfo->setStyleSheet("font: 14px \"思源黑体\"; color: rgb(210,210,210);");
        _pLabelInfo->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
        _pLabelInfo->hide();
        _pTimerInfo = new QTimer();
        _pTimerInfo->setInterval(1500);
        connect(_pTimerInfo, SIGNAL(timeout()), this, SLOT(slot_labelInfoTimeOut()));
    }
    // 初始化图像控件的默认存储地址(无需加载)
    {
//        ui->widget_camera->setPhotoDir(QString("%1/%2").arg(LOCAL_DIR).arg(PICTURE_DIR));
//        ui->widget_camera->setRecordDir(QString("%1/%2").arg(LOCAL_DIR).arg(VIDEO_DIR));
    }
    // 初始化按钮(拍照、录像、触屏冻结、白平衡校正、默认亮度、照片查看)
    {
        // 初始化按钮的图标区域
        int iconWidth = 60;
        int iconHeight = 60;
        int iconCenterX = 46;
        int iconCenterY = 63;
        QRect iconRect(iconCenterX - iconWidth / 2, iconCenterY - iconHeight / 2, iconWidth, iconHeight);
        // 初始化按钮的文字区域
        int textWidht = 236;
        int textheight = 60;
        int textCenterX = 168;
        int textCenterY = 63;
        QRect textRect(textCenterX - textWidht / 2, textCenterY - textheight / 2, textWidht, textheight);
        // 初始化按钮的字体
        QFont font = QFont();
        font.setFamily("思源黑体 CN Normal");
        font.setPixelSize(36);
        // 拍照
        ui->pushButton_photograph->setIconPixmap(QPixmap(":/images/photograph.png"));
        ui->pushButton_photograph->setIconPixmapPressed(QPixmap(":/images/photograph_pressed.png"));
        ui->pushButton_photograph->setIconPixmapDisable(QPixmap(":/images/photograph_disabled.png"));
        ui->pushButton_photograph->setIconPixmapRect(iconRect);
        ui->pushButton_photograph->setText(tr("拍照"));
        ui->pushButton_photograph->setTextRect(textRect);
        ui->pushButton_photograph->setFont(font);
        // 录像
        ui->pushButton_record->setIconPixmap(QPixmap(":/images/record.png"));
        ui->pushButton_record->setIconPixmapPressed(QPixmap(":/images/record_pressed.png"));
        ui->pushButton_record->setIconPixmapDisable(QPixmap(":/images/record_disabled.png"));
        ui->pushButton_record->setIconPixmapRect(iconRect);
        ui->pushButton_record->setText(tr("录像"));
        ui->pushButton_record->setTextRect(textRect);
        ui->pushButton_record->setFont(font);
        // 触屏冻结
        ui->pushButton_freezeScreen->setIconPixmap(QPixmap(":/images/freezeScreen.png"));
        ui->pushButton_freezeScreen->setIconPixmapPressed(QPixmap(":/images/freezeScreen_pressed.png"));
        ui->pushButton_freezeScreen->setIconPixmapDisable(QPixmap(":/images/freezeScreen_disabled.png"));
        ui->pushButton_freezeScreen->setIconPixmapRect(iconRect);
        ui->pushButton_freezeScreen->setText(tr("触屏冻结"));
        ui->pushButton_freezeScreen->setTextRect(textRect);
        ui->pushButton_freezeScreen->setFont(font);
        // 白平衡校正
        ui->pushButton_whiteBalanceCorrect->setIconPixmap(QPixmap(":/images/whiteBalanceCorrect.png"));
        ui->pushButton_whiteBalanceCorrect->setIconPixmapPressed(QPixmap(":/images/whiteBalanceCorrect_pressed.png"));
        ui->pushButton_whiteBalanceCorrect->setIconPixmapDisable(QPixmap(":/images/whiteBalanceCorrect_disabled.png"));
        ui->pushButton_whiteBalanceCorrect->setIconPixmapRect(iconRect);
        ui->pushButton_whiteBalanceCorrect->setText(tr("白平衡校正"));
        ui->pushButton_whiteBalanceCorrect->setTextRect(textRect);
        ui->pushButton_whiteBalanceCorrect->setFont(font);
        // 默认亮度
        ui->pushButton_defaultLight->setIconPixmap(QPixmap(":/images/defaultLight.png"));
        ui->pushButton_defaultLight->setIconPixmapPressed(QPixmap(":/images/defaultLight_pressed.png"));
        ui->pushButton_defaultLight->setIconPixmapDisable(QPixmap(":/images/defaultLight_disabled.png"));
        ui->pushButton_defaultLight->setIconPixmapRect(iconRect);
        ui->pushButton_defaultLight->setText(tr("默认亮度"));
        ui->pushButton_defaultLight->setTextRect(textRect);
        ui->pushButton_defaultLight->setFont(font);
        // 照片查看
        ui->pushButton_photoSee->setIconPixmap(QPixmap(":/images/photoSee.png"));
        ui->pushButton_photoSee->setIconPixmapPressed(QPixmap(":/images/photoSee_pressed.png"));
        ui->pushButton_photoSee->setIconPixmapDisable(QPixmap(":/images/photoSee_disabled.png"));
        ui->pushButton_photoSee->setIconPixmapRect(iconRect);
        ui->pushButton_photoSee->setText(tr("照片查看"));
        ui->pushButton_photoSee->setTextRect(textRect);
        ui->pushButton_photoSee->setFont(font);
    }
    // 初始化按钮(删除、复制、粘贴、选择、返回)
    {
        int iconWidth2 = 40;
        int iconHeight2 = 40;
        int iconCenterX2 = 80;
        int iconCenterY2 = 63;
        QRect iconRect2(iconCenterX2 - iconWidth2 / 2, iconCenterY2 - iconHeight2 / 2, iconWidth2, iconHeight2);
        // 初始化按钮的文字区域
        int textWidht = 236;
        int textheight = 60;
        int textCenterX = 170;
        int textCenterY = 63;
        QRect textRect(textCenterX - textWidht / 2, textCenterY - textheight / 2, textWidht, textheight);
        // 初始化按钮的字体
        QFont font = QFont();
        font.setFamily("思源黑体 CN Normal");
        font.setPixelSize(32);
        // 删除
        ui->pushButton_delete->setIconPixmap(QPixmap(":/images/delete.png"));
        ui->pushButton_delete->setIconPixmapPressed(QPixmap(":/images/delete_pressed.png"));
        ui->pushButton_delete->setIconPixmapDisable(QPixmap(":/images/delete_disabled.png"));
        ui->pushButton_delete->setIconPixmapRect(iconRect2);
        ui->pushButton_delete->setText(tr("删 除"));
        ui->pushButton_delete->setTextRect(textRect);
        ui->pushButton_delete->setFont(font);
        // 全选
        ui->pushButton_selectAll->setIconPixmap(QPixmap(":/images/selectAll.png"));
        ui->pushButton_selectAll->setIconPixmapPressed(QPixmap(":/images/selectAll_pressed.png"));
        ui->pushButton_selectAll->setIconPixmapDisable(QPixmap(":/images/selectAll_disabled.png"));
        ui->pushButton_selectAll->setIconPixmapRect(iconRect2);
        ui->pushButton_selectAll->setText(tr("全 选"));
        ui->pushButton_selectAll->setTextRect(textRect);
        ui->pushButton_selectAll->setFont(font);
        // 复制
        ui->pushButton_copy->setIconPixmap(QPixmap(":/images/copy.png"));
        ui->pushButton_copy->setIconPixmapPressed(QPixmap(":/images/copy_pressed.png"));
        ui->pushButton_copy->setIconPixmapDisable(QPixmap(":/images/copy_disabled.png"));
        ui->pushButton_copy->setIconPixmapRect(iconRect2);
        ui->pushButton_copy->setText(tr("复 制"));
        ui->pushButton_copy->setTextRect(textRect);
        ui->pushButton_copy->setFont(font);
        // 粘贴
        ui->pushButton_paste->setIconPixmap(QPixmap(":/images/paste.png"));
        ui->pushButton_paste->setIconPixmapPressed(QPixmap(":/images/paste_pressed.png"));
        ui->pushButton_paste->setIconPixmapDisable(QPixmap(":/images/paste_disabled.png"));
        ui->pushButton_paste->setIconPixmapRect(iconRect2);
        ui->pushButton_paste->setText(tr("粘 贴"));
        ui->pushButton_paste->setTextRect(textRect);
        ui->pushButton_paste->setFont(font);
        // 返回
        ui->pushButton_back->setIconPixmap(QPixmap(":/images/back.png"));
        ui->pushButton_back->setIconPixmapPressed(QPixmap(":/images/back_pressed.png"));
        ui->pushButton_back->setIconPixmapDisable(QPixmap(":/images/delete_disabled.png"));
        ui->pushButton_back->setIconPixmapRect(iconRect2);
        ui->pushButton_back->setText(tr("返 回"));
        ui->pushButton_back->setTextRect(textRect);
        ui->pushButton_back->setFont(font);
    }
    // 初始化按钮(播放、暂停、恢复、停止、返回)
    {
        // 初始化按钮的文字区域
        int textWidht = 236;
        int textheight = 60;
        int textCenterX = 170;
        int textCenterY = 63;
        QRect textRect(textCenterX - textWidht / 2, textCenterY - textheight / 2, textWidht, textheight);
        // 初始化按钮的字体
        QFont font = QFont();
        font.setFamily("思源黑体 CN Normal");
        font.setPixelSize(32);
        // 播放
        ui->pushButton_startPlay->setText(tr("播 放"));
        ui->pushButton_startPlay->setTextRect(textRect);
        ui->pushButton_startPlay->setFont(font);
        // 暂停
        ui->pushButton_pause->setText(tr("暂 停"));
        ui->pushButton_pause->setTextRect(textRect);
        ui->pushButton_pause->setFont(font);
        // 恢复
        ui->pushButton_resume->setText(tr("恢 复"));
        ui->pushButton_resume->setTextRect(textRect);
        ui->pushButton_resume->setFont(font);
        // 停止
        ui->pushButton_stop->setText(tr("停 止"));
        ui->pushButton_stop->setTextRect(textRect);
        ui->pushButton_stop->setFont(font);
        // 返回
        ui->pushButton_playerBack->setText(tr("返 回"));
        ui->pushButton_playerBack->setTextRect(textRect);
        ui->pushButton_playerBack->setFont(font);
    }
    // 初始化按钮(设置)
    {
        int iconWidth2 = 34;
        int iconHeight2 = 34;
        int iconCenterX2 = 256;
        int iconCenterY2 = 46;
        QRect iconRect2(iconCenterX2 - iconWidth2 / 2, iconCenterY2 - iconHeight2 / 2, iconWidth2, iconHeight2);
        // 初始化按钮的文字区域
        QRect textRect = ui->pushButton_set->rect();
        // 初始化按钮的字体
        QFont font = QFont();
        font.setFamily("思源黑体 CN Normal");
        font.setPixelSize(36);
        ui->pushButton_set->setIconPixmap(QPixmap(":/images/back.png"));
        ui->pushButton_set->setIconPixmapPressed(QPixmap(":/images/back_pressed.png"));
        ui->pushButton_set->setIconPixmapDisable(QPixmap(":/images/back_pressed.png"));
        ui->pushButton_set->setIconPixmapRect(iconRect2);
        ui->pushButton_set->setText(tr("设置选项"));
        ui->pushButton_set->setTextRect(textRect);
        ui->pushButton_set->setFont(font);
    }
    // 初始化各区域显示界面
    {
        ui->stackedWidget_leftKeys->setCurrentIndex(0);
        ui->stackedWidget_center->setCurrentIndex(0);
        ui->stackedWidget_rightKeys->setCurrentIndex(0);
    }
    // 用于模拟,打开usb摄像头
    {
        ui->widget_camera->open(0);
    }
    // 背景亮度改为4级(0,1,2,3)(默认为9级,0~8)
    {
        QFont font = ui->widget_backgroundLightSlider->getFont();
        font.setFamily("思源黑体 CN Normal");
        font.setPixelSize(32);
        ui->widget_backgroundLightSlider->setAddPixmap(QPixmap(":/images/add.png"));
        ui->widget_backgroundLightSlider->setAddPixmapPressed(QPixmap(":/images/add_pressed.png"));
        ui->widget_backgroundLightSlider->setDecPixmap(QPixmap(":/images/dec.png"));
        ui->widget_backgroundLightSlider->setDecPixmapPressed(QPixmap(":/images/dec_pressed.png"));
        ui->widget_backgroundLightSlider->setFont(font);
        ui->widget_backgroundLightSlider->setMinValue(0);
        ui->widget_backgroundLightSlider->setMaxValue(3);
        ui->widget_backgroundLightSlider->setValue(_backgroundLightBrightness);
        ui->widget_backgroundLightSlider->setBackgroundPixmap(QPixmap(":/sliderWidget/images/background.png"));
        connect(ui->widget_backgroundLightSlider, SIGNAL(signal_valueChanged(int)),
                this, SLOT(slot_backgroundLightBrightnessValueChanged(int)));
    }
    // 光源亮度9级别(0,1,2,3,4,5,6,7,8,9)
    {
        QFont font = ui->widget_backgroundLightSlider->getFont();
        font.setFamily("思源黑体 CN Normal");
        font.setPixelSize(32);
        ui->widget_lightSourceSlider->setAddPixmap(QPixmap(":/images/add.png"));
        ui->widget_lightSourceSlider->setAddPixmapPressed(QPixmap(":/images/add_pressed.png"));
        ui->widget_lightSourceSlider->setDecPixmap(QPixmap(":/images/dec.png"));
        ui->widget_lightSourceSlider->setDecPixmapPressed(QPixmap(":/images/dec_pressed.png"));
        ui->widget_lightSourceSlider->setFont(font);
        ui->widget_lightSourceSlider->setMinValue(0);
        ui->widget_lightSourceSlider->setMaxValue(9);
        ui->widget_lightSourceSlider->setValue(_lightSourceBrightness);
        ui->widget_lightSourceSlider->setBackgroundPixmap(QPixmap(":/sliderWidget/images/ligthSourceBackground.png"));
        connect(ui->widget_lightSourceSlider, SIGNAL(signal_valueChanged(int)),
                this, SLOT(slot_lightSourceBrightnessValueChanged(int)));
    }
    // 语言选择
    {
        _buttonGroupLanguage.addButton(ui->pushButton_chineseSimple);
        _buttonGroupLanguage.addButton(ui->pushButton_english);
        _buttonGroupLanguage.addButton(ui->pushButton_chineseTradition);
        connect(&_buttonGroupLanguage, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(slot_languageButtonClicked(QAbstractButton*)));
        switch (_language)
        {
        case LANGUAGE_TYPE_CHINESE_SIMPLE:
            ui->pushButton_chineseSimple->setChecked(true);
            break;
        case LANGUAGE_TYPE_ENGLISH:
            ui->pushButton_english->setChecked(true);
            break;
        case LANGUAGE_TYPE_CHINESE_TRADITION:
            ui->pushButton_chineseTradition->setChecked(true);
            break;
        default:
            break;
        }
    }
    // 按键1和2的功能
    {
        // 按键1的功能按钮
        {
            ui->pushButton_key1NoUse->setText(tr("不使用"));
            ui->pushButton_key1Photo->setText(tr("拍照"));
            ui->pushButton_key1Record->setText(tr("录像"));
            ui->pushButton_key1Freeze->setText(tr("冻结"));
            ui->pushButton_key1WhiteBalanceCorrect->setText(tr("白平衡校准"));
            _buttonGroupKey1Function.addButton(ui->pushButton_key1NoUse);
            _buttonGroupKey1Function.addButton(ui->pushButton_key1Photo);
            _buttonGroupKey1Function.addButton(ui->pushButton_key1Record);
            _buttonGroupKey1Function.addButton(ui->pushButton_key1Freeze);
            _buttonGroupKey1Function.addButton(ui->pushButton_key1WhiteBalanceCorrect);
            connect(&_buttonGroupKey1Function, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(slot_key1ButtonClicked(QAbstractButton*)));
            switch (_key1Function)
            {
            case FUNCTION_TYPE_NO_USE:
                ui->pushButton_key1NoUse->setChecked(true);
                break;
            case FUNCTION_TYPE_PHTOTO:
                ui->pushButton_key1Photo->setChecked(true);
                break;
            case FUNCTION_TYPE_RECORD:
                ui->pushButton_key1Record->setChecked(true);
                break;
            case FUNCTION_TYPE_FREEZE:
                ui->pushButton_key1Freeze->setChecked(true);
                break;
            case FUNCTION_TYPE_WHITE_BALANCE_CORRECT:
                ui->pushButton_key1WhiteBalanceCorrect->setChecked(true);
                break;
            default:
                break;
            }
        }
        // 按键2的功能按钮
        {
            ui->pushButton_key2NoUse->setText(tr("不使用"));
            ui->pushButton_key2Photo->setText(tr("拍照"));
            ui->pushButton_key2Record->setText(tr("录像"));
            ui->pushButton_key2Freeze->setText(tr("冻结"));
            ui->pushButton_key2WhiteBalanceCorrect->setText(tr("白平衡校准"));
            _buttonGroupKey2Function.addButton(ui->pushButton_key2NoUse);
            _buttonGroupKey2Function.addButton(ui->pushButton_key2Photo);
            _buttonGroupKey2Function.addButton(ui->pushButton_key2Record);
            _buttonGroupKey2Function.addButton(ui->pushButton_key2Freeze);
            _buttonGroupKey2Function.addButton(ui->pushButton_key2WhiteBalanceCorrect);
            connect(&_buttonGroupKey2Function, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(slot_key2ButtonClicked(QAbstractButton*)));
            switch (_key1Function)
            {
            case FUNCTION_TYPE_NO_USE:
                ui->pushButton_key2NoUse->setChecked(true);
                break;
            case FUNCTION_TYPE_PHTOTO:
                ui->pushButton_key2Photo->setChecked(true);
                break;
            case FUNCTION_TYPE_RECORD:
                ui->pushButton_key2Record->setChecked(true);
                break;
            case FUNCTION_TYPE_FREEZE:
                ui->pushButton_key2Freeze->setChecked(true);
                break;
            case FUNCTION_TYPE_WHITE_BALANCE_CORRECT:
                ui->pushButton_key2WhiteBalanceCorrect->setChecked(true);
                break;
            default:
                break;
            }
        }
    }
    // 存储位置选择
    {
        // 存储位置选择
        {
            ui->label_locateLocal->setText(tr("本机"));
            ui->label_locateUsb1->setText(tr("USB1"));
            ui->label_locateUsb2->setText(tr("USB2"));
            ui->label_locateLocal->setParent(ui->pushButton_locateLocal);
            ui->label_locateUsb1->setParent(ui->pushButton_locateUsb1);
            ui->label_locateUsb2->setParent(ui->pushButton_locateUsb2);
            ui->label_locateLocal->move(0, 0);
            ui->label_locateUsb1->move(0, 0);
            ui->label_locateUsb2->move(0, 0);
            ui->label_locateLocalStore->setText(QString("%1MB%2").arg(320).arg(tr("剩余")));
            ui->label_locateUsb1Store->setText(QString("%1MB%2").arg(320).arg(tr("剩余")));
            ui->label_locateUsb2Store->setText(QString("%1MB%2").arg(0).arg(tr("剩余")));
            ui->label_locateLocalStore->setParent(ui->pushButton_locateLocal);
            ui->label_locateUsb1Store->setParent(ui->pushButton_locateUsb1);
            ui->label_locateUsb2Store->setParent(ui->pushButton_locateUsb2);
            ui->label_locateLocalStore->move(ui->pushButton_locateLocal->width() / 2, 0);
            ui->label_locateUsb1Store->move(ui->pushButton_locateUsb1->width() / 2, 0);
            ui->label_locateUsb2Store->move(ui->pushButton_locateUsb2->width() / 2, 0);
            _buttonLocation.addButton(ui->pushButton_locateLocal);
            _buttonLocation.addButton(ui->pushButton_locateUsb1);
            _buttonLocation.addButton(ui->pushButton_locateUsb2);
            connect(&_buttonLocation, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(slot_locateLocationClicked(QAbstractButton*)));
            switch (_saveLocation)
            {
            case SAVE_LOCATION_LOCAL:
                ui->pushButton_locateLocal->setChecked(true);
                break;
            case SAVE_LOCATION_USB1:
                ui->pushButton_locateUsb1->setChecked(true);
                break;
            case SAVE_LOCATION_USB2:
                ui->pushButton_locateUsb2->setChecked(true);
                break;
            default:
                break;
            }
        }
        // 更新一下路径
        updateLocateState();
    }
    // 文件浏览器信号
    {
        ui->widget_resourceBrowser->setCols(4);
        ui->widget_resourceBrowser->setRows(4);
        connect(ui->widget_resourceBrowser, SIGNAL(signal_doubleClickedVideoFile(QString)), this, SLOT(slot_doubleClickedVideoFile(QString)));
    }
    // 时间控件关联日期控件
    {
        ui->widget_time->setBackgroundPixmap(QPixmap(":/images/timeBackground.png"));
        connect(ui->widget_time, SIGNAL(signal_dateChanged()), this, SLOT(slot_dateChanged()));
    }
    // 日期控件初始化
    {
        QFont font = ui->widget_dateSet->getFont();
        font.setPixelSize(44);
        ui->widget_dateSet->setFont(font);
        ui->widget_dateSet->setBackgroundPixmap(QPixmap(":/images/setTimeBackground.png"));
    }
    // 时间控件初始化
    {
        QFont font = ui->widget_timeSet->getFont();
        font.setPixelSize(32);
        ui->widget_timeSet->setFont(font);
        ui->widget_timeSet->setBackgroundPixmap(QPixmap(":/images/setTimeBackground.png"));
    }
    // 刷新日期
    updateDate();
#ifdef LINUX
    // 注册录像回调函数
//    fpga_comm_init(&fpga_com_read_record_data_handler_t);
    fpga_comm_init(0);
    // 初始化编码进程
    {
//        _pX264ManagerThread = new QThread();
        _pX264Manager = new X264Manager();
        connect(this, SIGNAL(signal_recvYuv(QByteArray)), _pX264Manager, SLOT(slot_recvYuv(QByteArray)), Qt::QueuedConnection);
//        _pX264Manager->moveToThread(_pX264ManagerThread);
//        _pX264ManagerThread->start();
    }
#endif
}
EndoscopeWidget::~EndoscopeWidget()
{
    delete ui;
}
...
#endif


相关文章
|
7月前
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
163 7
|
6月前
|
数据采集 移动开发 算法
【硬件测试】基于FPGA的QPSK调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现QPSK调制与软解调系统,包含Testbench、高斯信道、误码率统计模块,并支持不同SNR设置。硬件版本新增ILA在线数据采集和VIO在线SNR设置功能,提供无水印完整代码及测试结果。通过VIO分别设置SNR为6dB和12dB,验证系统性能。配套操作视频便于用户快速上手。 理论部分详细解析QPSK调制原理及其软解调实现过程,涵盖信号采样、相位估计、判决与解调等关键步骤。软解调通过概率估计(如最大似然法)提高抗噪能力,核心公式为*d = d_hat / P(d_hat|r[n])*,需考虑噪声对信号点分布的影响。 附Verilog核心程序代码及注释,助力理解与开发。
174 5
|
6月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2ASK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文分享了基于FPGA的2ASK+帧同步系统硬件测试版本,包含ILA数据采集、VIO SNR设置及数据源模块。通过调整SNR(如45dB和10dB),实现对调制解调性能的验证。2ASK调制将数字信号转为二进制码,通过载波振幅变化传输;帧同步用于确定帧起始位置,确保数据正确解调。附带操作视频与核心Verilog代码,便于理解和复现。
184 9
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的MSK调制解调系统系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现MSK调制解调系统,采用Verilog开发,包含同步模块、高斯信道模拟、误码率统计等功能。相比仿真版本,新增ILA数据采集与VIO在线SNR设置模块。通过硬件测试验证,展示不同SNR(如10dB和16dB)下的性能表现。研究聚焦软件无线电领域,优化算法复杂度以适应硬件限制,利用MSK恒定包络、相位连续等特性提升频谱效率。核心代码实现信号生成、调制解调、滤波及误码统计,提供完整的硬件设计与分析方案。
239 19
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
168 17
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
185 13
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前的文章《基于FPGA的4FSK调制解调系统》,增加了ILA在线数据采集模块和VIO在线SNR设置模块,实现了硬件测试版本。通过VIO设置不同SNR(如10dB和20dB),并展示了ILA采集的数据结果。四频移键控(4FSK)是一种数字调制方法,利用四个不同频率传输二进制数据,具有较高的频带利用率和抗干扰性能。输入的二进制数据分为两组,每组两个比特,对应四个频率f1、f2、f3、f4,分别代表二进制组合00、01、10、11。调制过程中选择相应频率输出,并进行幅度调制以增强抗干扰能力。接收端通过带通滤波器提取信号并还原为原始二进制数据。
144 7
|
7月前
|
数据采集 算法 数据处理
【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的256QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同信噪比(如30dB和40dB)的仿真测试,并提供配套操作视频。256QAM调制方案每个符号携带8比特信息,通过复数值星座图映射实现高效传输。Verilog代码展示了核心模块设计,包括SNR设置、数据处理和ILA测试分析,确保系统在实际硬件环境中的稳定性和性能。
163 2
|
8月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16QAM基带通信系统硬件测试版本。该系统在仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比(如15dB、25dB)的测试。16QAM是一种正交幅度调制方式,通过两路4ASK信号叠加实现,每个符号包含4比特信息。系统采用正交调幅法生成16QAM信号,并通过DAC转换为模拟信号。解调时使用正交相干解调,经低通滤波器恢复电平信号。开发板内完成发射与接收,无需定时同步模块。代码可移植至其他开发板,具体步骤见配套文档。
144 2
|
网络协议
Qt中的网络编程(Tcp和Udp)运用详解以及简单示范案例
Tcp和Udp是我们学习网络编程中经常接触到的两个通讯协议,在Qt也被Qt封装成了自己的库供我们调用,对于需要进行网络交互的项目中无疑是很重要的,希望这篇文章可以帮助到大家。 是关于Qt中TCP和UDP的基本使用和特点:
1798 7

热门文章

最新文章

推荐镜像

更多
  • qt