Highgui_1_用户界面

来源:互联网 发布:网络电子赌博的危害 编辑:程序博客网 时间:2024/06/07 18:08

一用户界面

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;}
0 0
原创粉丝点击