[OpenCV开发]OpenCV图像编码和解码 imencode和imdecode使用,用于网络传输图片
在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用
socket 通信传送图片二进制数据,或者直接用内存数据库(例如 Redis)来传递图片二进制数据。
这个时候,当你的应用程序读到内存里的二进制图片数据时,怎么样直接转为 OpenCV
可以使用的图片格式呢,答案是用 cv::imdecode 这个函数:
std::vector<char> data(lpData, size);
cv::Mat image = cv::imdecode(cv::Mat(data), 1); IplImage qImg;
qImg = IplImage(image); // cv::Mat -> IplImage
即先构造一个 char 字符串序列的 vector,用来存储图片的二进制数据,然后再转为 cv::Mat 成为可以被
cv::imdecode 使用的数据格式,然后直接类型转换为 IplImage 数据格式。
同样,如果你需要把 IplImage 或 cv::Mat 压缩并写到一段内存块里时,就需要使用 cv::imencode 这个函数,使用方法类似。
示例代码如下:
| #include<iostream> |
| #include<fstream> |
| #include<cv.h> |
| #include<highgui.h> |
| usingnamespace std; |
| usingnamespace cv; |
| |
| double getPSNR(Mat& src1,Mat& src2,int bb=0); |
| |
| int main(int argc,char** argv) |
| { |
| Mat src= imread("lenna.png"); |
| |
| //(1) jpeg compression |
| vector<uchar> buff;//buffer for coding |
| vector<int> param= vector<int>(2); |
| param[0]=CV_IMWRITE_JPEG_QUALITY; |
| param[1]=95;//default(95) 0-100 |
| |
| imencode(".jpg",src,buff,param); |
| cout<<"coded file size(jpg)"<<buff.size()<<endl;//fit buff size automatically. |
| Mat jpegimage= imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR); |
| |
| //(2) png compression |
| param[0]=CV_IMWRITE_PNG_COMPRESSION; |
| param[1]=3;//default(3) 0-9. |
| imencode(".png",src,buff,param); |
| cout<<"coded file size(png)"<<buff.size()<<endl; |
| Mat pngimage= imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR); |
| |
| //(3) intaractive jpeg compression |
| char name[64]; |
| namedWindow("jpg"); |
| int q=95; |
| createTrackbar("quality","jpg",&q,100); |
| int key=0; |
| while(key!='q') |
| { |
| param[0]=CV_IMWRITE_JPEG_QUALITY; |
| param[1]=q; |
| imencode(".jpg",src,buff,param); |
| Mat show= imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR); |
| |
| double psnr= getPSNR(src,show);//get PSNR |
| double bpp=8.0*buff.size()/(show.size().area());//bit/pixe; |
| sprintf(name,"quality:%03d, %.1fdB, %.2fbpp",q,psnr,bpp); |
| putText(show,name,Point(15,50), FONT_HERSHEY_SIMPLEX,1,CV_RGB(255,255,255),2); |
| imshow("jpg",show); |
| key = waitKey(33); |
| |
| if(key=='s') |
| { |
| //(4) data writing |
| sprintf(name,"q%03d_%.2fbpp.png",q,bpp); |
| imwrite(name,show); |
| |
| sprintf(name,"q%03d_%.2fbpp.jpg",q,bpp); |
| param[0]=CV_IMWRITE_JPEG_QUALITY; |
| param[1]=q; |
| imwrite(name,src,param);; |
| } |
| } |
| } |
| double getPSNR(Mat& src1,Mat& src2,int bb) |
| { |
| int i,j; |
| double sse,mse,psnr; |
| sse =0.0; |
| |
| Mat s1,s2; |
| cvtColor(src1,s1,CV_BGR2GRAY); |
| cvtColor(src2,s2,CV_BGR2GRAY); |
| |
| int count=0; |
| for(j=bb;j<s1.rows-bb;j++) |
| { |
| uchar* d=s1.ptr(j); |
| uchar* s=s2.ptr(j); |
| |
| for(i=bb;i<s1.cols-bb;i++) |
| { |
| sse +=((d[i]- s[i])*(d[i]- s[i])); |
| count++; |
| } |
| } |
| if(sse==0.0|| count==0) |
| { |
| return0; |
| } |
| else |
| { |
| mse =sse/(double)(count); |
| psnr =10.0*log10((255*255)/mse); |
| return psnr; |
| } |
| } |
[OpenCV开发]OpenCV图像编码和解码 imencode和imdecode使用,用于网络传输图片的更多相关文章
- OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台
前言 移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持. Ffmpeg的移植 Ffmpeg的移植请参考之前的文章:<FFmpeg开发笔记(十): ...
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0 +VS 2013 开发环境配置
图片太多,具体过程参照: [OpenCV入门教程之一] 安装OpenCV:OpenCV 3.0.OpenCV 2.4.8.OpenCV 2.4.9 +VS 开发环境配置 说下我这边的设置: 选择deb ...
- opencv开发的程序分发给客户时所需要的dll文件
这里主要讲在其他裸机,没有搭建开发环境机器上运行自己开发的程序. 为了测试,我专门用visualbox搭建了一个虚拟机(主机和虚拟机都是win7系统) 在发给别人程序运行出现错误:msvcp100d. ...
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...
- iOS下OpenCV开发用OC还是Swift
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 其实标题中这个问题并不准确,准确的说法应该是iOS下的OpenCV开发是使用OC还是Swift ...
- iOS下OpenCV开发配置的两个常见问题(sign和link)
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 先上可以运行官方推荐的<OpenCV for iOS samples>的demo链 ...
- [树莓派(raspberry pi)] 02、PI3安装openCV开发环境做图像识别(详细版)
前言 上一篇我们讲了在linux环境下给树莓派安装系统及入门各种资料 ,今天我们更进一步,尝试在PI3上安装openCV开发环境. 博主在做的过程中主要参考一个国外小哥的文章(见最后链接1),不过其教 ...
- win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建
win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...
- Qt_mingw搭建opencv开发环境
Qt在windows下共有2个版本:mingw和msvc.其中mingw使用gcc编译器,msvc使用微软的VC编译器.针对不同版本Qt,使用Opencv的方式也不同. 区别 msvc, 可以使用op ...
随机推荐
- bzoj 2969: 矩形粉刷 概率期望+快速幂
还是老套路:期望图上的格子数=$\sum$ 每个格子被涂上的期望=$\sum$1-格子不被图上的概率 这样的话就相对好算了. 那么,对于 $(i,j)$ 来说,讨论一下上,下,左,右即可. 然后发现四 ...
- vue vue-cli中引入全局less变量的方式
我们经常用less定义一些全局变量,比如主题的颜色,为了避免在每个组件中引用我首先尝试放在main.js中,发现并不起作用... 先看vue-cli2.x 版本如何解决 1.安装; npm insta ...
- C语言函数的定义和使用(2)
一:无参函数 类型说明符 get(){ //函数体 } 二:无参函数 类型说明符 getname(int a,int b){ //函数体 } 三:类型说明符包括: int ,char,float,do ...
- 数据结构实验之排序五:归并求逆序数(SDUT 3402)
归并排序详解(戳我). 以下是搬了别人的. #include<stdio.h> #include<stdlib.h> long long sum = 0; int a[1000 ...
- 《挑战30天C++入门极限》C++运算符重载转换运算符
C++运算符重载转换运算符 为什么需要转换运算符? 大家知道对于内置类型的数据我们可以通过强制转换符的使用来转换数据,例如(int)2.1f;自定义类也是类型,那么自定义类的对象在很多情况下也 ...
- jvm指令手册查看
00-JVM指令手册 栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 ...
- eclipse 创建c/c++ 工程
新建 注意选择如下选项,c和c++ 都一样的 然后,编译运行 参考: https://blog.csdn.net/u013610133/article/details/72857870 https:/ ...
- 第十六周助教工作总结——NWNU李泓毅
助教博客链接:https://www.cnblogs.com/NWNU-LHY/ 本次作业的要求:团队项目设计完善&编码:https://www.cnblogs.com/nwnu-daizh/ ...
- Ubuntu 18.04.1 安装java8
###下载tar.gz 点击选择接收协议 下载完文件之后,将文件从Windows复制到ubuntu上,可以用xShell,putty,git.这里用git 下载安装git之后,再任意位置右击,选择 g ...
- [转]重命名PostgreSQL数据库
初学PostgreSQL的朋友可能会有这样的疑惑:如何重命名已经建好的数据库?因为PostgreSQL默认的客户端pgAdmin III并没有地方可以让我们去修改某个现有的数据库的名称.遇到这个情况, ...