环境介绍
OpenCV用的是最新的4.5.0版本,所有程序都是在linux系统下运行(这不重要,只是环境路径不一样罢了),因为qt拥有强大的跨平台功能,所以采用qmake进行的编译,和cmake的区别就是makelists和.pro文件的格式不同而已。opencv和qt的下载和配置这里不多说了,网上有很多。
图片显示
想要打开一张图片应该用什么函数呢,然后又要包含什么头文件和动态链接库呢,如果直接用网上的例子并不能很清晰的知道相关的联系。于是我们要借助官网的帮助文档,选择自己安装的版本即可。
图像的读取
当打开帮助文档时就能发现,图片的读取和视频的读取。
我们现在要找图片的读取,所以点进去找函数,找到function这一块
函数找到了可以具体看看怎么用,以及看看这个函数的具体所需头文件
通过函数的具体介绍我们知道了,第一个参数是图像文件的路径,第二个参数是默认的图片读取格式(默认为3通道的RGB格式),当然我们可以直接通过修改第二个参数值直接读取为图像的单通道灰度图。
函数的输出是Mat类型,这个是opencv中的一个类,点击mat继续通过帮助文档去找这个类所属的头文件。
于是代码有:
#include <opencv2/imgcodecs.hpp> //imread()函数头文件
#include <opencv2/core/mat.hpp> //mat图片类头文件
using namespace cv;
int main()
{
Mat picture = imread("/home/zrq/opencv_build/opencv/samples/data/apple.jpg");
return 0;
}
到这步图像的已被读取了,别忘了要加上-lopencv_imgcodecs -lopencv_core
这两个动态链接库。
图像的输出
像图像的读取一样,查帮助文档,图像的输出是什么,是图形用户界面(gui),我们需要一个窗口来显示这张图片。
当我们具体看imshow函数的时,在描述中有这么一句话
函数后面要跟waitkey()函数,不然显示就一闪而过了。(然后动态链接库再加上 -lopencv_highgui)于是代码有:
#include <opencv2/imgcodecs.hpp> //imread()函数头文件
#include <opencv2/core/mat.hpp> //mat图片类头文件
#include <opencv2/highgui.hpp> //imshow()和waitKey()函数头文件
using namespace cv;
int main()
{
Mat rgbpicture = imread("/home/zrq/opencv_build/opencv/samples/data/apple.jpg");
Mat graypicture = imread("/home/zrq/opencv_build/opencv/samples/data/apple.jpg",IMREAD_GRAYSCALE);
imshow("输出原图",rgbpicture);
imshow("输出灰度图",graypicture);
waitKey();
return 0;
}
输出
视屏显示
视频读取
类似的图像的读取一样,我们借助帮助文档,去找要用什么函数
我们发现所要的函数是一个类,那么视频的读取可以用过类创建对象,用open函数实现视频的读取,也可以直接利用类的构造函数。
添加头文件和动态链接库,于是代码有:
#include <opencv2/highgui.hpp> //imshow()和waitKey()函数头文件
using namespace cv;
int main()
{
//VideoCapture capture("/home/zrq/opencv_build/opencv/samples/data/Megamind.avi");
VideoCapture capture;
capture.open("/home/zrq/opencv_build/opencv/samples/data/Megamind.avi");
return 0;
}
视频输出
经过gui的查询,里面并没有发现视频的输出,那么就要想到,视频是由一帧一帧图像所构成的,所以在输出时可以由连续的图像输出就是视频的输出,于是我们可以到帮助文档中去查有没有关于将视频信息读取为图像信息的函数。
于是代码有:
#include <opencv2/core/mat.hpp> //Mat类的头文件
#include <opencv2/videoio.hpp> //VideoCaptrue类的头文件
#include <opencv2/highgui.hpp> //imshow()和waitKey()函数头文件
using namespace cv;
int main()
{
//VideoCapture capture("/home/zrq/opencv_build/opencv/samples/data/Megamind.avi");
VideoCapture capture;
capture.open("/home/zrq/opencv_build/opencv/samples/data/Megamind.avi");
while(capture.grab()){
Mat frame;
//capture >> frame;
capture.read(frame);
imshow("输出", frame);
waitKey(30);
}
return 0;
}
结果
以上所有图片和视频都采用的opencv自带的例程中的图片和视频,在相应位置可以找到。
可以发现,想要实现什么功能,直接查帮助文档,也没有那么繁琐,写多了就会了,而且也能学到很多,关于函数的头文件,动态链接库,很多功能也能用不同的方式来实现。
如有错误,欢迎指正