//从视频文件中读入数据-->将数据转换为灰度图-->对图像做candy边缘检测
//作者:sandy
//时间:2015-10-10
#include <cv.h>
#include <highgui.h>
int main(int argc, char *argv[]){
//预备工作
CvCapture* capture=cvCreateFileCapture("E:\\Videos\\xx.avi");//让capture变量指向视频文件
if(!capture) return -1;//检查函数是否成功
//读视频
//方法一:用cvGrab(攫取)Frame()将视频复制到内存空间,
//再用cvRetrieve(检索)Frame()来处理读入的数据
//方法二:用cvQueryFrame()来代替方法一种的两个函数
//申明变量
IplImage *vd_frame;//用来存放彩色的视频
IplImage *gray_frame;//用来存放灰度图
IplImage *canny_frame;//canny边缘检测后的图
//声明窗口
cvNamedWindow("video",0);
cvNamedWindow("gray",0);
cvNamedWindow("canny",0);
//变量初始化
vd_frame = cvQueryFrame(capture);
gray_frame = cvCreateImage(cvGetSize(vd_frame),IPL_DEPTH_8U,1);
canny_frame = cvCreateImage(cvGetSize(vd_frame),IPL_DEPTH_8U,1);
while(1){
//不同图像格式的转换函数cvConvertImage(const CvArr* src(源),CvArr dst(目标), int flag=0)
//canny边缘检测函数cvCanny(const CvArr * image,CvArr *edges,double 阈值一,double 阈值二,int 算子内核大小)
//小阈值用来控制边缘链接,大阈值用来控制边缘的初始分割。
cvConvertImage(vd_frame,gray_frame,0);//flag=1则会得到倒立的图像
cvCanny(vd_frame,canny_frame,10,50,3);//阈值一,小一点可以扣更多边缘。。阈值二越大扣的越少
//显示
cvShowImage("video",vd_frame);
cvShowImage("gray",gray_frame);
cvShowImage("canny",canny_frame);
char c=cvWaitKey(28);
if(c==27) break;
vd_frame = cvQueryFrame(capture);
}
//查询和设置视频的各种属性
//释放CvCapture结构
cvReleaseCapture(&capture);
cvDestroyAllWindows();
return 0;
}
![](https://images2015.cnblogs.com/blog/597602/201510/597602-20151011213354721-573600579.png)