在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用
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使用,用于网络传输图片的更多相关文章

  1. OpenCV开发笔记(七十四):OpenCV3.4.1+ffmpeg3.4.8交叉编译移植到海思平台Hi35xx平台

    前言   移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持.   Ffmpeg的移植   Ffmpeg的移植请参考之前的文章:<FFmpeg开发笔记(十): ...

  2. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0 +VS 2013 开发环境配置

    图片太多,具体过程参照: [OpenCV入门教程之一] 安装OpenCV:OpenCV 3.0.OpenCV 2.4.8.OpenCV 2.4.9 +VS 开发环境配置 说下我这边的设置: 选择deb ...

  3. opencv开发的程序分发给客户时所需要的dll文件

    这里主要讲在其他裸机,没有搭建开发环境机器上运行自己开发的程序. 为了测试,我专门用visualbox搭建了一个虚拟机(主机和虚拟机都是win7系统) 在发给别人程序运行出现错误:msvcp100d. ...

  4. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...

  5. iOS下OpenCV开发用OC还是Swift

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 其实标题中这个问题并不准确,准确的说法应该是iOS下的OpenCV开发是使用OC还是Swift ...

  6. iOS下OpenCV开发配置的两个常见问题(sign和link)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 先上可以运行官方推荐的<OpenCV for iOS samples>的demo链 ...

  7. [树莓派(raspberry pi)] 02、PI3安装openCV开发环境做图像识别(详细版)

    前言 上一篇我们讲了在linux环境下给树莓派安装系统及入门各种资料 ,今天我们更进一步,尝试在PI3上安装openCV开发环境. 博主在做的过程中主要参考一个国外小哥的文章(见最后链接1),不过其教 ...

  8. win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

    win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...

  9. Qt_mingw搭建opencv开发环境

    Qt在windows下共有2个版本:mingw和msvc.其中mingw使用gcc编译器,msvc使用微软的VC编译器.针对不同版本Qt,使用Opencv的方式也不同. 区别 msvc, 可以使用op ...

随机推荐

  1. P1894 [USACO4.2]完美的牛栏The Perfect Stall

    题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在 ...

  2. 64位内核第三讲,Windbg的使用.以及命令

    目录 一丶驱动的调试. 1.线程 2.断点 3.内存查看命令 4.修改内存命令 5.栈相关操作命令 6.进程线程命令(内核命令) 一丶驱动的调试. 编写驱动免不了调试.所以这里介绍一下WinDbg的常 ...

  3. 安装 sqoop

    简介 Sqoop是一个用来将Hadoop(Hive.HBase)和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如:MySQL ,Oracle ,Postgres等)中的数据导入到Ha ...

  4. 使用IDEA运行CAS5.3服务器

    在上节中,我们运行CAS服务器是打成war包在tomcat中进行运行,这节介绍在IDEA中运行CAS服务器. 1.下载CAS 模板 Overlay Template,我这里使用 Apereo CAS ...

  5. 记录vsCode配置node开发环境

    环境:win10,idea:vscode 1:安装Visual Studio Code 下一步下一步.(很早之前就安装了). 2:安装node. http://nodejs.cn/download/  ...

  6. ubuntu之路——day11.1 如何进行误差分析

    举个例子 还是分类猫图片的例子 假设在dev上测试的时候,有100张图片被误分类了.现在要做的就是手动检查所有被误分类的图片,然后看一下这些图片都是因为什么原因被误分类了. 比如有些可能因为被误分类为 ...

  7. 三大框架 之 spring-JDBC

    目录 spring-JDBC模板 Spring的JDBC的模板 JDBC模板使用的入门 引入jar包 创建数据库和表 使用JDBC的模板 将连接池和模板交给Spring管理 配置文件配置Bean 使用 ...

  8. 深度学习面试题20:GoogLeNet(Inception V1)

    目录 简介 网络结构 对应代码 网络说明 参考资料 简介 2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet获得了第一名.VGG获得了第二 ...

  9. HTTPWebrequest上传文件--Upload files with HTTPWebrequest (multipart/form-data)

    使用HTTPWebrequest上传文件遇到问题,可以参考Upload files with HTTPWebrequest (multipart/form-data)来解决 https://stack ...

  10. Flink实时处理并将结果写入ElasticSearch实战

    参考原博客: https://blog.csdn.net/weixin_44516305/article/details/90258883 1 需求分析 使用Flink对实时数据流进行实时处理,并将处 ...