opencv读取,显示,写入图片(关于imwrite函数)

来源:互联网 发布:条形码集中打印软件 编辑:程序博客网 时间:2024/05/27 00:31

转载于:http://windrocblog.sinaapp.com/?p=465

OpenCV学习笔记(一):读取、显示、保存图片

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


0 0
原创粉丝点击