【opencv学习笔记4】视频流的帧图像变换

来源:互联网 发布:大数据在行业应用 编辑:程序博客网 时间:2024/05/16 10:28

通过前面视频流的每一帧的读取,现在我们需要考虑对视频流的滤波,通过修改前面程序,实现随着视频流的播放对其中的每一帧进行一些简单操作。

现在最简单的变化就是对每一帧进行一些简单的运算,最开始可以通过对某一幅图像进行平滑处理,平滑处理模块与简单的基本测试模块代码如下:

#include <opencv2\opencv.hpp>  #include <iostream>  #include <string>  #include<highgui.h>#include <cv.h>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 <opencv2\opencv.hpp>  #include <iostream>  #include <string>  #include<highgui.h>#include <cv.h>#include <cxcore.h>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;}


以下为通过高斯平滑滤波以及缩放2倍的图像处理,处理后的图像为原来的一半,且有平滑的图像。



下面进行利用canny边缘检测输出写入一个单通道(灰度级)图像,在这个程序中边缘检测其产生了一个与输入图像大小相同但只有一个通道的图像。代码如下:

#include <opencv2\opencv.hpp>  #include <iostream>  #include <string>  #include<highgui.h>#include <cv.h>#include <cxcore.h>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;}



0 0
原创粉丝点击