基于Qt和OpenCV的图片与视频编辑器

发布于:2025-07-25 ⋅ 阅读:(13) ⋅ 点赞:(0)

应用技术:Qt C++、OpenCV、多线程、单例模式,qss样式表、OpenGL、ffmpeg。 本项目为Qt mingw6.5.3版本,QtCreator编写运行。 

void XVideoWidget::do_setImage(cv::Mat mat)
{
    QImage::Format fmt = QImage::Format_RGB888;
    int pixSize = 3;
    //处理后是灰度图
    if (mat.type() == CV_8UC1) {
        fmt = QImage::Format_Grayscale8;
        pixSize = 1;
    }
    //RGB图
    if (img.isNull() || img.format() != fmt) {  //灰度图后,设置回rgb图
        delete img.bits();
        uchar* buf = new uchar[width() / 4 * 4  * height() / 4 * 4 * pixSize];
        //img为显示窗口大小(要4的倍数)
        img = QImage(buf, width() / 4 * 4, height() / 4 * 4, fmt);
    }
    //拷贝img大小的Mat
    cv::Mat des;
    cv::resize(mat, des, cv::Size(img.size().width(), img.size().height()));
    //设置图像颜色格式
    if (pixSize > 1) {
        cv::cvtColor(des, des, cv::COLOR_BGR2RGB);
    }
    //复制内存空间
    memcpy(img.bits(), des.data, des.cols * des.rows * des.elemSize());
    update();
}
void XVideoThread::run()
{
    cv::Mat mat1;
    for (;;) {
        mutex.lock();
        if (isExit) {
            mutex.unlock();//析构的时候退出
            break;
        }
        //判断视频是否打开
        if (!cap1.isOpened()) {
            mutex.unlock();
            msleep(5);
            continue;
        }
        if (!isPlay) { //暂停状态
            mutex.unlock();
            msleep(5);
            continue;
        }
        //读取一帧视频,解码,颜色转换
        int cur = cap1.get(cv::CAP_PROP_POS_FRAMES); //获取当前帧数
        if ((endPos > 0 && cur >= endPos) || !cap1.read(mat1) || mat1.empty()) {
            mutex.unlock();
            //导出在结尾位置,停止导出
            if(isWrite) {   //正在导出视频
                stopSave();
                emit sigSaveEnd();
            }
            msleep(5);
            continue;
        }
        cv::Mat mat2 = mark;
        //视频融合
        if (cap2.isOpened()) {
            cap2.read(mat2);
        }
        //非导出状态下,显示原图像
        if (!isWrite) {
            emit sigViewImage1(mat1);
            if (!mat2.empty()) {
                emit sigViewImage2(mat2);
            }
        }
        //通过过滤器处理
        cv::Mat des = XFilter::getInstance()->fFilter(mat1, mat2);
        //非导出状态下,显示生成后图像
        if (!isWrite) {
            emit sigViewDes(des);
        }
        int s = 0;
        s = 850 / fps; //根据fps设置视频播放速度
        if (isWrite) { //导出视频时,不需要fps
            s = 1;
            vw.write(des);
        }
        msleep(s);
        mutex.unlock();
    }
}

项目描述:可分别对图片和对视频进行编辑。对图片的编辑功能包括:亮度,对比度,滤波,二值化,边缘检测,缩放,旋转,尺寸修改,图片转base64,base64转图片,保存图片。对 视频的编辑功能包括:视频播放和停止,亮度,对比度,视频导出,视频旋转,镜像,尺寸调整,二值化,添加水印,视频合并,视频融合,视频和音频剪辑。qss手动改变编 辑器的颜色样式。 主要工作:用两个界面分别实现图片处理和视频处理,主要运用OpenCV的函数对图片进行各种处理。大部分处理选择同一个滑动条控制参数,用qss设置了多种界面样式。 视频编辑中,OpenCV读取原视频的每一帧实现视频播放,并采用了多线程,子线程采用单例模式,通过加互斥锁保证线程安全。在视频播放的子线程中根据fps调整速度,读取 视频每一帧在OpenGL Widget上显示,滑动控制视频播放。 对视频的图像处理操作为采用OpenCV的函数,对视频的每一帧进行处理,主界面再获取每一帧,播放处理后的视频。

基于Qt和OpenCV的图片与视频编辑器_720P 高清


网站公告

今日签到

点亮在社区的每一天
去签到