播放视频和打开摄像头
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);直接创建。