opencv读取,显示,写入图片(关于imwrite函数)
2015-05-16 15:45
477 查看
转载于:http://windrocblog.sinaapp.com/?p=465
OpenCV中最基本的操作:读取、显示、保存图片。
OpenCV2.0版本引入与Matlab命令相同的函数,imread、imshow、imwrite,获取图片更将方便。
读取文件 imread
其中flags表示载入后图片的颜色模式。CV_LOAD_IMAGE_UNCHANGED (0) 以RGB模式载入图片显示图片需要一个窗口。创建窗口 namedWindow
CV_WINDOW_AUTOSIZE 窗口大小自动调整到显示图片的大小
CV_WINDOW_NORMAL 只在Qt中使用,可以改变窗口大小
显示图片 imshow
在窗口中显示图片,对于NORMAL的窗口,把图片缩放到窗口固定大小,再显示。根据图像数据的深度,对图像进行下面的处理:8-bit unsigned 直接显示
16-bit unsigned or 32-bit integer 像素点值除以256,即把[0,255*256] 映射到 [0,255]
32-bit floating-point 像素点值乘以255,即把[0,1] 映射到 [0,255]所以,imshow可以正常显示取值范围[0,255]的uchar型图像、取值范围[0,1]的float或double类型图像,中间一种数据格式没用过。显示图像后,为了避免程序向下运行以致窗口一闪而过,需要等待一旦时间,waitKey正是这个功能。等待键盘按键 waitKey
delay小于等于0时,一直等待,只到用户按键,再继续执行。
delay大于0时,在delay微秒内等待用户按键。
处理过的图像需要保存到文件中。
保存图像 imwrite
params中的每个参数成对出现,即paramId_1, paramValue_1, paramId_2, paramValue_2, … ,当前支持如下参数:JPEG:压缩质量 ( CV_IMWRITE_JPEG_QUALITY ),从0到100(数值越高质量越好),默认值为95。
PNG:compression level ( CV_IMWRITE_PNG_COMPRESSION ) 从0到9。 数值越高,文件大小越小,压缩时间越长。默认值为3。
PPM, PGM, or PBM:二进制标志 ( CV_IMWRITE_PXM_BINARY ),0 或 1。默认值为1。还有一组函数,用于从内存读取数据和向内存写入数据。从内存读图片 imdecode
写图片到内存 imencode
ext – 图片的扩展名
img – 要保存的图片
buf – 输出缓存,改变大小以适应数据
params – 格式相关的参数,参见imwrite。上面两个函数的示例代码如下所示,来自http://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/encode_decode_test.cpp?r=63 。#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("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) { return 0; } else { mse =sse /(double)(count); psnr = 10.0*log10((255*255)/mse); return psnr; }}释放窗口 destroyWindow destroyAllWindow
C++
OpenCV学习笔记(一):读取、显示、保存图片
OpenCV中最基本的操作:读取、显示、保存图片。OpenCV2.0版本引入与Matlab命令相同的函数,imread、imshow、imwrite,获取图片更将方便。
读取文件 imread
1 | Mat imread(const string& filename, int flags=1 ) |
1 | voidnamedWindow(conststring&winname,intflags=WINDOW_AUTOSIZE) |
CV_WINDOW_NORMAL 只在Qt中使用,可以改变窗口大小
显示图片 imshow
1 | void imshow(const string& winname, InputArray mat) |
16-bit unsigned or 32-bit integer 像素点值除以256,即把[0,255*256] 映射到 [0,255]
32-bit floating-point 像素点值乘以255,即把[0,1] 映射到 [0,255]所以,imshow可以正常显示取值范围[0,255]的uchar型图像、取值范围[0,1]的float或double类型图像,中间一种数据格式没用过。显示图像后,为了避免程序向下运行以致窗口一闪而过,需要等待一旦时间,waitKey正是这个功能。等待键盘按键 waitKey
1 | intwaitKey(intdelay=0) |
delay大于0时,在delay微秒内等待用户按键。
处理过的图像需要保存到文件中。
保存图像 imwrite
1 | bool imwrite(const string& filename, InputArray img, const vector& params=vector() ) |
PNG:compression level ( CV_IMWRITE_PNG_COMPRESSION ) 从0到9。 数值越高,文件大小越小,压缩时间越长。默认值为3。
PPM, PGM, or PBM:二进制标志 ( CV_IMWRITE_PXM_BINARY ),0 或 1。默认值为1。还有一组函数,用于从内存读取数据和向内存写入数据。从内存读图片 imdecode
1 | Matimdecode(InputArraybuf,intflags) |
1 | bool imencode(const string& ext, InputArray img, vector& buf, const vector& params=vector()) |
img – 要保存的图片
buf – 输出缓存,改变大小以适应数据
params – 格式相关的参数,参见imwrite。上面两个函数的示例代码如下所示,来自http://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/encode_decode_test.cpp?r=63 。#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("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) { return 0; } else { mse =sse /(double)(count); psnr = 10.0*log10((255*255)/mse); return psnr; }}释放窗口 destroyWindow destroyAllWindow
C++
1 2 3 4 | voiddestroyWindow(conststring&winname) voiddestroyAllWindows() |
相关文章推荐
- c# winform下sql图片二进制存储/读取/显示/写入XML/读取XML显示
- learn opencv-使用OpenCV(C ++ / Python)读取,写入和显示视频
- Opencv2.3.1读取图片并显示
- OpenCV-001:读取图片并显示
- vs2015+opencv3.2+mfc读取摄像头显示在图片控件Picture Control
- Opencv读取文件夹连续图片,RGB分量显示,图像灰度化
- MySQL数据库写入图片并读取图片显示到JLabel上的详解
- c# winform下sql图片二进制存储/读取/显示/写入XML/读取XML显示
- OpenCv中批量读取图片数据并显示出来的C++程序
- Java开发Opencv之(二)读取与显示图片
- 在QT集成开发环境中用OpenCV读取一张图片并显示
- OpenCV 中读取一张图片的像素点,并显示
- OpenCV-Python learning-1.安装,图片读取显示
- MySQL数据库写入图片并读取图片显示到JLabel上的详解
- 关于OpenCV读取图片的注意事项
- Opencv读取文件夹连续图片,RGB分量显示,图像灰度化
- Opencv-Python(一) 读取, 写入图片
- 基于Qt与OpenCV的图片读取、保存,并利用Canny进行简单的边缘处理结果显示
- OpenCV基础篇之读取显示图片
- opencv-python实现图像的读取,显示与写入