其实opencv 里面很多函数都是会带有一个mask 参数的,很多同学都不知道它到底有什么用,好像在实际运用中忽略它也没有什么问题(这不废话嘛,opencv设计师设计它的时候默认就是可以忽略的)。

我在这里就抛砖引玉,详细分析一个常用函数cvcopy里面的mask ,希望可以给大家一点点指引。

cvCopy 这个函数很熟洗哈,用得很多吧哈哈…… 以下内容来子opencv安装文件夹中自带的pdf文档。

Copies one array to another.

//复制一个数组到另外一个数组

void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL);

src The source array

//源数组,要复制谁??from whom?

//插两句题外话,opencv里面提到的数组不是通常意义上的数组,它是矩阵、图像等结构体……

dst The destination array

//目标数组,复制以后的内容给谁?? to whom?

mask

——下面这就是重点。鄙人认为很多人都没有深刻理解这个mask的作用(不要拿鞋仍我……)——

Operation mask, 8-bit single channel array; specifies elements of the destination array to
be changed

//掩码操作,mask是一个8位单通道的数组;mask指定了目标数组(dst)中那些元素是可以改变的

上面这句话还不是非常重点,重点是以下的那个公式,这个公式有多少人理解哈,就网上的资料来看很少有人理解,又或者高手都不屑于网上写东西,所以我们只能做等真相……孩子,你被mask mask住了吗 (第一个mask是opencv里面的mask数组,第二个mask是这个英文词本身的意思,不懂就google去)??真相来了!!!

The function copies selected elements from an input array to an output array:
dst(I) = src(I) if mask(I) = 0.

//该函数把输入数组(src数组)中选中的元素(可以认为是做了标记的,不过这些标志是谁来做的呢??对,就是mask,孩子你太聪明了)拷贝到…………………………………………………………………………

………………………………………………………………到哪里?快说!!拷贝到dst数组嘛……

dst(I) = src(I) if mask(I) != 0.

就是说,如果mask不是NULL,也就是说mask是一个数组,并且是一个和dst or src大小完全一致的数组。

遍历src的每一个元素,

(1)在位置i时候如果mask对应的值为不为0,那么把src (i) 的值复制给dst (i) 。

(2)如果mask(i) 为0,那么不管src(i)是什么,dst(i)都设置为0.

举例说明,这里不举太复杂的就来一个一维的就够啦。

If any of the passed arrays is of IplImage type, then its ROI and COI fields are used. Both
arrays must have the same type, the same number of dimensions, and the same size. The function
can also copy sparse arrays (mask is not supported in this case).

//如果传递给src的数组是图像类型的,那么将使用ROI或者COI。src数组和dst数组必须具有相同的数据类型、一致的数组维数、一样的大小。该函数也可以用于拷贝稀疏矩阵(但是此种情况下,mask不起作用)。

好吧,到这里了终于写完了。你现在是不是明白为什么要起mask这个名字了吧,掩码就是:不为0的时候就可一操作(具体是什么操作就看具体的函数了)、为0就掩盖住了无法操作。

补充一点 :mask = NULL 意思就是没有模板、不使用掩码操作,函数该干啥就干啥……

来吧,再来一个有血有肉的活生生的例子(本文在opencv上的回复) :

    #include "cv.h"#include "cxcore.h"#include "highgui.h"#include <stdio.h>int main(){float arr1[] = {1,2,3,4,5,6,};float arr2[] = {-4,78,12,154,786,-0.154};float arr3[6] = {119} ;int mask_arr[6] = {1};CvMat src1;cvInitMatHeader(&src1,2,3,CV_32FC1,arr1,CV_AUTOSTEP);CvMat src2 ;cvInitMatHeader(&src2,2,3,CV_32FC1,arr2,CV_AUTOSTEP);CvMat dst ;cvInitMatHeader(&dst,2,3,CV_32FC1,arr3,CV_AUTOSTEP);CvMat *mask = cvCreateMat( 2,3,CV_32FC1 );cvInitMatHeader(mask,2,3,CV_8UC1,mask_arr,CV_AUTOSTEP);cvAdd(&src1, &src2, &dst, mask);int x ;int y ;for( y = 0 ; y < 2;++y ){float* ptr = (float*) ( dst.data.ptr + y * dst.step ) ;for ( x = 0; x < 3 ; x++ ){printf("/t%f",ptr[x]);}printf("/n");}printf("/n");return 0 ;}

结果如下:
-3.000000 0.000000 0.000000
0.000000 0.000000 0.000000

opencv中mask参数相关推荐

  1. PIL.Image.paste中mask参数的使用(使旋转后的被粘贴patch的黑边在粘贴后为原图值)

    问题来由 在进行图像预处理时,需要用到将patch旋转后粘贴到原图的需求.由于image.rotate方法会留下黑边,而我需要让粘贴后的图片中不出现黑边,而是黑边位置展现为原图对应位置的像素,因此需要 ...

  2. 关于opencv中 THRESH_TRUNC 参数的疑惑

    在opencv的阈值处理中,有个截断阈值的参数 THRESH_TRUNC 让我有些疑惑.因为从官方资料解释来看,是大于阈值会被设为阈值,小于阈值的保持不变 (DSTI = (SRCI > thr ...

  3. OpenCV中cvADDS()为啥第二个参数要是CvScalar类型?掩码mask=NULL又是何意?

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 void cvAddS(const CvArr* ...

  4. OpenCV中cvAdds和cvAdd中的mask的用法探讨

    OpenCV中cvAdds和cvAdd中的mask的用法探讨 Fn : 包含 mask 参数的一些函数如下 [摘自opencv 2.3.1版本 C++] void add(InputArray src ...

  5. 在OpenCV中使用Mask R-CNN

    本文翻译自:https://www.pyimagesearch.com/2018/11/19/mask-r-cnn-with-opencv/ 在本教程中,您将学习如何在OpenCV中使用Mask R- ...

  6. 【OpenCV】Mat的使用方法以及Mat中的参数和函数

    Mat Mat的简单使用 从实际出发,先看看他干啥的,怎么用. 一般我们用到Mat有两个重要的用途: 1.存储图像(其实图像可以看成一个高行宽列的一个矩阵) 2.存储矩阵 先来看看Mat用于图像和矩阵 ...

  7. Gabor滤波简介与Opencv中的实现及参数变化实验

    声明:本篇文章为转载,目的是便于以后查找学习 Gabor滤波是一种非常常见的特征提取算法,在人脸识别等领域有着很广泛的应用,在这里我主要介绍一下Gabor滤波器的公式及Opencv下的代码实现,以及我 ...

  8. python opencv 摄像头_opencv python中摄像头参数的设置

    我正在使用Windows7 64位操作系统以及Python3和OpenCV.我的电脑连接到以下型号的两个罗技网络摄像头: 1)罗技高清网络摄像头C615 2) 罗技QuickCam Pro 9000 ...

  9. 关于opencv中cvtcolor函数的code参数用CV_BGR2YUV与CV_BGR2YCrCb的了解

    根据Opencv中cvtcolor函数的源码描述,,参数CV_BGR2YCrCb用的系数为[1868, 9617, 4899, 11682, 9241], 而参数CV_BGR2YUV对应的系数只是将C ...

最新文章

  1. 迁移学习之DenseNet121(121层),DenseNet169(169层),DenseNet201(201层)(图像识别)
  2. kubernetes 清理日志命令_Kubernetes之容器数据写满磁盘解决方法
  3. HTML --- 盒模型
  4. flutter 图解_Flutter自绘组件:微信悬浮窗(三)
  5. linux command find
  6. c语言设计成行考核答案,20秋广东开放大学C语言程序设计成性考核参考答案(10页)-原创力文档...
  7. 思科三层交换机充当路由器实现全网互通
  8. uva 10622——Perfect P-th Powers
  9. 地宫取宝|2014年蓝桥杯B组题解析第九题-fishers
  10. python有趣小程序-python好玩的小程序
  11. php数组合成函数,PHP合并数组函数array_merge用法分析
  12. Git ignore UserInterfaceState.xcuserstate
  13. java2实用教程第五版耿祥义电子版_Java2实用教程(第5版)答案 耿祥义、张跃平
  14. 读取敏感词库内容,讲某段字符里面的敏感词替换成*
  15. 【ShaderLab学习】AlphaTest AlphaBlend理解[1]
  16. Linux网卡驱动分析
  17. proxy_pool开源项目攻克学习2:服务器架设
  18. 开始使用 Elasticsearch (1)
  19. 【STM32】LCD液晶显示
  20. java poi 添加列数据_java使用POI将数据导出放入Excel

热门文章

  1. Mysql 多表查询详解
  2. git下载,上传代码到GitLab ; Untracked files (use “git add <file>...“ to include in what will be committed)
  3. 华为交换机审计配置_上网行为管理审计之交换机端口镜像配置(华为)
  4. Android开发学习笔记
  5. break,returned,和continue
  6. CF221C Circling Round Treasures
  7. 第一课:Mstar-Non-OS方案(一)——搭建编译环境
  8. openwrt 15.05 branch (Chaos Calmer)编译出的固件bootargs被覆盖
  9. centos6——初始化脚本
  10. 抖音无水印视频解析源码