QT使用Opencv进行KCF目标跟踪时无法关闭上次跟踪开始第二次跟踪(init)

在这种特定条件下有没有其他的方法能在MainWindow主体下重启在其他子线程下的KCF跟踪器的init()函数与update()函数呢?

前提

项目采用QT使用FFmpeg线程拉取网络摄像头的RTSP流转入Opencv线程进行实时(100ms延迟内)的KCF算法跟踪,对于目标跟踪后的图像显示到主线程的ui界面上来。

部分代码

void MyThread::GotMatimg(cv::Mat img)  //目标跟踪显示画面
{
    targetstatus = "3";
    if(successTrack && !Tack) //鼠标框选判别
    {
        targetstatus = "2";
        tracker->init(img,SignPoint);
        Tack = true;
    }
    else if(Tack)
    {
        tracker->update(img,SignPoint);
        rectangle(img,SignPoint, Scalar(255, 0, 0), 2, 3);
        trackx = SignPoint.x + (SignPoint.width /2);
        tracky = SignPoint.y + (SignPoint.height /2);
        if(!tracker->update(img,SignPoint))
        {
            targetstatus = "丢失";
        }
        else
        {
            targetstatus = "跟踪";
        }
    }
    emit SendMatimg(img); //发送图片数据
}

void MainWindow::GainMatimg(cv::Mat img)
{
    showImage(img,QImage::Format_RGB888,ui->label); //显示视频
}

void MainWindow::on_btnsign_clicked()
{
    if(ui->btnsign->text() == "识别")
    {
        threeD->Track_Sign = true;//切换为opencv鼠标框选功能
        Tack = false;        
        targetstatus = "4";
        
        NET_DVR_StopRealPlay(IRealPlayHandle);
        struPlayInfo.hPlayWnd = NULL;//需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空
        IRealPlayHandle = NET_DVR_RealPlay_V40(userID,&struPlayInfo,NULL,NULL);
        
        connect(m_trad, SIGNAL(SendMatimg(cv::Mat)), this, SLOT(GainMatimg(cv::Mat)),Qt::AutoConnection); //连接发送跟踪处理后的图片信号与接收图片显示槽
        connect(m_ffmpeg, SIGNAL(SigGetOneFrame(cv::Mat)), m_trad, SLOT(GotMatimg(cv::Mat)),Qt::AutoConnection);//连接发送原始图片信号与获取图片进行跟踪处理槽
        
        ui->btnsign->setText("定位");
    }
    else if(ui->btnsign->text() == "定位")
    {
        threeD->Track_Sign = false;//关闭opencv鼠标框选功能
        successTrack = false; //关闭跟踪处理
        
        struPlayInfo.hPlayWnd = hWnd;//需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空
        IRealPlayHandle = NET_DVR_RealPlay_V40(userID,&struPlayInfo,NULL,NULL);
        
        disconnect(m_trad, SIGNAL(SendMatimg(cv::Mat)), this, SLOT(GainMatimg(cv::Mat)));//断开连接
        disconnect(m_ffmpeg, SIGNAL(SigGetOneFrame(cv::Mat)), m_trad, SLOT(GotMatimg(cv::Mat)));
        ui->btnsign->setText("识别");
    }
}

项目必备(无法改变与替换)

  1. 必须单独使用FFmpeg作为子线程拉取流来进行处理才能达到实时的要求,使用Opencv自带拉流(VideoCapture)无法做到实时要求

  2. 鼠标框选子线程来实现要求的目标框选功能,并该子线程需要具备多功能,所以该功能无法改变

  3. 在OpenCV子线程将获得到的FFmpeg框选的图像进行KCF初始化(init())后实时更新跟踪图像(update()),KCF跟踪算法对于项目的契合度更高

疑问难题

尝试过在父线程使用KCF算法中的release()、reset()函数进行关闭跟踪,但这两种函数都无法关闭跟踪;无法关闭跟踪就无法进行下一步的操作,请帮我解答一下如何C++下在父线程重新开启在子线程的KCF算法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值