首页 > 其他分享 >qt进行视频二值化 未成功 待改进

qt进行视频二值化 未成功 待改进

时间:2023-08-27 18:12:12浏览次数:43  
标签:视频 mat image MainWindow void include 二值化 QImage qt

QT+opencv 使用videocapture采集视频进行二值化输出_哔哩哔哩_bilibili

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QTimer>
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QTimer *m_timer;
    VideoCapture *m_videoCapture;
private slots:
    void openVideo();
    void setMatLabel(QLabel &_label,Mat &_frame);
    void actionTriggered();
    void handleFrame();
    QImage cvMat2QImage(const Mat& mat);
    QImage QImage2cvMat(QImage image);

};

#endif // MAINWINDOW_H







#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
#include <QFileDialog>
#include <QStandardPaths>
#include <QString>
#include <QMessageBox>
#include <QDebug>

#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_timer=new QTimer(this);
    m_timer->setInterval(30);

    connect(m_timer,SIGNAL(timeout()),this,SLOT(handleframe()));


}

MainWindow::~MainWindow()
{
    if(m_videoCapture!=nullptr)
        m_videoCapture->release();
    if(m_timer->isActive())
        m_timer->stop();
    delete ui;
}
void MainWindow::actionTriggered()
{
    QString fileName=QFileDialog::getOpenFileName(this,tr("打开文件"),QStandardPaths::standardLocations(QStandardPaths::MoviesLocation).value(0,QDir::homePath()),tr("*.mp4 *.mkv"));
    if(!fileName.isEmpty())
        openVideo(fileName);
}
void MainWindow::openVideo()
{
    if(m_timer->isActive())
        m_timer->stop();
    if(m_videoCapture!=nullptr)
        m_videoCapture->release();

    m_videoCapture=new VideoCapture;
    m_videoCapture->open(fileName.toStdString());
    if(!m_videoCapture->isOpened())
    {
        QMessageBox::warning(this,"警告","不能打开视频");
        return;
    }

    m_timer->start();

}



void MainWindow::setMatLabel(QLabel &_label,Mat &_frame)
{
    QImage labelImage=cvMat2QImage(_frame);
    QPixmap pixmap=QPixmap::fromImage(labelImage);
    _label.setPixmap(pixmap.scaled(_label.width(),_label.height()));

}



void MainWindow::handleFrame()
{
    if(!m_videoCapture->read(m_frame))
    {
        QMessageBox::warning(this,"警告","视频文件不能读取");
        m_videoCapture->release();
        m_timer->stop();

        return;
    }

    Mat tmp;
    cvtColor(m_frame,tpm,COLOR_BGR2RGB);
    threshold(tmp,tmp,ui->Slider1->value(),ui->Slider2->value(),THRESH_BINARY);


    setMatLabel(*ui->orgLabel,m_frame);
    setMatLabel(*ui->handleLabel,tmp);
}

QImage MainWindow::cvMat2QImage(const Mat& mat)
{
    if(mat.type()==CV_8UC1)
    {
        QImage image(mat.cols, mat.rows, QInage::Format_Indexed8);
        image.setColorCount(256);
        for (int i=0;i<256;i++)
        {
            image.setColor(i,qRgb(i,i,i));
        }

        uchar *pSrc=mat.data;
        for(int row=0; row <mat.rows; row++)
        {
            uchar *pDest = image.scanLine(row);
            memcpy(pDest, pSrc, mat.cols);
            pSrc +=mat.step;
        }

        return image;
    }

        else if(mat.type()==CV_8UC4)
    {
        const uchar *pSrc=(const uchar*)mat.data;
        QImage image(pSrc,mat.cols,mat.rows,mat.step,QImage::Format_ARGB32);
        return image.copy();
    }
    else
    {
        return QImage();
    }

}

QImage MainWindow::QImage2cvMat(QImage image)
{
    Mat mat;
    switch(image.format())
    {
    case QImage::Format_ARGB32:
    case QImage::Format_RGB32:
    case QImage::Format_ARGB32_Premultiplied:
        mat=Mat(image.height(),image.width(),CV_8UC4,(void*)image.constBits(),image.bytesPerLine());
        break;
    case QImage::Format_RGB888:
        mat=Mat(image.height(),image.width(),CV_8UC3,(void*)image.constBits(),image.bytesPerLine());
        cv::cvtColor(mat,mat,CV_BGR2RGB);
        break;
    case QImage::Format_Indexed8:
        mat=Mat(image.height(),image.width(),CV_8UC1,(void*)image.constBits(),image.bytesPerLine());
        break;
    default:
        break;
    }
    return mat;
}











标签:视频,mat,image,MainWindow,void,include,二值化,QImage,qt
From: https://www.cnblogs.com/dq0618/p/17660576.html

相关文章

  • Qt编写网易云界面 (7) -----最新音乐实现
    今天数字要实现一下该项目的最新音乐模块,效果如图:其实这个模块的内容应该是从数据库查询然后再显示,这里就简单的写死了,以后有时间在改了。最新音乐的qss:/*最新模块*//*最新音乐*/QPushButton#ptnMusAll,#ptnMusChinese,#ptnMusEurope,#ptnMusKorea,#ptnMusJapan{colo......
  • qt5 odbc mysql 开发配置
    qt5应用odbc使用mysql 要点apt-getinstallmysql-serverapt-getinstallmysqlclient-dev配置mysql-server可以安装apt-getinstallmysql-workbenchapt-getinstallmysql-connector-odbc配置/etc/odbc.ini/etc/odbcinst.iniapt-getinstallunixodbcisqlDNS-v......
  • 火山引擎 DataLeap:从短视频 APP 实践看如何统一数据指标口径
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群短视频正在成为越来越多人发现世界的窗口,其背后的创作者生态建设是各大短视频APP不可忽视的重要组成部分。为了激励更多优质内容生产,某短视频APP经常面向创作者主办投稿活动,而在复盘投稿数据......
  • 火山引擎 DataLeap:从短视频 APP 实践看如何统一数据指标口径
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群短视频正在成为越来越多人发现世界的窗口,其背后的创作者生态建设是各大短视频APP不可忽视的重要组成部分。为了激励更多优质内容生产,某短视频APP经常面向创作者主办投稿活动,而在复盘投稿......
  • MFC视频教学第一课,做一个简单的界面,理解应用程序和操作系统之间的消息传递机制
     #include<windows.h>#include<stdio.h>LRESULTCALLBACKWinSunProc(HWNDhwnd,UINTuMsg,WPARAMwParam,LPARAMlParam);//WinMain是操作系统调用的,是系统的入口函数intWINAPIWinMain(HINSTANCEhInstance,//当前应运程序......
  • 基于QT和C++实现的停车场管理系统
    基于QT和C++实现的停车场管理系统停车场管理系统简介一、 问题描述设停车场是一个可停放若干辆辆汽车的狭多层平面区域,且只有一个大门可供汽车进出。若车场内已停满汽车,则后来的汽车只能在门外的狭长便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入。每辆停放在......
  • vue中添加音频和视频
    视频播放功能1.安装vue-video-playernpminstallvue-video-player--save或yarnaddvue-video-player--save2.在main.js中全局引用importVueVideoPlayerfrom'vue-video-player'import'video.js/dist/video-js.css'import'vue-video-player/src/cu......
  • Qt简易读取视频
    #include"mainwindow.h"#include"ui_mainwindow.h"#include<QMediaPlayer>#include<QtMultimedia/QMultimedia>#include<QtMultimediaWidgets/QVideoWidget>MainWindow::MainWindow(QWidget*parent):QMainWindow(pare......
  • 介绍视频直播提效神器,绿幕选购一篇搞明白。绿幕已确认收货,实测篇
     近期准备做短视频,做直播,研究了一下绿幕虚拟技术,真是个好东西。 全套技术分为硬件和软件二部分。硬件主要有,绿幕,灯光,相机,采集卡,麦克风,支架,其他小配件等等。软件主要就是指抠像软件,有一部分电脑的专用软件,主要有免费的OBS,收费的如vMix这类的;还有近几年新出来的,可以直接在手机......
  • MQTT --- QoS 介绍
    什么是QoS很多时候,使用MQTT协议的设备都运行在网络受限的环境下,而只依靠底层的TCP传输协议,并不能完全保证消息的可靠到达。因此,MQTT提供了QoS机制,其核心是设计了多种消息交互机制来提供不同的服务质量,来满足用户在各种场景下对消息可靠性的要求。MQTT定义了三个QoS等......