一、运行环境
环境是Visual Studio 2015和OpenCV4.0.1
一般在VS里边就可以看到函数的功能及用法描述,你也可以查看官方文档来获取帮助。https://docs.opencv.org/4.0.1/
二、示例代码
1. 显示一张图片
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
const char* ImgPath = "AWVS1455.JPG";
const char* WindowName = "Example";
Mat img = imread(ImgPath);
if (img.empty())
{//判断是否加载成功,如果未加载图片则提示加载失败
cerr << "Read img file error !" << endl;
system("pause");
return -1;
}
namedWindow(WindowName, WINDOW_NORMAL);//这个函数可以不加,不加的话创建的窗口就是默认属性
imshow(WindowName, img);
waitKey(0);
return 0;
}
CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
功能:加载一张指定的图片,并返回一个包含图片信息的Mat对象
参数:参数一指定需要加载的图片位置及名称,参数二指定加载方式,默认值IMREAD_COLOR是以RGB方式加载
返回值:成功时返回一个包含打开图片信息的Mat对象,可通过返回对象的成员函数empty查看是否成功加载
CV_EXPORTS_W void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
功能:按窗口名称设置用于显示图片的窗口属性,如果使用的名称未被其他窗口占用,该函数将创建一个窗口
参数:参数一指定窗口名称,参数二指定窗口的属性,默认值WINDOW_AUTOSIZE是包含图片的窗口不能改变大小(大的图片会显示不全,本例中使用的是WINDOW_NORMAL,显示完整图片,可改变窗口大小)
CV_EXPORTS_W void imshow(const String& winname, InputArray mat);
功能:在指定的窗口中显示图片(根据窗口名称确定窗口)
参数:参数一指定用以显示图片的窗口,参数二指定需要显示的图片
CV_EXPORTS_W int waitKey(int delay = 0);
功能:是程序在调用处暂停一段时间
参数:0或者负数时,等待键盘按键按下后结束暂停;正数时,等待数值给出的毫秒数后结束暂停
返回值:参数为0或者负数时,返回键盘键入按键的ASCII值;参数为正数时,函数结束后返回 - 1
2. 播放一段视频
#include
using namespace cv;
#include
using namespace std;
int main()
{
VideoCapture cap; //创建存储视频文件或者设备的对象
cap.open("D:\\StudyOpencv\\002-PlayVideo\\002-PlayVideo\\1234.MP4"); //打开视频文件或者视频设备
if (!cap.isOpened())
{
cout << "could not open the VideoCapture !" << endl;
system("pause");
return -1;
}
const char* windowsName = "Example";
int k = -1;
while (true)
{
Mat frame;
bool ok = cap.read(frame);
if (!ok) //判断视频文件是否读取结束
break;
imshow(windowsName, frame); //从视频对象中获取图片显示到窗口
k = waitKey(33); //每33毫秒一张图片
if (k == 27) break; //按下退出键:Esc
}
waitKey(-1);
return 0;
}
CV_WRAP virtual bool open(const String& filename, int apiPreference = CAP_ANY);
功能:打开一个指定的视频文件或者打开一个指定的视频设备
参数:参数一指定打开的路径及对象,参数二指定了第一个参数的类型或属性,默认参数CAP_ANY表示由系统或程序自动识别类型
返回值:当指定的文件或设备成功打开时返回true,也可以用isOpened函数去查看是否成功打开
CV_WRAP virtual bool read(OutputArray image);
功能:读取视频文件或视频设备的数据
参数:存储视频文件或视频设备的信息对象
返回值:如果没有画面可以读取时返回 false
三、自学问题记录
程序虽然简单,但第一次接触,还是遇到了问题。代码如下(老版本的播放视频方法),一开始是在OpenCV3.4版本上写的视频播放代码,语法没有报错,一旦调试就会报错。调查发现是因为高版本的OpenCV已经不建议使用下列C语言风格的代码,而是建议用上面C++面向对象风格编写代码。同样的代码放在OpenCV4.0.1上就直接会提示语法错误,相对3.4版本不做语法报错但编译不通过的情况,4.0版本应该已经做了完善,毕竟无用的代码最好还是在未编译时就告诉你,否则很容易让我们一脸懵逼(往下贴出了错误信息)。
示例:
#include
#include
using namespace cv;
int main(int argc, char *argv[])
{
const char *videoName = "vtest.avi";
const char *windowName = "Example";
cvNamedWindow(windowName, CV_WINDOW_NORMAL);
CvCapture* capture = cvCreateFileCapture(videoName);
IplImage* frame;
while (1)
{
frame = cvQueryFrame(capture);
if(!frame)
break;
cvShowImage(windowName, frame);
char c = cvWaitKey(33);
if(c == 27)
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow(windowName);
system("pause");
return 0;
}
OpenCV3.4版本编译后的错误信息:(这里之所以贴出来,是为了让遇到相同疑惑的兄弟更容易检索到这篇文章)
[ INFO:0] VIDEOIO: Enabled backends(6, sorted by priority): FFMPEG(1000); MSMF(990); DSHOW(980); VFW(970); CV_IMAGES(960); CV_MJPEG(950)
[ WARN:0] cvCreateFileCaptureWithPreference: backend FFMPEG doesn't support legacy API anymore.
[ WARN:0] cvCreateFileCaptureWithPreference: backend MSMF doesn't support legacy API anymore.