当前位置:   article > 正文

Opencv-C++笔记 (3) : opencv的库介绍以及和C++对接转换_opencv c++

opencv c++

一、Opencv库的介绍

在这里插入图片描述
calib3d 主要包含相机标定,立体视觉的功能:物体姿势估计,三维重建,摄像头标定
core,包含库的基本结构和操作,比如数据结构,绘图函数,数组操作等函数
dnn,深度学习模块,包含构建网络,加载序列化的模型,但是不支持训练,只能推理
features2d,处理图像特征点,特征检测,描述匹配之类的
flann,这个模块是高维的近似近邻快速搜索算法库 主要包含快速近似近邻搜索与聚类等。
gapi,加速图像处理的框架,没有特定的算法
highgui,创建操作显示图像的窗口,处理鼠标事件和键盘命令,提供交互式可视化的界面
imgcodecs 图片的保存和读取
imgproc,图像处理模型,滤波,几何变换,直方图,特征检测目标检测等。
ml,机器学习模块,统计分类,回归,聚类等
objdetect,目标检测慕课,Haar特征等
photo,摄影模型用来图片修复,去噪
stitching,图像拼接,包含特征点的寻找和匹配,估计选择,自动校准,接缝等(啊这)
video ,视频分析模型,用于运动估计,背景分离,对象跟踪等
videoio ,视频输入,输出模块。

其解释如下:

calib3d

其实就是就是Calibration(校准)加3D这两个词的组合缩写。这个模块主要是相机校准和三维重建相关的内容。基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。

contrib

[contrib]:也就是Contributed/Experimental Stuf的缩写,
该模块包含了一些最近添加的不太稳定的可选功能,不用去多管。2.4.10里的这个模块有新型人脸识别, 立体匹配 ,人工视网膜模型等技术。

core

OpenCV基本数据结构 动态数据结构 绘图函数 数组操作相关函数 辅助功能与系统函数和宏 与OpenGL的互操作

imgproc

线性和非线性的图像滤波

图像的几何变换

其它(Miscellaneous)
图像转换
直方图相关
结构分析和形状描述
运动分析和对象跟踪
特征检测
目标检测等内容

features2d

[features2d]: 也就是Features2D, 2D功能框架 ,包含如下内容

特征检测和描述
特征检测器(Feature Detectors)通用接口
描述符提取器(Descriptor Extractors)通用接口
描述符匹配器(Descriptor Matchers)通用接口
通用描述符(Generic Descriptor)匹配器通用接口
关键点绘制函数和匹配功能绘制函数

flann

[flann]: Fast Library for Approximate Nearest
Neighbors,高维的近似近邻快速搜索算法库, 包含两个部分:快速近似最近邻搜索和聚类

  [gpu]: 运用GPU加速的计算机视觉模块
  • 1

highgui

[highgui]: 也就是high gui,高层GUI图形用户界面,包含媒体的I / O输入输出,
视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容

legacy

运动分析
期望最大化
直方图
平面细分(C API)
特征检测和描述(Feature Detection and Description)
描述符提取器(Descriptor Extractors)的通用接口
通用描述符(Generic Descriptor Matchers)的常用接口
匹配器

ml

[ml]: Machine Learning,机器学习模块, 基本上是统计模型和分类算法,包含如下内容

统计模型 (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)
MLData

nonfree

[nonfree]: 也就是一些具有专利的算法模块 ,包含特征检测和GPU相关的内容。最好不要商用,可能会被告哦。

objdetect

[objdetect]: 目标检测模块,包含Cascade Classification(级联分类)和Latent SVM这两个部分。

ocl

[ocl]: 即OpenCL-accelerated Computer Vision,运用OpenCL加速的计算机视觉组件模块

photo

[photo]: 也就是Computational Photography,包含图像修复和图像去噪两部分

stitching

[stitching]: images stitching,图像拼接模块,包含如下部分:

拼接流水线
特点寻找和匹配图像
估计旋转
自动校准
图片歪斜
接缝估测
曝光补偿
图片混合

superres

ts

video

该模块包括运动估计,背景分离,对象跟踪等视频处理相关内容

Videostab

[Videostab]: Video stabilization,视频稳定相关的组件

二、C++和MAT 转换方式

2.1、一维Vector

 //定义一维vector
vector<float> channel_data; 

//向vector中添加元素,用push_back
for (int j = 0; j < numMic; j++){
    channel_data.push_back(*m_dataMic);
}

//求vector长度
int Len_data = vector.size(); 

//索引数据
channel_data[i]

//求vector中的最大值及位置
auto maxPosition = max_element(channel_data.begin(), channel_data.end());
cout << *maxPosition << " at the postion of " << maxPosition - channel_data.begin
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2.2、二维vector

vector<vector<float>> power;  //定义二维vector
vector<float> add_power;  //定义一维vector
//std::vector<std::vector<float>> power;  //定义二维vector
//std::vector<float> add_power;  //定义一维vector
for (int i=0; i<Len1; i++)
{
    //给1维vector添加元素
    for (int j=0; j<Len2; j++)
    {
        add_power.push_back(amplite_planes1[j]);
    }
    power.push_back(add_power) //给2维vector添加元素
}

int n = power.size();       //Len1的长度
int m = power[0].size();   //Len2的长度

//求2维vector中的最大值及位置
float max_power = 0.0;
int pos[2];
for (int p = 0; p < power.size(); p++)//求2维Vector的最大值
{
	auto maxPosition = max_element(power[p].begin(), power[p].end());
	if (max_power <= *maxPosition){
		max_power = *maxPosition;
                pos[0] = p;//第几行
                pos[1] = maxPosition-power[p].begin();//第几列
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

2.3 数组

//一维数据维度计算
int num=0;
num=sizeof(Array)/sizeof(Array[0]);

//二维数组维度计算
int Array[5][5];
int numberOfRow,numberOfCol,len;
numberOfCol=sizeof(Array[0])/sizeof(int);
len=sizeof(Array)/sizeof(int);
numberOfRow=len/numberOfCol;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.4、类型转换 ——一维转 数组

vector<float> channel_data3; //定义一维vector;假定channel_data3已添加了元素
float *singleChannel_data = new float[Len];
for (int i = 0; i < Len; i++)
{
    singleChannel_data[i] = channel_data3[i];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.5、类型转换 -------- 一维MAT转数组

//转8位一维数组
uchar *array = new unsigned char[mat.rows*mat.cols];
if (mat.isContinuous())
    array = mat.data;
  • 1
  • 2
  • 3
  • 4

2.6、类型转换 -------- 二维Vector转Mat

std::vector<std::vector<float>> power;  //定义二维vector

// 二维Vector转换为Mat类型的mat_power
// Create a new, _empty_ cv::Mat with the row size of OrigSamples
cv::Mat mat_power(0, power[0].size(), cv::DataType<float>::type);
for (unsigned int i = 0; i < power.size(); ++i)
{
	// Make a temporary cv::Mat row and add to NewSamples _without_ data copy
	cv::Mat Sample(1, power[0].size(), cv::DataType<float>::type, power[i].data());
	mat_power.push_back(Sample);
}

//查看二维Mat元素
power.ptr<float>(0),32 //查看第0行0-31列的32个元素
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.7、类型转换 -------- 二维Mat转Vector

//初始化二维vector维度
vector<vector<float>> R_vec;
R_vec.resize(num_row);//行
for (int c = 0; c < R_vec.size(); c++){
	R_vec[c].resize(num_col);//列
}
//R为2维Mat
for (int x = 0; x < R.rows; x++) {
	for (int y = 0; y < R.cols; y++) {
		//R_vec[x][y] = R.at<float>(x, y);
		R_vec[x][y] = R.ptr<float>(x)[y];
		//std::cout << boxPts.at<float>(x, y) << std::endl;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/802149
推荐阅读
相关标签
  

闽ICP备14008679号