Highgui_1_用户界面

一用户界面

1>namedWindow
创建一个窗口

void namedWindow(const string& winname, 
                 int flags=WINDOW_AUTOSIZE )
//winname窗口的名称
//flags:
//WINDOW_NORMAL,可以自己设定窗口大小(利用ResizeWindow)
//WINDOW_AUTOSIZE,被设定后,窗口大小会根据image大小自动调整,
//用户无法设置
//WINDOW_OPENGL,设定后可以支持opengl和自己设定窗口大小
//可以调用destroyWindow()或者destroyAllWindows()销毁窗口                 

2>waitKey
等待时间

int waitKey(int delay=0)
//delay以毫秒为单位的延迟,0代表永远

3>imshow
显示图片

void imshow(const string& winname, InputArray mat)
//如果图像为8-bit unsigned,直接显示
//如果图像为16-bit unsigned或32-bit integer,[0,255*256]映
//射到[0,255]
//如果图像为32-bit floating-point,[0,1]映射到[0,255]
//如果创建时没有相应winname的Window,则imshow,会自动创建一个
//WINDOW_AUTOSIZE的窗口

4>createTrackbar
给指定窗口创建滑动条

int createTrackbar(const string& trackbarname, 
                   const string& winname, int* value, 
                   int count, TrackbarCallback onChange=0, 
                   void* userdata=0)
//trackbarname,滑动条的名称
//winname,所指定窗口的名称
//value,指向表示滑块位置的变量的指针,滑块的初始位置为*value的初始值
//count,滑块可以到达的最大值,最小值永远为0
//onChange,指向回调函数的指针,每次滑块改变位置,这个函数都会回
//调,并且原型都为,void XXX(int,void*)第一个参数为轨迹条的位
//置,第二个参数为用户数据,如果回调NULL,则无回调函数,只是
//*value 改变
//userdata,用户传给回调函数的数据                   

5>SetMouseCallback
为特定窗口设置鼠标

void setMouseCallback(const string& winname,  
                      MouseCallback onMouse, 
                      void* userdata=0 )
//winname,窗口的名称
//onMouse,指向回调函数的指针,形式为void XXX(int event,int 
//x,int y,int flags,void *param),event是EVENT_+变量之一,x
//和y是鼠标指针在图像坐标系中的坐标,flags是EVENT_FLAG的组合,
//param是用户传递给回调函数的参数,EVENT_MOUSEMOVE为鼠标移动消
//息,EVENT_LBUTTONDOWN为鼠标左键按下消息
//userdata,是用户传递给回调函数的参数                      

6>imread
从文件加载一张图片

Mat imread(const string& filename, int flags=1 )
//filename,文件名
//flags:
//CV_LOAD_IMAGE_ANYDEPTH,如果图像具有相应的深度,就设定为16-
//bit/32-bit,否则为8-bit 
//CV_LOAD_IMAGE_COLOR,彩色图
//CV_LOAD_IMAGE_GRAYSCALE,灰度图
//>0,会加载为三通道彩色图
//=0,会加载为灰度图
//<0,BGRA四通道图像

二视频操作

1,VideoCapture类
1>构造函数

VideoCapture(const string& filename)
//filename,为视频文件名或者image序列,exp:img_%02d.jpg,会读取
//img_00.jpg, img_01.jpg, img_02.jpg, ...

VideoCapture(int device)
//device,摄像头的索引,如果只有一个摄像头那就是1

2>VideoCapture::open
用于打开视频文件,或者摄像头

bool VideoCapture::open(const string& filename)
bool VideoCapture::open(int device)
//同构造函数

3>VideoCapture::read
从视频帧中读取Mat

VideoCapture& VideoCapture::operator>>(Mat& image)
bool VideoCapture::read(Mat& image)
//可以进行运算符重载

//exp:
VideoCapture capture(0);
Mat image;
capture>>image;

4>得到和设定视频序列的信息

double VideoCapture::get(int propId)
//得到信息
bool VideoCapture::set(int propId, double value)
//设定信息

//propId为要操作的属性的flag,CV_CAP_PROP_POS_+特定的属性

2,VideoWriter类
用于视频文件的写,只支持avi格式,不能大于2G,不能添加音频
1>构造函数

VideoWriter(const string& filename, int fourcc, double fps, 
            Size frameSize, bool isColor=true)
//filename,输出文件的名称
//fourcc(支持格式):CV_FOURCC('P','I','M','1')和
//CV_FOURCC('M','J','P','G')等
//fps,视频的帧速率
//isColor,是否在彩色空间工作(仅支持Windows)            

2>VideoWriter::write
写入下一视频帧

VideoWriter& VideoWriter::operator<<(const Mat& image)
void VideoWriter::write(const Mat& image)
//可运算符重载

三图片相似度检测

1,PSNR
峰值信噪比,衡量图像失真和噪声水平的客观标准,两个图像之间PSNR值越大,则越相似
这里写图片描述
(n:为图像depth)
MSE代表均方差:
这里写图片描述
(针对m*n单色图像)

实现:

double getPSNR(const cv::Mat &image1, const cv::Mat &image2)
{
    //保证两张图片的size相同
    if(image1.size().width!=image2.size().width
       ||image1.size().height!=image2.size().height)
        return -1;

    cv::Mat Image;
    //求两张图片每个元素差的绝对值
    cv::absdiff(image1,image2,Image);
    Image.convertTo(Image,CV_32F);
    //求每个元素的平方
    Image=Image.mul(Image);
    //相同通道内,各元素相加
    cv::Scalar channels=cv::sum(Image);

    double sum=channels.val[0]+channels.val[1]+
               channels.val[3];
    //若和非常小,则图片非常相似
    if(sum<1e-10) return 1000000;
    else
    {
        //带入公式
        sum=sum/Image.size().area();
        sum=10*std::log10(255*255/sum);
        return sum;
    }
}

2,SSIM
相比PSNR更加精确,但是效率慢,取值范围(-1,1),两张图片一样时为1
结构相似性,给定两个图像 和 , 两张图像的结构相似性可按照以下方式求出:
这里写图片描述
其中 这里写图片描述是x的平均值,这里写图片描述是y的平均值,这里写图片描述是x的方差,这里写图片描述是y的方差,这里写图片描述是x和y的标准差,这里写图片描述这里写图片描述 是用来维持稳定的常数。 L 是像素值的动态范围,c1=6.5025,c2=58.5225
实现:

Scalar getMSSIM( const Mat& i1, const Mat& i2)
{
 const double C1 = 6.5025, C2 = 58.5225;

 int d= CV_32F;
 Mat I1, I2;
 //增大深度便于计算
 i1.convertTo(I1, d);           
 i2.convertTo(I2, d);
 //求每个元素的相乘
 Mat I2_2   = I2.mul(I2);       
 Mat I1_2   = I1.mul(I1);       
 Mat I1_I2  = I1.mul(I2);       

 //高斯滤波
 Mat mu1, mu2;  
 GaussianBlur(I1, mu1, Size(11, 11), 1.5);
 GaussianBlur(I2, mu2, Size(11, 11), 1.5);

 Mat mu1_2   =   mu1.mul(mu1);
 Mat mu2_2   =   mu2.mul(mu2);
 Mat mu1_mu2 =   mu1.mul(mu2);

 Mat sigma1_2, sigma2_2, sigma12;

 GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
 sigma1_2 -= mu1_2;

 GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
 sigma2_2 -= mu2_2;

 GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
 sigma12 -= mu1_mu2;

 Mat t1, t2, t3;
 //t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
 t1 = 2 * mu1_mu2 + C1;
 t2 = 2 * sigma12 + C2;
 t3 = t1.mul(t2);              

 //t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 +C2))
 t1 = mu1_2 + mu2_2 + C1;
 t2 = sigma1_2 + sigma2_2 + C2;
 t1 = t1.mul(t2);              

 Mat ssim_map;
 // ssim_map =  t3./t1;
 divide(t3, t1, ssim_map);      
 // mssim = average of ssim map
 Scalar mssim = mean( ssim_map ); 
 return mssim;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值