FaceSwap函数说明

来源:互联网 发布:微医挂号网可靠吗 知乎 编辑:程序博客网 时间:2024/06/05 10:33

1.

//detect()中调用    CV_WRAP void detectMultiScale( InputArray image,                          CV_OUT std::vector<Rect>& objects,                          double scaleFactor = 1.1,                          int minNeighbors = 3, int flags = 0,                          Size minSize = Size(),                          Size maxSize = Size() );

@brief在输入图像中检测不同大小的对象。检测到的对象作为列表返回
的矩形。 @param image CV_8U类型的矩阵,其中包含检测对象的图像。 @param objects 每个矩形包含检测到的对象的矩形向量,矩形可能部分在原始图像之外。
@param scaleFactor参数指定在每个图像比例下图像大小减少了多少。
@param minNeighbors参数指定每个候选矩形应该有多少个要保留的邻居。
@param flags参数与旧函数中的函数具有相同的含义
cvHaarDetectObjects。它不用于新的级联。
@param minSize最小可能的对象大小。小于这个值的对象被忽略。
@param maxSize最大可能的对象大小。大于此的对象将被忽略。如果maxSize == minSize模型是单一尺度评估的。

2.

CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ,                                 OutputArray result, int method, InputArray mask = noArray() );

@brief比较模板和重叠的图像区域。

该函数在图像中滑动,比较大小为\ f w timesh f的重叠块 templ使用指定的方法,并将比较结果存储在结果中。这里是公式 对于可用的比较方法(\ f I f表示图像,\ f T f template,\ f R f result)。总和是通过模板和/或图像补丁完成的:\ f x=0...w1y=0...h1 f

在函数完成比较之后,最佳匹配可以被找到为全局最小值(当 TM_SQDIFF被使用)或最大值(当使用TM_CCORR或TM_CCOEFF时)使用 minMaxLoc函数。在彩色图像的情况下,在分子和每个和的模板总和英寸 分母在所有通道上完成,每个通道使用不同的平均值。

也就是说,该功能可以采用颜色模板和彩色图像。结果仍然是一个 单通道图像,这是更容易分析。

@param image搜索正在运行的图像。它必须是8位或32位浮点。 @param templ搜索模板。它必须不大于源图像,并具有相同的 数据类型。 @param result比较结果的地图。它必须是单通道32位浮点。如果图像 (H-h + 1)\ f $(W-W + 1)\ times 。 @param method指定比较方法的参数,请参阅cv :: TemplateMatchModes @param mask搜索模板的掩码。它必须与templ具有相同的数据类型和大小。它是 没有默认设置。

3.

CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());

@brief规范化数组的范数或值范围。

函数cv :: normalize规格化缩放并移动输入数组元素 \ F [\ | \ texttt {dst} \ | _ {L_p} = 引用块内容 \ texttt {alpha} \ f] (其中p = Inf,1或2)当normType = NORM_INF,NORM_L1或NORM_L2时,或者这样 \ f [\ min_I \ texttt {dst}(I)= \ texttt \ alpha,\,\,\ max _I \ texttt {dst}(I)= \ texttt {beta} \ f]

当normType = NORM_MINMAX时(仅适用于密集数组)。可选掩码指定一个子数组 标准化。这意味着规范或min-n-max是在子数组上计算的,然后是这个 子数组被修改为标准化。如果你只想使用掩码来计算规范或 min-max但是修改整个数组,你可以使用norm和Mat :: convertTo。

在稀疏矩阵的情况下,只有非零值被分析和转换。因为这个, 稀疏矩阵的范围转换是不允许的,因为它可以移动零电平。

一些正面的示例数据的可能用法: @code {}的.cpp
vector positiveData = {2.0,8.0,10.0};
vector normalizedData_l1,normalizedData_l2,normalizedData_inf,normalizedData_minmax;

//规范到概率(总数)// sum(numbers)= 20.0// 2.0 0.1(2.0 / 20.0)// 8.0 0.4(8.0 / 20.0)// 10.0 0.5(10.0 / 20.0)normalize(positiveData,normalizedData_l1,1.0,0.0,NORM_L1);//向单位向量的范数:|| positiveData || = 1.0// 2.0 0.15// 8.0 0.62// 10.0 0.77normalize(positiveData,normalizedData_l2,1.0,0.0,NORM_L2);//标准为最大元素// 2.0 0.2(2.0 / 10.0)// 8.0 0.8(8.0 / 10.0)// 10.0 1.0(10.0 / 10.0)normalize(positiveData,normalizedData_inf,1.0,0.0,NORM_INF);//范围范围[0.0; 1.0]// 2.0 0.0(移到左边框)// 8.0 0.75(6.0 / 8.0)// 10.0 1.0(转移到右边框)normalize(positiveData,normalizedData_minmax,1.0,0.0,NORM_MINMAX); @endcode

@param src输入数组。 @参数dst输出与src相同大小的数组。 在范围的情况下,@param alpha标准值被归一化到或者更低的范围边界 正常化。 @范围归一化时,参数β上限范围边界;它不被用于规范 正常化。 @param norm_type规范化类型(参见cv :: NormTypes)。 @param dtype当为负时,输出数组的类型与src相同;否则,它是一样的 通道数作为src,深度= CV_MAT_DEPTH(dtype)。 @param掩码可选操作掩码。 @sa norm,Mat :: convertTo,SparseMat :: convertTo

4.

CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal,          CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0,          CV_OUT Point* maxLoc = 0, InputArray mask = noArray());

@brief在数组中查找全局最小值和最大值。

函数cv :: minMaxLoc查找最小和最大元素值及其位置。该
在整个数组中搜索极值,或者,如果掩码不是空数组,则在指定的范围内
阵列区域。

该功能不适用于多通道阵列。如果你需要找到最低或最高
所有通道的元素,首先使用Mat :: reshape重新解释数组
单通道。或者你可以使用extractImageCOI或者提取特定的频道
mixChannels或split。
@param src输入单通道数组。
@param minVal指向返回的最小值;如果不需要,则使用NULL。
@param maxVal指向返回的最大值;如果不需要,则使用NULL。
@param minLoc指向返回的最小位置的指针(在2D情况下);如果不需要,则使用NULL。
@param maxLoc指向返回的最大位置的指针(在2D情况下);如果不需要,则使用NULL。
@param掩码可选掩码用于选择一个子数组。
@sa max,min,compare,inRange,extractImageCOI,mixChannels,split,Mat :: reshape

5.
OpenCV的仿射变换原理

6.
人脸特征点的提取:对摄像头采集到的每一帧图像缓存后进行特征点检测并显示即可。
使用官方提供的模型构建特征提取器

predictor = dlib.shape_predictor(predictor_path)

使用dlib自带的frontal_face_detector作为人脸检测器

detector = dlib.get_frontal_face_detector()

特征点坐标shapes[shape_index].part(part_index).x()/y()
shape_index是人脸的序号,如shapes[0]代表的是第一个人(可以同时检测到很多个人),part(i)代表的是第i个特征点,x()和y()是访问特征点坐标的途径。

插图:

facial landmarks

7.

//getMasks()调用CV_EXPORTS_W void fillConvexPoly(InputOutputArray img, InputArray points, const Scalar& color, int lineType = LINE_8,int shift = 0);

@brief填充一个凸多边形。

fillConvexPoly函数绘制一个填充的凸多边形。 这个功能比起来要快得多
函数cv :: fillPoly。 它不仅可以填充凸多边形,也可以填充任何单调多边形
自相交,即轮廓与每条水平线相交的多边形(扫描线)
最多两次(尽管其最顶部和/或底部边缘可以是水平的)。

@参数img图像。
@参数points指向多边形顶点。
@参数color颜色多边形颜色。
@param lineType多边形边界的类型。 请参阅行描述。
@param shift顶点坐标中的小数位数。

8.

//getWarppedMasks()CV_EXPORTS_W void warpAffine( InputArray src, OutputArray dst,                              InputArray M, Size dsize,                              int flags = INTER_LINEAR,                              int borderMode = BORDER_CONSTANT,                              const Scalar& borderValue = Scalar());

@brief将仿射变换应用于图像。

当标志WARP_INVERSE_MAP被设置时,函数warpAffine使用指定的矩阵转换源图像:

\ f {\ texttt {dst}(x,y)= \ texttt {src}(\ texttt {M} _ {11} x + \ texttt {M} _ {12} y + \ texttt {M} _ {13 },\ texttt {M} _ {21} x + \ texttt {M} _ {22} y + \ texttt {M} _ {23})\ f]

否则,这个转换首先被用cv :: invertAffineTransform倒置
,然后把它代入公式。

@param src输入图像。
@参数dst输出图像,其大小为dsize,与src的类型相同。
@参数M \ f 2 times3 f转换矩阵。
输出图像的@param dsize大小。
插值方法的@param标志组合(见cv :: InterpolationFlags)和可选项
标记WARP_INVERSE_MAP,这意味着M是逆变换(
\ f  textttdst rightarrow textttsrc f)。
@param borderMode像素外插方法(参见cv :: BorderTypes);什么时候
borderMode = BORDER_TRANSPARENT,这意味着目标图像中的像素对应于
源图像中的“异常值”不会被该函数修改。
@param borderValue值在常量边界的情况下使用;默认情况下它是0。

@sa warp查看,调整大小,重新映射,getRectSubPix,转换

9.

//featherMask()调用CV_EXPORTS_W void blur( InputArray src, OutputArray dst,                        Size ksize, Point anchor = Point(-1,-1),                        int borderType = BORDER_DEFAULT );

@brief使用归一化的盒子过滤器模糊图像。

该函数使用内核平滑图像:

\ f {1} {\ texttt {ksize.width * ksize.height}} \ begin {bmatrix} 1&1&1&amp; cdots&1&1 \ 1&1& 1&1 cdots&1&1 \ \ hdotsfor {6} \ 1&1&1&amp; cdots&1&1 \ \ end {bmatrix} \ f]

调用blur(src,dst,ksize,anchor,borderType)相当于boxFilter(src,dst,src.type(),anchor,true,borderType)

@param src输入图像; 它可以有任意数量的独立处理的通道,但是
深度应该是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
@参数dst输出与src相同大小和类型的图像。
@参数ksize模糊内核大小。
@参数anchor 默认值Point(-1,-1)表示锚点位于内核处
中央。
@param borderType边界模式,用于外推图像外的像素,请参阅cv :: BorderTypes
@saFilter,bilateralFilter,GaussianBlur,medianBlur

10.

//featherMask()调用CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,                         Point anchor = Point(-1,-1), int iterations = 1,                         int borderType = BORDER_CONSTANT,                         const Scalar& borderValue = morphologyDefaultBorderValue() );

@brief使用特定的结构元素侵蚀图像。

该函数使用指定的结构元素来侵蚀源图像
最小取像素邻域的形状:

(x,y)= \ min_ {(x’,y’):\,\ texttt {element}(x’,y’)\ ne0} \ texttt {src}(x + X ‘Y + y’)的\ F]

该功能支持就地模式。侵蚀可以应用几次(迭代)次。在
在多通道图像的情况下,每个通道都是独立处理的。

@param src输入图像;通道的数量可以是任意的,但深度应该是其中之一
CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
@参数dst输出与src相同大小和类型的图像。
@param kernel 内核结构化元素用于侵蚀;如果element = Mat(),一个3 x 3矩形
结构元素被使用。内核可以使用getStructuringElement创建。
元素内锚的参数锚位置;默认值(-1,-1)表示
锚在元素中心。
@param iterations应用侵蚀的次数。
@param borderType像素外插方法,请参阅cv :: BorderTypes
边界不变时@param borderValue边界值
@sa dilate,morphologyEx,getStructuringElement

原创粉丝点击