源码来自: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
源码:
复制代码
使用的图片为lena.png:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102// 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; } }
输出的信息:
最后
以上就是潇洒蜜蜂最近收集整理的关于OpenCV Jpeg编解码的全部内容,更多相关OpenCV内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复