应用技术: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 高清