目录

🍅点击这里查看所有博文

  随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记下来。存在很多在特殊情况下有一点用处的技巧,用的不多的技巧可能一个星期就忘了。

  想了很久想通过一些手段把这些事情记录下来。也尝试过在书上记笔记,这也只是一时的,书不在手边的时候那些笔记就和没记一样,不是很方便。

  很多时候我们遇到了问题,一般情况下都是选择在搜索引擎检索相关内容,这样来的也更快一点,除非真的找不到才会去选择翻书。后来就想到了写博客,博客作为自己的一个笔记平台倒是挺合适的。随时可以查阅,不用随身携带。

  同时由于写博客是对外的,既然是对外的就不能随便写,任何人都可以看到。经验对于我来说那就只是经验而已,公布出来说不一定我的一些经验可以帮助到其他的人。遇到和我相同问题时可以少走一些弯路。

  既然决定了要写博客,那就只能认真去写。不管写的好不好,尽力就行。千里之行始于足下,一步一个脚印,慢慢来 ,写的多了慢慢也会变好的。权当是记录自己的成长的一个过程,等到以后再往回看时,就会发现自己以前原来这么菜😂。

  本系列博客所述资料均来自互联网,并不是本人原创(只有博客是自己写的)。出于热心,本人将自己的所学笔记整理并推出相对应的使用教程,方面其他人学习。为国内的物联网事业发展尽自己的一份绵薄之力,没有为自己谋取私利的想法。若出现侵权现象,请告知本人,本人会立即停止更新,并删除相应的文章和代码。

一、二维码的发现和定位

1、具体操作步骤

  • 先将图片转换为灰度图像

  • 通过OTSU转换为二值图像

  • 通过发现轮廓函数,对二值图像使用轮廓发现得到轮廓

  • 根据二维码三个区域的特征,对轮廓进行面积与比例过滤,最终得到结果

2、思路

  • 定位点的轮廓有三层轮廓

  • 每个定位点的轮廓中心点一样的

  • 三个定位点可以围成一个等腰直角三角形

3、存在的问题

  • 只能对单个二维码来进行扫描

  • 只能处理摄像头拍照很清楚的图片进行识别(对imei和二维码的清晰度要求高),拍摄位置的角度偏差比较小,同时考虑光线等元素的干扰

4、针对上面的问题有以下的改善

  • 阈值分割

  • 可以对图像进行腐蚀或者膨胀的处理

  • 扣取所有正方形区域,逐个检测

  • 然后再进行步骤2中的思路来检测,定位

5、涉及到的函数说明

threshold()固定阈值二值化函数:
ret, dst = cv2.threshold(src, thresh, maxval, type)

(1)参数说明:

Src:输入图,只能输入单通道图像,通常来说为灰度图

Thresh:阈值

Maxval:当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

Type:二值化操作的类型,包含以下5种类型: 

cv2.THRESH_BINARY; (两极化)

cv2.THRESH_BINARY_INV;(对调两极化)

cv2.THRESH_TRUNC; (过度)

cv2.THRESH_TOZERO;(亮色过度)

cv2.THRESH_TOZERO_INV;(对调亮色过度)

(2)返回值:dst 输出图
cv2.findContours()寻找轮廓函数:
img, countour,hierarchy =cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])  

(1)参数说明:

Image:表示寻找轮廓的图像;

Mode:表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):

 cv2.RETR_EXTERNAL表示只检测外轮廓

cv2.RETR_LIST检测的轮廓不建立等级关系

cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。

cv2.RETR_TREE建立一个等级树结构的轮廓。   

Method:表示轮廓的近似办法

cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1

cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

(2)返回值:

Img:表示返回的图像;

Coutour:是一个list,每个元素都是一个轮廓(彻底围起来算一个轮廓),用numpy中的ndarray表示。

Hierarchy:也是一个ndarry,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

二、总结

1、膨胀:调整分割区域的形状以获得比较理想的结果,每一个位置的矩形领域内值的最大值作为该位置的输出灰度值,总体亮度会比原图上升,亮的区域变大,暗的区域减少或消失

2、腐蚀:(类似于膨胀)每一个位置的矩形领域内值的最小值作为该位置的输出灰度值,总体亮度比原图低,亮的区域变小,暗的区域变大

3、opencv 中的层次结构:https://www.kancloud.cn/aollo/aolloopencv/362441

介绍:OpenCV使用一个含有四个元素的数组表示父子关系,【Next,Previous,First_Child,Parent】

  那么本篇博客就到此结束了,这里只是记录了一些我个人的学习笔记,其中存在大量我自己的理解。文中所述不一定是完全正确的,可能有的地方我自己也理解错了。如果有些错的地方,欢迎大家批评指正。如有问题直接在对应的博客评论区指出即可,不需要私聊我。我们交流的内容留下来也有助于其他人查看,说不一定也有其他人遇到了同样的问题呢😂。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐