播放视频和打开摄像头

  1 #include "stdafx.h"
  2 #include <opencv2/highgui/highgui.hpp>
  3 #include <opencv2/core/core.hpp>
  4 using namespace cv;
  5 
  6 
  7 void PlayPhoto1()
  8 {
  9     NamedWindow("123");
 10     //读取并保存图片,路径此处可以绝对或相对路径
 11     Mat srcImage=imread("1.jpg");
 12     imshow("123",srcImage);
 13     waitKey(0);
 14 }
 15 void PlayPhpoto2()
 16 {
 17     IplImage *image = cvLoadImage("C:\\Users\\Administrator\\Pictures\\20170405010609189.jpg");
 18     cvNamedWindow("123");
 19     cvShowImage("123", image);
 20 }
 21 
 22 
 23 void PlayVideo1()
 24 {
 25     NamedWindow("123");
 26     //VideoCapture capture("E:\\我们在一起的时光.mp4");
 27 
 28     //打开视频,路径为绝对路径,\\避免转义。与效果上句等同。
 29     VideoCapture capture;
 30     capture.open("E:\\我们在一起的时光.mp4");
 31     
 32     //循环把视频按帧读取
 33     while (1)
 34     {
 35         Mat frame;        //用于保护每一帧的内容
 36         capture>>frame;        //把读取的当前帧放入frame中
 37         imshow("123", frame);
 38         waitKey(30);        //30ms播放一帧
 39     }
 40 }
 41 
 42 void PlayVideo2()
 43 {
 44     //播放窗口名称
 45     cvNamedWindow("avi");    
 46     //读取视频
 47     CvCapture *capture = cvCreateFileCapture("E:\\我们在一起的时光.mp4");
 48     //保存视频的帧
 49     IplImage * frame;
 50     while (1)
 51     {
 52         frame = cvQueryFrame(capture);        //保存视频的下一帧
 53         if (!frame)
 54             break;
 55         cvShowImage("avi", frame);
 56         
 57         char ch = cvWaitKey(33);
 58         if (ch == 27)
 59             break;
 60     }
 61     cvReleaseCapture(&capture);
 62     cvDestroyWindow("avi");
 63 }
 64 
 65 void OpenCamera1()
 66 {
 67     //VideoCapture capture(0);
 68 
 69     //效果与上句等同
 70     VideoCapture capture;
 71     capture.open(0);        //此处路径设为0即为摄像头路径    
 72     
 73     //循环把视频按帧读取
 74     while (1)
 75     {
 76         Mat frame;        //用于保护每一帧的内容
 77         capture>>frame;        //把读取的当前帧放入frame中
 78         imshow("123", frame);
 79         waitKey(30);        //30ms播放一帧
 80     }
 81 }
 82 void OpenCamera2()
 83 {
 84     //播放窗口名称
 85     cvNamedWindow("avi");    
 86     CvCapture *capture = cvCreateFileCapture(0);    //此处路径设为0即为摄像头路径    
 87     //保存视频的帧
 88     IplImage * frame;
 89     while (1)
 90     {
 91         frame = cvQueryFrame(capture);        //保存视频的下一帧
 92         if (!frame)
 93             break;
 94         cvShowImage("avi", frame);
 95         
 96         char ch = cvWaitKey(33);
 97         if (ch == 27)
 98             break;
 99     }
100     cvReleaseCapture(&capture);
101     cvDestroyWindow("avi");
102 }
103 
104 另:cvQueryFrame第二次执行时不会另外开辟内存,即始终使用同一内存。而IplImage不断重新开辟内存。
105 
106 int _tmain(int argc, _TCHAR* argv[])
107 {
108 
109     //显示图片
110     PlayPhoto1();
111     PlayPhpoto2();
112 
113     //播放视频的2种方法
114     PlayVideo1();
115     PlayVideo2();
116 
117     //打开摄像头的2种方法
118     OpenCamera1();
119     OpenCamera2();
120     return 0;
121 }
 注:IplImage与Mat的区别:
 在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构;在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写的,提供的接口也是C语言接口;
 
 Mat:
 Mat是后来OpenCV封装的一个C++类,用来表示一个图像,和IplImage表示基本一致,但是Mat还添加了一些图像函数;
 
 mat和iplimage两者对于内存图像数据创建稍有不同:
 IplImage,通过cvCreateImage,创建后复制像素到创建的内存,或者cvCreateImageHeader和cvSetImageData创建;
 cv::Mat,直接可以通过构造函数Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP);直接创建。

 

posted @ 2017-04-22 14:05  gd_沐辰  阅读(526)  评论(0编辑  收藏  举报