本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-comprimere-un-immagine-in-memoria/

修正了原程序中的文字错误。


在这个简短的教程中,我会展示一个压缩图像的简单步骤。这个操作用处很大,比如获取网络摄像头的图像,这些图像要发送到另一台设备上必须经过压缩。

这个程序充分利用了我们之前看到的两个教程,如果你还没有看过,我建议你先阅读之前的教程,它分为第一部分第二部分

与先前的教程不同,这次我们要显示两个widget:一个显示原始图像,另一个显示压缩过的图像。这使得我们能直观的评估压缩质量。

压缩质量可通过一个滑块调节:0代表最低质量、最高压缩率,100代表最高质量、最低压缩率。

你还可以选择JPEG或PNG两种压缩格式,你会看到JPEG图像比PNG的图像质量要低,但是体积更小。

将之前的教程作为参考,我们要做的修改只有一个函数:TimerEvent ( QTimerEvent * event) :

void MainWindow::timerEvent(QTimerEvent *event)
{
Q_UNUSED(event); cv::Mat raw;
mCapture >> raw; // >>>>> Params from widgets
QString comprType;
int quality = ui->horizontalSlider_quality->value();
int compr; if( ui->radioButton_jpeg->isChecked() )
{
comprType = ".jpg";
compr = cv::IMWRITE_JPEG_QUALITY;
}
else
{
comprType = ".png";
quality = qMin( 9, quality/10 ); // PNG quality is in [0,9] range
compr = cv::IMWRITE_PNG_COMPRESSION;
}
// <<<<< Params from widgets // >>>>> FPS Calculation
static int frameCount = 0;
static qreal timeAcc = 0;
static qreal fps=0.0; int nFrm = 10; // 10 frames qreal elapsed = (qreal)mFpsTimer.elapsed();
timeAcc += elapsed;
frameCount++; if(frameCount%nFrm==0) // Update every "nFrm" frames
{
fps = 1000.0/(timeAcc/nFrm);
timeAcc=0;
frameCount=0;
} mFpsTimer.restart();
// <<<<< FPS Calculation if( !raw.empty() )
{
// >>>>> Jpeg compression in memory
vector<uchar> buf; // Memory buffer
vector<int> params; params.push_back( compr );
params.push_back( quality ); // Quality of compression cv::imencode( comprType.toLocal8Bit().data(), raw, buf, params );
cv::Mat compressed;
cv::imdecode( cv::Mat(buf), cv::IMREAD_COLOR, &compressed ); mInfoLabel.setText( tr("<b>Compression quality:</b> %1 - <b>Raw data:</b> %2 bytes - <b>Compressed data:</b> %3 bytes - <b>FPS:</b> %4")
.arg(quality).arg(raw.cols*raw.rows*raw.channels()).arg(buf.size()).arg(fps) );
// <<<<< Jpeg compression in memory // Show the images
ui->widget_raw->showImage( raw ); if( !compressed.empty())
ui->widget_compressed->showImage( compressed );
}
}

在8到25行,读取由GUI设置的的参数。26到45行,计算FPS来表示压缩占用的资源。压缩操作是在第56行使用OpenCV的 imencode 函数完成的,传入与压缩类型有关的参数以及压缩质量。

第58行,从缓存中解压缩图像,使图像可以在右侧的widget中显示。

在客户端/服务器程序中,第56行由服务器在发送图像之前执行,而第58行则由客户端在收到图像数据时执行。

本例代码:http://www.robot-home.it/blog/download/Tutorial/ImageCompressionDemo.rar

[OpenCV Qt教程] 如何在内存中压缩图像的更多相关文章

  1. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  2. 原创教程“ActionScript3.0游戏中的图像编程”開始连载啦!

            经过近两年的不懈努力,笔者的原创教程"ActionScript3游戏中的图像编程"最终在今日划上了完美的句号!这其中记录着笔者多年来在游戏制作,尤其是其中图像处理方 ...

  3. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  4. SDL显示内存中的图像

    <textarea readonly="readonly" name="code" class="c++"> #include ...

  5. Windows下OpenCV 3.1.0 在 Qt Creator 4.0.2 (Qt 5.7.0 MinGW) 中的开发环境配置

    2017-2-23 Update: 修改并添加了部分细节 最近正在学习OpenCV ,为毕业设计做准备.Windows版本的OpenCV都默认提供对VS的支持,其在VS中的配置比较简单,网上也有大批教 ...

  6. Python: 使用zipfile+io模块在内存中进行zip操作

    #!/usr/bin/env python #coding=utf-8 ''' 版权所有 (c) 2014 yao_yu (http://blog.csdn.net/yao_yu_126) 本代码采用 ...

  7. Linux 下V4l2摄像头采集图片,实现yuyv转RGB,RGB转BMP,RGB伸缩,jpeglib 库实现压缩RGB到内存中,JPEG经UDP发送功(转)

    ./configure CC=arm-linux-gnueabihf-gcc LD=arm-linux-gnueabihf-ld --host=arm-linux --prefix=/usr/loca ...

  8. OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式

    以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列像素的三个通道数据组成一个一维数组,一行像素组成一个二维数组,整幅图像组成一个三维数组,即: Mat.dat ...

  9. IT兄弟连 Java语法教程 数组 深入数组 内存中的数组

    数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的.下面将深入介绍数组在内存中的运行机制. 内存中的数组 数组引用变量只是一个引用,这个引用变量可以指向任何有效的 ...

随机推荐

  1. EasyPusher/EasyDarwin支持H.265 RTSP/RTP直播推流与分发播放

    前言描述 随着大屏时代和高清时代的到来,人们已经不再满足于VGA.CIF这种小分辨率了,取而代之的是720P.1080P.4K级的视频传输,虽然我们国家的基础带宽一直在上升,但普遍情况下,传输高清视频 ...

  2. 配置wampserver 虚拟主机

    1.修改http.conf 找到,#Include conf/extra/httpd-vhosts.conf,修改为(有的版本服务器,默认是开启的): 2.配置httpd-vhosts.conf文件, ...

  3. Ubuntu在图形界面和命令行界面都循环登录解决办法

    在做机器ip变化自动发送邮件的时候,在/etc/profile.d/目录下添加了一个脚本,重启的时候就循环登录了,无论是在图形界面还是命令行界面. 解决方法:利用系统U盘进入系统进行修改,具体如下: ...

  4. wireshark的一些快捷键

    恢复原来的大小   ‘crtl’+‘=’  即按住crtl建和=键(backspace左边那个键) 缩小 ‘crtl’+‘-’ 即按住crtl建和-键(backspace左边第二个键) 放大 ‘crt ...

  5. HDU2161

    解题思路:判断素数模板题. #include<cstdio> #include<cstring> #include<algorithm> using namespa ...

  6. 在eclipse中使用git clone 别人共享在Github的代码和上传到自己的仓库!

    原文地址:http://www.itdaan.com/blog/2014/10/24/ff5e03b5cefef19e1b6fbb7b49809846.html1.在eclipse中安装git:打开e ...

  7. MySQL性能管理及架构设计 --- 理论篇

                  MySQL性能管理及架构设计  一丶IO,内存,吞吐量理解 IO     是指设备与设备之间操作次数,比如mysql与php互插内存   是程序运行都在里面执行吞吐量 是单 ...

  8. MySQL事物回滚

    #commit.rollback用来确保数据库有足够的剩余空间:#commi.rollback只能用于DML操作,即insert.update.delet;#rollback操作撤销上一个commit ...

  9. salesforce 公开网页,免登陆

    設定→カスタマイズ→コミュニテ→新建一个visfualforce的コミュニテ ビルド->カスタマイズ->コミュニティ->すべてのコミュニティ->新規コミュニティ 然后选中新规的 ...

  10. python嵌入c++

    1.去主页下载源代码项目 2.编译下载下来的项目 3.新建项目填入下面代码 // pythonIncludeTest.cpp : 定义控制台应用程序的入口点. // #include "st ...