OpenCV2-架构分析

发展历程:

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

效果:
原图


图片叠加


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355