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
- Highgui_1_用户界面
- 用户界面
- 用户界面
- 用户界面
- 用户界面
- 用户界面
- 用户界面规范
- 《 用户界面设计 》
- 用户界面设计
- 指南:用户界面
- asp用户界面
- 用户界面开发
- 用户界面检查表
- 图形用户界面
- 用户界面规范
- 用户界面设计规范
- 用户界面设计
- 用户界面设计
- Java中异常处理
- python工具(1) — 图片的位深度压缩
- VBOX虚拟机的网络设置
- ajax 局部页面更新
- leetcode 100 same tree
- Highgui_1_用户界面
- Kubernetes 1.3 从入门到进阶 安装篇(1)
- js变量
- leetcode 101. Symmetric Tree
- Bellman-Ford算法实现
- 机器学习算法基础概念学习总结
- 使用django-grappelli美化diango后台
- django STATIC_URL STATIC_ROOT MEDIA_URL MEDIA_ROOT
- 21File练习