OPENCV C++图像提取,图像处理,roi,阈值分割,连通区域筛选,边缘检测(以箱子边缘框选为例)

本周有机会接触了一点opnev, 在此做一下记录, 最终以框选出下图箱子为目的(图片箱子为相机实拍结果,曝光有点低,会有亿点点暗 ), 本文会拆解步骤并附上图片, 完整的源码在最后.PS:本文参考了好多大佬分享的理论知识, 在此先感谢大佬的分享~~

首先是梳理一下流程, 下图是本次图片处理的大概流程和部分效果图以及部分会用到的算子~~

1.图像读取

图像读取可以直接使用如下模块读取直接路径的图片:

但如果预处理图片较多, 需要从文件夹循环读取处理的话可以用如下模块,只需更改文件夹地址以及文件命名格式就行, 这里我文件夹里的图片名字均为"1.png"这样的格式:

2.提取需要处理的roi区域

这里的示例是拍照空间区域中存在一个托盘, 托盘上方有预提取的箱子, 所以需要建立托盘的roi区域, 之后只单独对这个区域进行处理, 这样可以排除干扰项~

3.灰度处理

这一步转成灰度图, 并进行阈值提取,方便之后提取

4.灰度处理

这里的腐蚀是为了将阈值分割之后的部分噪声去除, 膨胀是为了还原上一步被删除了的特征点,偷个懒用上面的图了哈~其实这一步就和直接用闭运算是一样的, 但是为了能看出过程的变换我就拆分开了.

5.提取连通区域并删除其中面积较小的区域

6.筛选出面积较大的区域部分 并绘制矩形 框选出箱子轮廓

这一块的逻辑就是第一次筛选掉小面积区域后, 对剩下的区域再进行一次筛选,这次筛选面积较大的区域, 并对每一个面积大的区域进行单独绘制出轮廓, 并将这个轮廓点集用minAreaRect算子, 输入点集输出四个点的坐标, 并将这四个点用直线连接起来, 就可以得到结果了~

7.全部源码

至此, 本次分享的箱子提取过程完结, 图片处理其实很吃图片的像素分布情况 ( 是否有过亮过暗, 是否反光, 是否有噪声, 是否清晰等 ) , 比如本次图片就是属于较暗的情况, 在阈值分割的时候就很头疼, 用了自适应阈值和直方图阈值分割的方式, 但效果并不是很理想 ,最终还是手动给了阈值, 而且干扰项也蛮多的, 处理方式还是比较简单和基础, 最后再附一张轮廓检测的结果图 , 效果其实也还行 . 比如图片17 , 原图是三个箱子堆叠在一起 , 但是轮廓补全后还是把箱子轮廓框选出来了.

这里单独提一下,在VS的"工具"→"拓展和跟新"里可以找到"Image Watch 2017"插件,可以用来查看图片的具体像素点,在阈值处理的时候会很有用

猜你喜欢

转载自blog.csdn.net/weixin_60376901/article/details/128593556