美文网首页
OpenCV2-架构分析

OpenCV2-架构分析

作者: AlanGe | 来源:发表于2020-06-29 19:02 被阅读0次

发展历程:

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

效果:
原图


图片叠加


相关文章

网友评论

      本文标题:OpenCV2-架构分析

      本文链接:https://www.haomeiwen.com/subject/ixjafktx.html