第一个OpenCV程序
程序
//示例代码1
#include <opencv2/opencv.hpp>
int main() {
cv::Mat img = cv::imread("../5.jpg");
if (img.empty()) return -1;
cv::namedWindow("Example1",cv::WINDOW_AUTOSIZE);
cv::imshow("Example1",img);
cv::waitKey(0);
cv::destroyWindow("Example1");
return 0;
}
效果
显示文件夹的图片,用户按任意键后关闭
代码讲解
头文件
在上方程序中,可以看到包含了文件夹opencv2中的opencv.hpp头文件,
按住Ctrl点击给路径,可以看到其包含各种头文件,因此只需在主程序中
#include <opencv2/opencv.hpp>即可引用大部分OpenCV功能
以下是几个常用文件的解释
#include “opencv2/core/core_c.h”
旧式C风格的结构以及运算
#include “opencv2/core/core.hpp”
新式C++风格的结构以及数学运算
#include “opencv2/flann/miniflann.hpp"
最邻近搜索匹配函数
#include “opencv2/imgproc/imgproc_c.h”
旧式C风格的图像处理函数
#include “opencv2/imgproc/imgproc.hpp”
新式C++风格图像处理函数
#include “opencv2/video/photo.hpp”
操作和恢复照片相关算法
#include “opencv2/video/video.hpp”
视觉追踪以及背景分割
#include"opencv2/features2d/features2d.hpp"
用于追踪的二维特征
#include"opencv2/objdetect/objdetect.hpp"
级联人脸分类器、latent SVM分类器、HoG特征和平面片检测器
#include “opencv2/calib3d/calib3d.hpp”
校准以及双目视觉相关
#include"opencv2/ml/ml.hpp"
机器学习、聚类以及模式识别相关
#include"opencv2/highgui/highgui_c.h"
旧式C风格的显示、滑动条、鼠标操作以及输入输出相关
#include “opencv2/highgui/highgui.hpp”
新式C++风格的显示、滑动条、鼠标操作以及输入输出相关
#include“opencv2/contrib/contrib.hpp"
用户贡献的代码、皮肤检测、模糊Mean-Shift追踪、spin image算法及自相似特征等
尽管包含opencv.hpp可以引用大部分功能,但同时会导致编译速度的降低,因此可以只包含自己用到的功能
函数和变量名
OpenCV的函数都位于cv这个命名空间内,若使用OpenCV的函数,需要在前面加入cv::用来说明你调用的函数是OpenCV里的
使用命名空间这个东西是因为随着模块的增加,防止出现不同模块之间由相同函数或变量名造成的错误
也可以在前面加上 using namespace cv; 表示默认为cv命名空间,如下的示例代码2
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main() {
Mat img = imread("../5.jpg");
if (img.empty()) return -1;
namedWindow("Example1",WINDOW_AUTOSIZE);
imshow("Example1",img);
waitKey(0);
destroyWindow("Example1");
return 0;
}
cv::Mat img = cv::imread(“…/5.jpg”);
这一行将会载入图像,imread会根据文件名来处理不同格式的图像,并返回一个cv::Mat结构
if (img.empty()) return -1;
判断是否成功载入图像,如不超过则返回-1并退出程序
cv::namedWindow(“Example1”,cv::WINDOW_AUTOSIZE);
该函数由HighGUI模块提供,创建名为Example1的窗口,该名称相当于窗口的身份证
第二个参数用来赋予窗口特性,可设置为0
cv::imshow(“Example1”,img);
若cv::Mat中有图像结构,可以通过imshow让图像在窗口上显示,若该窗口不存在,则会调用namedWindow创建一个出来
cv::waitKey(0);
给函数会告知系统暂停并等待按键事件,若参数大于0,则是要停止的时间,
若为0或负数则会一直等待知道按键按下
cv::destroyWindow(“Example1”);
销毁指定窗口,同时防止内存泄露,为了简洁可以省略