通过前面视频流的每一帧的读取,现在我们需要考虑对视频流的滤波,通过修改前面程序,实现随着视频流的播放对其中的每一帧进行一些简单操作。
现在最简单的变化就是对每一帧进行一些简单的运算,最开始可以通过对某一幅图像进行平滑处理,平滑处理模块与简单的基本测试模块代码如下:
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
//对图像进行平滑处理
void smoothimage(IplImage *image){
cvNamedWindow("original picture");//创建原始图像窗口
cvNamedWindow("smooth picture");//创建处理图像窗口
cvShowImage("original picture",image);//显示原始图像
//创建新图像
IplImage *out=cvCreateImage(
cvGetSize(image), //图像大小跟原始图像一样
IPL_DEPTH_8U, //图像深度为8位
3 //表示有三个通道
);
//做平滑处理
cvSmooth(image,
out,
CV_GAUSSIAN,
3,
3);//用高斯进行平滑,对每个像素点使用3*3区域进行高斯平滑处理
cvShowImage("smooth picture",out);//显示处理后的图像
cvReleaseImage(&out);//释放处理后图像的内存
cvWaitKey(0);
cvDestroyWindow("original picture");
cvDestroyWindow("smooth picture");
}
//对平滑模块的小测试
int main(int agrc,char **argv){
IplImage *image=cvLoadImage("ali.jpg");
smoothimage(image);
cvReleaseImage(&image);
return 0;
}
以下是对图像进行平滑效果的处理:
若当对图像进行缩放系数为2 的缩放处理,可以通过函数cvPyrDown()完成上述功能。代码如下:
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
//cvPyrDown创建一幅宽度与高度为输入图像一半的图像
IplImage *doPyrDown(
IplImage *in,
int filter=CV_GAUSSIAN){
assert(in->width%2==0&&in->height%2==0);//确保图像宽度高度刚好是2的倍数
IplImage *out=cvCreateImage(
CvSize(in->width/2,in->height/2),
in->depth,
in->nChannels
);
cvPyrDown(in,out);//cvPyrDown完成缩放的比例
return out;
}
//测试缩放小模块
int main(int agrc,char **argv){
IplImage *image=cvLoadImage("ali.jpg");
IplImage *out=doPyrDown(image);
cvNamedWindow("original picture",CV_WINDOW_AUTOSIZE);
cvNamedWindow("handled picture",CV_WINDOW_AUTOSIZE);
cvShowImage("original picture",image);
cvShowImage("handled picture",out);
cvWaitKey(0);//使程序暂停,当用户按键则进行以下操作
cvReleaseImage(&image);
cvReleaseImage(&out);
cvDestroyWindow("original picture");
cvDestroyWindow("handled picture");
return 0;
}
下面进行利用canny边缘检测输出写入一个单通道(灰度级)图像,在这个程序中边缘检测其产生了一个与输入图像大小相同但只有一个通道的图像。代码如下:
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
//canny边缘检测将输出写入一个单通道(灰度级)图像
IplImage *doCanny(
IplImage *in,
double lowthresh,
double highthresh,
double aperture
){
if (in->nChannels!=1)return (0);
IplImage *out=cvCreateImage(
CvSize(cvGetSize(in)),
IPL_DEPTH_8U,//8比特的编码
1//表示单通道
);
cvCanny(in,out,lowthresh,highthresh,aperture);
//void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );
//image 输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。
//edges 输出的边缘图像 ,也是单通道的,但是是黑白的
//threshold1 第一个阈值
//threshold2 第二个阈值
//aperture_size Sobel 算子内核大小
return out;
}
int main(int argc,char **argv){
cvNamedWindow("picture1",CV_WINDOW_AUTOSIZE);
cvNamedWindow("picture2",CV_WINDOW_AUTOSIZE);
IplImage *in1=cvLoadImage("lena.jpg");
IplImage *in2=cvCreateImage(
CvSize(cvGetSize(in1)),
IPL_DEPTH_8U,
1);
cvCvtColor(in1,in2,CV_RGB2GRAY);
IplImage *out=cvCreateImage(
CvSize(cvGetSize(in2)),
IPL_DEPTH_8U,
1);
out=doCanny(in2,10,200,3);
cvShowImage("picture1",in1);
cvShowImage("picture1",in2);
cvShowImage("picture2",out);
cvWaitKey(0);
cvReleaseImage(&in1);
cvReleaseImage(&out);
cvDestroyWindow("picture1");
cvDestroyWindow("picture12");
return 0;
}