OpenCV Jpeg编解码
2014-07-08 23:09
288 查看
源码来自:https://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/encode_decode_test.cpp?r=63
描述:描述读取一张图片进行jpg和png压缩,并解压显示。
主要函数:imencode和imdecode。
环境:windows7+vs2010+opencv2.4.8。
工程地址:http://download.csdn.net/detail/chengkun183/7609491
源码:
![](https://img-blog.csdn.net/20140709000843030?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmdrdW4xODM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
输出的信息:
描述:描述读取一张图片进行jpg和png压缩,并解压显示。
主要函数:imencode和imdecode。
环境:windows7+vs2010+opencv2.4.8。
工程地址:http://download.csdn.net/detail/chengkun183/7609491
源码:
// JPEGDecodeEncode.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <iostream> #include <fstream> #include <cv.h> #include <highgui.h> using namespace std; using namespace cv; double getPSNR(Mat& src1, Mat& src2, int bb=0); int main(int argc, char** argv) { Mat src = imread("lena.png"); cout<<"origin image size: "<<src.dataend-src.datastart<<endl; cout<<"height: "<<src.rows<<endl<<"width: "<<src.cols<<endl<<"depth: "<<src.channels()<<endl; cout<<"height*width*depth: "<<src.rows*src.cols*src.channels()<<endl<<endl; //(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) { return 0; } else { mse =sse /(double)(count); psnr = 10.0*log10((255*255)/mse); return psnr; } }使用的图片为lena.png:
输出的信息:
相关文章推荐
- OpenCV2.4.9的jpeg解码和sobel算子函数剥离
- 使用openCV对JPEG图像内存进行解码及时间过长问题;
- android jni中将大数据回调到java层的时候用法,比如视频流,音频流等,图片流等 比如我用ffmpeg解码好视频流,想送到java层使用opengGL进行显示,opencv进行人脸识别等等
- JPEG解码
- ffmpeg视频解码以及opencv视频播放参考
- linux下的jpeg解码库使用
- C语言实现的BMP和JPEG图片的解码
- 视音频编解码学习工程:JPEG分析器
- mac 10.9 xcode 5.0 安装opencv2.4.7和libjpeg.8后出现libjpeg不兼容(解决方法)
- JPEG编解码过程详解
- JPEG编解码详解
- opencv读取avi视频解码问题
- Linux下jpeg解码方法
- jni层使用skia解码jpeg数据流
- WebRTC源码分析3_jpeg编解码
- Jpeg 库的解码OpenCL优化
- JPEG编解码过程详解
- ffmpeg 解码 到 opencv 之间传递
- OpenCV-Python cv2.imdecode()和cv2.imencode() 图片解码和编码
- JPEG 编解码在 Cell 上的优化