1. 头文件
// C++风格的结构以及数学运算
#include "opencv2/core/core.hpp"
// 最邻近搜索匹配函数
#include "opencv2/flann/miniflann.hpp"
// C++风格的图像处理函数
#include "opencv2/imgproc/imgproc.hpp"
// 操作和恢复图片相关算法
#include "opencv2/video/photo.hpp"
// 视觉追踪以及背景分割
#include "opencv2/video/video.hpp"
// 用于追踪的二维特征
#include "opencv2/features2d/eatures2d.hpp"
// 级联人脸分类器、latent SVM分类器、HoG特征和平面片检测器
#include "opencv2/objdetect/objdetect.hpp"
// 校准以及双目视觉相关
#include "opencv2/calib3d/calib3d.hpp"
// 机器学习、聚类以及模式识别相关
#include "opencv2/ml/ml.hpp"
// C++风格的显示、滑动条、鼠标操作以及输入输出相关
#include "opencv2/highgui/highgui.hpp"
// 用户贡献的代码、皮肤检测、模糊Mean-Shift追踪、spin image算法及自相似特征等
#include "opencv2/contrib/contrib.hpp"
- opencv.hpp包含所有可能在OpenCV函数中用到的头文件,比单一.hpp文件的编译速度慢。
2. 相关函数
// 读取图片,BGR编码,默认IMREAD_COLOR,常用 IMREAD_GRAYSCALE
cv::Mat img = cv::imread("../fruits.jpg", -1);
// 判断图片是否为空
if (img.empty())
return -1;
// WINDOW_AUTOSIZE自动调整窗口大小,不可修改;WINDOW_NORMAL可修改窗口大小; WINDOW_FULLSCREEN满屏
// WINDOW_FREERATIO使用任意比例;WINDOW_KEEPRATIO保持图片比例
// WINDOW_GUI_NORMAL无工具栏状态栏;WINDOW_GUI_EXPANDED含工具栏和状态栏
cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
// 显示图片,等待输入
cv::imshow(name, img);
cv::waitKey(0);
// 销毁窗口
cv::destroyWindow(name);
// 定义视频读取结果
cv::VideoCapture cap;
打开视频
cap.open("../test.avi");
// 读取视频帧
cap >> frame;
// 设置当前的视频帧
cap.set(cv::CAP_PROP_POS_FRAMES, pos);
// 获取视频帧数,宽,高
int frames = (int)cap.get(cv::CAP_PROP_FRAME_COUNT);
int tmpw = (int)cap.get(cv::CAP_PROP_FRAME_WIDTH);
int tmph = (int)cap.get(cv::CAP_PROP_FRAME_HEIGHT);
// 滑动条回调函数
void onTrackbarSlider(int pos, void *)
// 创建滑动条
cv::createTrackbar("Position", name, &g_slider_position, frames, onTrackbarSlider);
// 设置滑动条位置
cv::setTrackbarPos("Position", name, current_pos);
// 通过高斯模糊实现对图片的平滑处理
// 高斯核必须为奇数,因为高斯卷积会在其覆盖区域的中心输出结果
cv::GaussianBlur(image, out, cv::Size(5, 5), 3, 3);
// 高斯模糊及降采样
cv::pyrDown(img1, img2);
// 图像颜色转换
cv::cvtColor(img_rgb, img_gry, cv::COLOR_BGR2GRAY);
// 边缘检测
cv::Canny(img_gry, img_cny, 10, 100, 3, true);
// 读取某一点(x,y)的像素值
cv::Vec3b intensity = img_rgb.at<cv::Vec3b>(y, x);
uchar blue = intensity[0];
uchar green = intensity[1];
uchar red = intensity[2];
unsigned int pixel = (unsigned int)img_gry.at<uchar>(y, x)
//打开摄像头
cv::VideoCapture cap;
cap.open(0); // 只有一个摄像头时选0,在多个摄像头中任选一个选-1
if (!cap.isOpened()) //判断摄像头是打开成功
{
std::cerr << "Couldn't open capture." << std::endl;
return -1;
}
// 将每一帧图像插入VideoWriter
cv::VideoWriter writer;
// 输出的视频,视频编码方式,视频帧数,视频大小
writer.open(video_out, CV_FOURCC('M', 'J', 'P', 'G'), fps, size);
writer << frame;
// 将图片内容转换为对数极坐标形式
cv::logPolar(bgr_frame, logpolar_frame, cv::Point2f(bgr_frame.cols / 2, bgr_frame.rows / 2), 40, cv::WARP_FILL_OUTLIERS);
- 避免使用using namespace cv,指明cv::命名空间是一种良好的编程风格。
- 在复杂代码中,程序员应在窗口的生命周期自然结束之前自主销毁窗口以防止内存泄漏。
- 定义全局变量时需加g_前缀。
- core模块包含基础数据类型以及算法;improc模块包含图像处理和视频处理算法;ml模块包含机器学习和聚类算法;highgui模块包含输入输出功能。