qq_41747698 2021-11-04 17:33 采纳率: 75%
浏览 56
已结题

qt使用qslider时主线程ui如何与子线程connect,opencv摄像头调参

主线程用qt 设计师建了一个qslider用来调参,camera子线程使用opencv打开摄像头,想要在ui主线程中滑块移动时获取参数connect与槽函数连接,实现capture.set(CV_PROPS_BRIGHTNESS)对摄像头参数调整,

camera线程.h

class Camera : public QObject
{
    Q_OBJECT
        VideoCapture capture;  //视频流捕获器
    static int cameracount; //存储相机数目
signals:
        void operate(int

.cpp使用打开摄像头


bool Camera::open(int _index)
{
    qDebug() << "open index= " << _index;
    if (capture.open(_index, CAP_DSHOW))
        return true;
    else
        return false;
}

void Camera::Operate(int _index)
{
    if (open(_index)) { qDebug() << "Camera open success!"; }
    else { qDebug() << "Camera open failed!"; return; }
    while (1)
    {
        //clear cam index, create ini,output
        /*for (int i = 0; i < 20;) {
            capture.get(i);

        }*/

        qApp->processEvents();
        Mat matin = read(); //视频流读入
        matnow = matin;
        QImage image = Mat2QImage(matin);
        emit updateImage(image);
    }
}

ui app0.h文件

class app0 : public QMainWindow
{
    Q_OBJECT
    Camera* camera;
    QThread thread;
    QThread ocr_thread;

public:
    app0(QWidget *parent = Q_NULLPTR);
    ~app0();

private:
    Ui::app0Class* ui=new Ui::app0Class();
    VideoCapture capture;
    QTimer *timer;
    Mat frame;
    bool isCamera = 0;
    int imgcount = 0;

private slots:
    void on_camera_index1_clicked(int);
    void set_brightness();

protected:
    void closeEvent(QCloseEvent *event)  Q_DECL_OVERRIDE;
signals:
    void cameraOperate(int);

ui .c文件

app0::app0(QWidget *parent)
    : QMainWindow(parent)
{
    ui->setupUi(this);
    this->setFixedSize(this->size());
    this->setWindowTitle("Camera Test by St, 2020.2.9");
    //Camera::getCameraCount()==0,//camera.open == false, QMessageBox::information(this, "System Failure", "没有找到可用摄像头", QMessageBox::OK);
    for (int i = 0; i<Camera::getCameraCount();)//摄像头启动时禁止调参?
        ui->comboBox->addItem(QString::number(i++)); //name camera
    camera = new Camera();
    camera->moveToThread(&thread); //将camera对象放在子线程,不推荐放在主线程执行。

    connect(this, SIGNAL(cameraOperate(int)), camera, SLOT(Operate(int))); //camera的槽函数将在thread所在的线程执行
    connect(camera, SIGNAL(updateImage(QImage)), this, SLOT(updateImage(QImage))); //将采集的图像传入主线程(UI线程)
    //connect(ui->camera_index2, &QPushButton::click, thread, SLOT(set_brightness()));
    //connect(ui->camera_index1, SIGNAL(clicked()), this, SLOT(onClicked()));//连接函数
}


void app0::set_brightness() {
    capture.set(CAP_PROP_BRIGHTNESS, 滑块参数); //value changed 和get value
}
  • 写回答

1条回答 默认 最新

  • 五一编程 2021-11-04 20:21
    关注

    建立信号槽,在App给Camera发消息,Camera收到消息后调用capture进行滑块参数设置,信号在App,槽在Camera

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月13日
  • 已采纳回答 11月5日
  • 创建了问题 11月4日

悬赏问题

  • ¥15 如果要做一个老年人平板有哪些需求
  • ¥15 k8s生产配置推荐配置及部署方案
  • ¥15 matlab提取运动物体的坐标
  • ¥15 人大金仓下载,有人知道怎么解决吗
  • ¥15 一个小问题,本人刚入门,哪位可以help
  • ¥15 python安卓开发
  • ¥15 使用R语言GD包一直不出结果
  • ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
  • ¥15 如何根据一个截图编写对应的HTML代码
  • ¥15 stm32标准库的PID角度环