发展历程:
1999年发布(Intel公司发布产品->开源免费):1.0版本
目前:更新到了2017年8月5日
3.0以前版本和3.0以及之后版本区别?
最大区别:架构设计区别?
3.0以前->整体架构思想(书架->存放任何类型书,随便放)
小书架还好,找书籍好找
随着框架越来越老庞大->功能越来越复杂(代码量越来越大)
3.0以及之后->架构设计->核心+插件架构设计思想(功能分类)
XCode:工具设计思想->核心+插件思想
Android Stujdio:核心+插件思想
操作系统等等…
1、core,核心功能模块,主要包含如下的内容:
OpenCV基本数据结构(Basic Structures);
基本的C语言数据结构和操作(Basic C Structures and Operations);
动态数据结构(Dynamic Structures);
数组操作相关函数(Operations on Arrays);
绘图功能(Drawing Functions);
XML和YAML语法的支持(XML/YAML Persistence);
XML和YAML语法的支持的C语言接口(XML/YAML Persistence (C API));
聚类(Clustering);
辅助功能与系统函数和宏(Utility and System Functions and Macros);
与OpenGL的互操作(OpenGL interoperability);
2、imgproc,是Image Processing的简写。图像处理模块,主要包含以下内容:
线性和非线性的图像滤波(Image Filtering);
图像的几何变换(Geometric Image Transformations);
图像的其他变换(Miscellaneous Image Transformations);
直方图(Histograms);
结构分析和形状描述(Structural Analysis and Shape Descriptors);
运动分析和目标跟踪(Motion Analysis and Object Tracking);
特征检测(Feature Detection);
目标检测(Object Detection);
3、highgui,是High-level GUI and Media I/O的简写。高层用户界面模块和媒体输入/输出模块,主要包含以下内容:
用户界面(User Interface);
图片和视频的读写(Reading and Writing Images and Video);
QT新功能(Qt New Functions);
4、features2d,是2D Features Framework的简写。二维特征框架模块,主要包含以下内容:
人脸识别
VR和AR
特征的检测和描述(Feature Detection and Description);
特征检测器的通用接口(Common Interfaces of Feature Detectors);
描述符提取器的通用接口(Common Interfaces of Descriptor Extractors);
描述符匹配器的通用接口(Common Interfaces of Descriptor Matchers);
通用描述符匹配器通用接口(Common Interfaces of Generic Descriptor Matchers);
关键点和匹配结果的绘制功能(Drawing Function of Keypoints and Matches);
目标分类(Object Categorization);
5、flann,Clustering and Search in Multi-Dimensional Spaces,多维空间聚类和搜索模块,主要包含以下内容:
快速近视最近邻搜索(Fast Approximate Nearest Neighbor Search);
聚类(Clustering);
6、video,是Video Analysis的简写。视频分析模块,主要包含以下内容:
运动分析和目标跟踪(Motion Analysis and Object Tracking),视频相关的,上面提到的是图片相关的;
7、calib3d ,是Camera Calibration and 3D Reconstruction的简写。这个模块主要是相机校准和三维重建相关的内容,包括基本的多视角几何算法、单个立体摄像头标定、物体姿态估计、立体相似性算法,3D信息的重建等
8、ml,机器学习库:统计模型、随机树、神经网络等等…
9、objdetect->目标检查库
10、video->视频分析组件:运动估计、背景分离、对象跟踪等等…
11、photo->图像修复和图像去噪两部分
架构设计改变:整体架构->转变到->核心+插件架构体系
OpenCV-案例演示->初步认识OpenCV
案例一:显示一张图片->Mac平台下开发
环境配置问题
默认不支持OpenCV开发
第一步:安装OpenCV
int main( int argc, char** argv ){
// 显示一张图片
string imageName("/Users/alange/Desktop/OpenCV/Images/scenery.png"); // 注意:这是图片所在位置路径
if( argc > 1) {
imageName = argv[1];
}
Mat image;
image = imread(imageName.c_str(), IMREAD_COLOR); // Read the file
if( image.empty() ){
cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
案例二:iOS平台下开发
在Mac配置好OpenCV环境前提下,通过Add Files to ""导入opencv2.framework库
将ViewController.m改为ViewController.mm,支持c++开发
图片叠加
#import "ViewController.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgcodecs/ios.h> // 支持iOS平台图片转换
using namespace cv;
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"图片叠加";
}
- (IBAction)clickNormal:(id)sender {
_imageView.image = [UIImage imageNamed:@"scenery"];
}
- (IBAction)overlayImages:(id)sender {
UIImage* srcPath = [UIImage imageNamed:@"scenery"];
UIImage* dstPath = [UIImage imageNamed:@"strawberry"];
_imageView.image = [self opencvImage:srcPath dst:dstPath];
}
-(UIImage *)opencvImage:(UIImage *)srcImage dst:(UIImage *)dstImage{
// 第一步:准备两种图片
Mat mat_image_src;
UIImageToMat(srcImage, mat_image_src);
Mat mat_image_dst;
UIImageToMat(dstImage, mat_image_dst);
// 第二步:创建叠加区域->开辟了一块内存空间
Mat mat_roi = mat_image_src(Rect2i(0, 0, mat_image_dst.cols, mat_image_dst.rows));
// 第三步:图片叠加->加水印->合并之后覆盖原来的图片
// 参数一:第一个图片数组
// 参数二:第一个图片数组->权重
// 参数三:第二个图片数组
// 参数四:第二个图片数组->权重
// 参数五:权重和基础之上标量值
// 参数六:输出数组->输出目标
// dst = src1*alpha + src2*beta + gamma;
// 伪代码:mat_roi * 0 + mat_image_dst * 1 + 0
addWeighted(mat_roi, 0, mat_image_dst, 1, 0, mat_roi);
// 第四步:将Mat图片->iOS图片
return MatToUIImage(mat_image_src);
}
@end
效果:
原图
图片叠加