OpenCV 常用函数汇总(bitwise_*、pointPolygonTest、morphologyEx)

两图像间的像素操作

cv::bitwise_and() 函数原型
 //像素求“与”运算
 CV_EXPORTS_W void bitwise_and(
 InputArray src1,
 InputArray src2,
 OutputArray dst,
 InputArray mask = noArray()
 );
cv::bitwise_or() 函数原型
 //像素求“或“运算
 CV_EXPORTS_W void bitwise_or(
 InputArray src1,
 InputArray src2,
 OutputArray dst,
 InputArray mask = noArray()
 );
cv::bitwise_xor() 函数原型
 //像素求“异或”运算
 CV_EXPORTS_W void bitwise_xor(
 InputArray src1,
 InputArray src2,
 OutputArray dst,
 InputArray mask = noArray()
 );
cv::bitwise_not() 函数原型
 //像素求“非”运算
 CV_EXPORTS_W void bitwise_not(
 InputArray src,
 OutputArray dst,
 InputArray mask = noArray()
 );

src1:第一个图像矩阵,可以是多通道图像数据
src2:第二个图像矩阵,尺寸、通道数和数据类型都需要与 src1 一致
dst:逻辑运算输出结果,尺寸、通道数和数据类型都需要与 src1 一致
mask:掩模,用于设置图像或矩阵中逻辑运算的范围

  • 这4个函数都执行相应的逻辑运算,在进行逻辑运算时,一定要保证两个图像矩阵之间的尺寸、数据类型和通道数相同,多个通道进行逻辑运算时不同通道之间是独立进行的。

pointPolygonTest

cv::pointPolygonTest 函数原型
 CV_EXPORTS_W double pointPolygonTest(
 InputArray contour, //输入的轮廓
 Point2f pt, //需要计算与轮廓距离的像素点
 bool measureDist //计算的距离是否具有方向性的标志。当参数取值为 true 时,点在轮廓内部时,距离为正,点在轮廓外部时,距离为负;当参数取值为 false 时,只检测点是否在轮廓内。
 );

该函数能够计算指定像素点距离轮廓的最小距离并以 double 类型的数据返回。

  • 该函数的第一个参数表示轮廓,数据类型是 vector 或者 Mat。
  • 该函数的第二个参数是需要计算与轮廓距离的像素点坐标。
  • 该函数的第三个参数是计算的距离是否具有方向性的标志,false 表示输出结果不具有方向性,只判断像素点与轮廓之间的位置关系,如果像素点在轮廓的内部,返回值为1,如果像素点在轮廓的边缘上,返回值为0,如果像素点在轮廓的外部,返回值为-1。 true 表示输出结果具有方向性,如果像素点在轮廓内部,返回值为正数,如果像素点在轮廓外部,返回值为负数。

形态学应用

如何利用不同顺序的图像腐蚀和膨胀实现图像的开运算、闭运算、形态学梯度、顶帽运算、黑帽运算,以及击中击不中变换等操作。

cv::morphologyEx() 函数原型
 CV_EXPORTS_W void morphologyEx(
 InputArray src, //输入图像,图像的通道数可以是任意的,但图像的数据类型必须是 CV_8U、CV_16U、CV_16S、CV_32F、CV_64F 之一
 OutputArray dst, //形态学操作后的输出图像,与输入图像具有相同的尺寸和数据类型
 int op, //形态学操作类型的标志,可以选择的标志及其含义下方给出
 InputArray kernel, //结果元素,可以自己生成,也可以用 getStructuringElement 函数生成
 Point anchor = Point(-1,-1), //中心点在结构元素中的位置,默认参数为结构元素的几何中心点。
 int iterations = 1, //处理的次数
 int borderType = BORDER_CONSTANT, //像素外推法选择标志
 const Scalar& borderValue = morphologyDefaultBorderValue() //表示不包含外推法时的边界值
 );

该函数根据结构袁术对输入图像进行多种形态学操作,在处理多通道图像时,每个通道独立进行处理。

  • 该函数的第一个参数为待形态学处理的图像。
  • 该函数的第二个参数是形态学输出图像,与输入图像具有相同的尺寸和数据类型。
  • 该函数的第三个参数是形态学操作类型的选择标志,可以选择的形态学操作类型有开运算、闭运算、形态学梯度、顶帽运算、黑帽运算,以及击中击不中变换。
  • 该函数的第四个、第五个参数都是与结果元素相关的参数,第四个参数为结构元素,使用的结构元素尺寸越大,效果越明显,第四个参数为结构元素的中心位置,第五个参数的默认值为 Point(-1, -1),表示结构元素的几何中心处为结构元素的中心点。
  • 该函数的第六个参数是使用结构元素处理的次数,处理次数越多,效果越明显。
  • 该函数的第七个参数是图像像素外推法选择标志,第八个参数为使用边界不变外推法时的边界值,这两个参数对于图像中主要部分的形态学操作没有影响,因此在多数情况下使用默认值即可。
 MORPH_ERODE    = 0, //图像腐蚀
 MORPH_DILATE   = 1, //图像膨胀
 MORPH_OPEN     = 2, //开运算
 MORPH_CLOSE    = 3, //闭运算
 MORPH_GRADIENT = 4, //形态学梯度
 MORPH_TOPHAT   = 5, //顶帽运算
 MORPH_BLACKHAT = 6, //黑帽运算
 MORPH_HITMISS  = 7  //击中击不中运算

图像形态学腐蚀可以将细小的噪声区域去除,膨胀则反之,相当好理解,重点说明区域的击中形态学运算

开运算

图像开运算可以去除图像中的噪点,消除较小连通域,保留较大连通域,同时能够在两个物体纤细的连接处将两个物体分离,并且在不明显改变较大连通域面积的同时能够平滑连通域的边界。
开运算是图像腐蚀和膨胀的结合,首先对图像进行腐蚀,消除图像中噪声和较小的连通域,之后通过膨胀算法弥补较大连通域因腐蚀而造成的面积较小。

闭运算

图像闭运算可以去除连通域内的小型空间,平滑物体轮廓,连接两个临近的连通域。
闭运算是图像腐蚀和膨胀操作的结合,首先对图像进行膨胀,填充连通域内的小型空洞,扩大连通域的边界,将临近的两个连通域连接,之后通过腐蚀运算减少由膨胀运算引起的连通域边界的扩大以及面积的增加。

形态学梯度

形态学梯度能够描述目标的边界,根据图像腐蚀和膨胀与原图之间的关系计算得到,形态学梯度可以分为基本梯度、内部梯度和外部梯度。
基本梯度是原图像膨胀后图像与腐蚀后图像间的差值图像,内部梯度图像是原图像与腐蚀后图像间的差值图像,外部梯度是膨胀后图像与原图像间的差值图像。

顶帽运算

图像顶帽运算是原图像与开运算结果之间的差值,往往用来分离比临近点亮一些的斑块,因为开运算带来的效果是放大了裂缝或者局部低亮度的区域,因此,从原图中国减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域。
顶帽运算先对图像进行开运算,之后从原图像中减去开运算计算的结果。

黑帽运算

图像黑帽运算是与图像顶帽运算相对应的形态学操作。与顶帽运算不同,黑帽运算是原图像与顶帽运算结果之间的差值,往往用来分离比临近点暗一些的斑块。
黑帽运算先对图像进行闭运算,之后从闭运算结果中减去原图像。

击中击不中变换

击中击不中变换是比图像腐蚀要求更加岢刻的一种形态学操作,图像腐蚀只需要图像能够将结构元素中所有非零元素包含,但是击中击不中变换要求原图像中需要存在与结构元素一模一样的结构,即结构元素中非零元素也需要同时被考虑。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当编译OpenCV时出现"internal compiler error: Segmentation fault"的错误提示时,这通常是由于编译器或编译选项设置的问题导致的。 首先,确保您的编译器和OpenCV版本兼容。可以尝试更新编译器和OpenCV到最新版本以解决可能存在的bug。 其次,根据您提供的引用中的CMakeLists.txt文件,检查编译选项是否正确设置。特别是确保CMAKE_CXX_FLAGS变量中的选项正确设置,并且与您使用的编译器和OpenCV版本兼容。 另外,还可以尝试禁用一些编译选项,例如-Wall,-Wformat,-Wformat-security,-Werror=format-security,-Wunreachable-code,以查看是否解决了问题。有时候这些选项会导致编译错误。 最后,如果问题仍然存在,您可以尝试重新下载OpenCV以及引用中提到的相关模型文件。确保下载的文件完整并正确放置在相应的位置。 总结一下解决此问题的步骤: 1. 确保编译器和OpenCV版本兼容。 2. 检查CMakeLists.txt文件中的编译选项是否正确设置,并尝试禁用一些选项。 3. 重新下载OpenCV和相关模型文件,确保它们完整且正确放置。 希望这些方法能够帮助您解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv安装实录附十几行C++实现的一个人脸识别demo](https://blog.csdn.net/lyn631579741/article/details/123077860)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值