OpenCV2学习笔记(一):图像的基本操作

一直没有一个系统的时间来深入学习OpenCV,鉴于项目需要,记录一下一些要点以供日后查阅。 OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。其1.0版本于2006年面世,,而在2009年又发布了重要的版本:OpenCV2,带来了新的C++接口;现在,OpenCV3也发布了,据说其Python接口大大增强、并且加入了Python 3.x的支持,还带来了许多新的提升,不过这并不在这里的讨论范围之内。这里使用的是:OpenCV2.4.9+Qt5.3.2。 OpenCV库自2.2版本起就被划分成多个模块,在进行开发之前,需要将这些模块编译成库文件,然后在lib文件夹中找到这些模块: opencv_core模块:其中包含OpenCV基本数据结构、动态数据结构、绘图与数组操作的相关函数、辅助功能与系统函数、基本的算法函数等核心功能。 opencv_improc模块:包含图像处理函数,主要包含图像滤波、图像的几何变换、直方图、特征检测、目标跟踪等内容。 opencv_highgui模块:高层GUI图形用户界面,包含媒体的I/O输入输出函数,读写图像及视频的函数,以及操作图形用户界面函数。 opencv_features2d模块:即2D功能框架,包含兴趣点检测子,描述子以及兴趣点匹配框架。 opencv_calib3d模块:Calibration(校准)加3D这两个词的组合缩写。这个模块主要是相机校准和三维重建相关的内容,包含相机标定,双目几何估计,物体姿态估计以及立体视觉等函数。 opencv_video模块:包含运动估算,特征跟踪以及前景提取函数与相关的类。 opencv_objdetect模块:主要由级联分类(Cascade Classification)和Latent SVM这两个部分。其中包括物体检测函数,如脸部和行人检测。 opencv_stitching模块:OpenCV2.4.0新增的模块,其主要功能是实现图像拼接。 lopencv_superres模块:即SuperResolution,利用多种算法实现超分辨率技术的相关功能模块。 opencv_ml模块:机器学习模块,主要包括统计模型 (Statistical Models)、一般贝叶斯分类器 (Normal Bayes Classifier)、K-近邻 (K-NearestNeighbors)、支持向量机 (Support Vector Machines)、决策树 (Decision Trees)、提升(Boosting)、梯度提高树(Gradient Boosted Trees)、随机树 (Random Trees)、超随机树 (Extremely randomized trees)、期望最大化 (Expectation Maximization)、神经网络 (Neural Networks)等内容。 opencv_flann模块:高维的近似近邻快速搜索算法库, 主要由两个部分组成:快速近似最近邻搜索和聚类。 opencv_contrib模块:第三方代码,包括一些新添加的不太稳定的可选功能,如新型的人脸识别、立体匹配、人工视网膜模型等技术。 opencv_nonfree模块:包含一些拥有专利的算法,如SIFT、SURF函数源码。 这些模块都对有一个单独的头文件(位于include文件夹)。在Qt中推荐的声明方式如下:

而在Qt中,为了使程序能通过编译,必须指定OpenCV的库文件和头文件的路径。因此在创建Qt工程之后,需要在后缀为.pro的项目文件中添加用于构建OpenCV的应用信息:

INCLUDEPATH+=C:\C:2\C:LIBS+=C:_calib3d249.dll.a\C:_contrib249.dll.a\C:_core249.dll.a\C:_features2d249.dll.a\C:_flann249.dll.a\C:_gpu249.dll.a\C:_highgui249.dll.a\C:_imgproc249.dll.a\C:_legacy249.dll.a\C:_ml249.dll.a\C:_nonfree249.dll.a\C:_objdetect249.dll.a\C:_ocl249.dll.a\C:_video249.dll.a\C:_photo249.dll.a\C:_stitching249.dll.a\C:_superres249.dll.a\C:_ts249.a\C:_videostab249.dll.a

二、读取、显示图片并对图片进行简单的阈值分割 这里使用Qt设计一个简单窗口,如图1所示,该窗口包含打开图像和处理图像这两个按钮,同时在下方显示原图像和处理后的图像。

首先创建一个类,主要实现图像的阈值分割:

colordetector.h:

{public:// 最小可接受距离int minDist;void setTargetColor(unsigned char red, unsigned char green, unsigned char blue);cv::Mat process(const cv::Mat &image);private:// 目标颜色cv::Vec3b target;// 输出结果图像cv::Mat result;void setTargetColor(cv::Vec3b color);void colorDetector(const cv::Mat &image, cv::Mat &result);void setColorDistanceThreshold(int distance);int getColorDistanceThreshold();int getDistance(const cv::Vec3b& color);cv::Vec3b getTargetColor() const;};#endif // COLORDETECTOR_H

colordetector.cpp:

#include “colordetector.h”int ColorDetector::getDistance(const cv::Vec3b& color){return abs(color[0] – target[0])+ abs(color[1] – target[1]) + abs(color[1] – target[1]);}void ColorDetector::colorDetector(const cv::Mat &image, cv::Mat &result){cv::Mat_<cv::Vec3b>::const_iterator it = image.begin<cv::Vec3b>();cv::Mat_<cv::Vec3b>::const_iterator itend = image.end<cv::Vec3b>();cv::Mat_<uchar>::iterator itout = result.begin<uchar>();// 对每个像素进行处理,计算每个像素距离目标颜色的距离for(; it<itend; ++it,++itout){if(getDistance(*it)<minDist) // 判断距离是否小于最小可接受距离{*itout = 0;}else *itout = 255;}}void ColorDetector::setColorDistanceThreshold(int distance){ // 设置色彩距离阈值,阈值必须为正if(distance < 0)distance = 0;minDist = distance;}int ColorDetector::getColorDistanceThreshold(){ // 获取色彩距离的阈值return minDist;}green, unsigned char blue){// BGR顺序target[2] = red;target[1] = green;target[0] = blue;}void ColorDetector::setTargetColor(cv::Vec3b color){ // 设置需检测的颜色target = color;}cv::Vec3b ColorDetector::getTargetColor() const{ // 获取需检测的颜色return target;}// Process阈值分割方法的定义cv::Mat ColorDetector::process(const cv::Mat &image){result.create(image.rows, image.cols, CV_8U);colorDetector(image, result);return result;}勇士面前无险路。

OpenCV2学习笔记(一):图像的基本操作

相关文章:

你感兴趣的文章:

标签云: