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);直接创建。