一用户界面
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;
}