应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

opencv实战机器视觉检测和计数

  引言
  在机器视觉中,有时需要对产品进行检测和计数。其难点无非是对于产品的图像分割。
  由于之前网购的维生素片,有时候忘了今天有没有吃过,就想对瓶子里的药片计数。。。在学习opencv以后,希望实现对于维生素片分割计数算法。本次实战在基于形态学的基础上又衍生出基于距离变换的分水岭算法,使其实现的效果更具普遍性。
  基于形态学的维生素片检测和计数
  整体思路:读取图片形态学处理(在二值化前进行适度形态学处理,效果俱佳)二值化提取轮廓(进行药片分割)获取轮廓索引,并筛选所需要的轮廓画出轮廓,显示计数
  opencv实现:intmain(intargc,charargv){Matsrc,srcbinary,dst,srcdistance;srcimread(D:opencv练习图片维生素片机器视觉检测和计数。png);imshow(原图片,src);MatkernelgetStructuringElement(MORPHRECT,Size(16,16),Point(1,1));morphologyEx(src,dst,MORPHOPEN,kernel);imshow(形态学,dst);cvtColor(dst,dst,COLORRGB2GRAY);threshold(dst,srcbinary,100,255,THRESHOTSU);imshow(二值化,srcbinary);vectorvectorPointcontours;findContours(srcbinary,contours,RETREXTERNAL,CHAINAPPROXNONE,Point(0,0));RNGrng(12345);doublearea;Point2iPL;for(sizeti0;icontours。size();i){areacontourArea(contours〔i〕);if(area500)continue;PLcontours〔i〕。front();ScalarcolorScalar(rng。uniform(0,255),rng。uniform(0,255),rng。uniform(0,255));drawContours(src,contours,i,color,2,8);putText(src,tostring(i),PL,FONTHERSHEYCOMPLEX,1,color,2);}imshow(计数结果,src);waitKey(0);return0;}
  效果展示:
  由上图可以看的,原图在经过形态学处理后,可以去除很多细节,简化后续的药片分割操作。
  但是在计数结果图上发现,索引17号药片并没有完全分割(实际上修改形态学的结构元素尺寸(改为2020)也可以完全分离这两个药片)。
  这不由得让我们思考,如果简单的形态学处理分割不了药片呢?
  对于复杂的产品图片,我们可以使用基于距离变换的分水岭算法对其分割。
  基于距离变换的分水岭算法检测和计数
  OpenCV采用了基于标记点的分水岭算法,在这种算法中我们要设置哪些山谷点会汇合,哪些不会。这是一种交互式的图像分割。我们要做的就是给我们已知的对象打上不同的标签(即添加注水点)。然后实施分水岭算法。每一次灌水,我们的标签就会被更新,当两个不同颜色的标签相遇时就构建堤坝,直到将所有山峰淹没,最后我们得到的边界对象(堤坝)的值为1。
  对于如何打上标签(即添加注水点)有两种办法:
  opencv中,对于一张二值化的图像,后续处理方式有两种。第一种方式就是利用findContours、drawContours等函数进行轮廓分析(opencv以对轮廓的处理为主)。第二种方式就是计算连通域进行区域分析。
  第一种(基于轮廓):在二值化后,对图像寻找轮廓findContours,筛选出注水区域轮廓,然后通过drawContours对轮廓标记。
  第二种(基于区域):在二值化后,先对寻找图像中的前景图(即注水点),再寻找到背景图(进行膨胀),最后找到未知区域(背景减去前景,得到边缘图),通过connectedComponents()获取标记点。
  相关API:分水岭函数watershed函数原型voidwatershed(InputArrayimage,InputOutputArraymarkers);
  第一个输入参数image,必须是CV8UC3类型图像。
  第二个输入输出参数markers必须是32位单通道图像。和image尺寸一样。包含不同区域的轮廓,每个轮廓有一个自己唯一的编号。
  在执行watershed函数后,算法会根据markers传入的轮廓作为种子,对图像上其他的像素点根据分水岭算法规则进行判断,并对每个像素点的区域归属进行划定,直到处理完图像上所有像素点。而区域与区域之间的分界处的值被置为1,以做区分。距离变换函数distanceTransform函数原型
  距离变换运算用于计算二值化图像中的每一个非零点距自己最近的零点的距离,距离变换图像上越亮的点,代表了这一点距离零点的距离越远。
  距离变换通常用于求解图像的骨骼和查找物体的质心(即获取距离变换的极大值)和计算非零像素到最近零像素点的最短距离。distanceTransform(InputArraysrc,OutputArraydst,intdistanceType,intmaskSize,intdstTypeCV32F);
  第一个输入参数src,必须是CV8UC1类型的二值图像(只有0或1)
  第二个输出参数dst,表示的是计算距离的输出图像,输出类型是CV32FCV8U的单通道图像,大小与输入图片相同。
  第三个参数distanceType,表示的是选取距离的类型,可以设置为DISTL1,DISTL2,DISTC
  第四个参数maskSize,表示的是距离变换的掩膜模板,可以设置为3,5(常用3)
  第四个参数dstType,表示输出类型,可选择CV32FCV8U
  注:若输出类型为CV32F,想要显示距离变换后的骨架图像,需要对其归一化。(normalize)
  先来看看第一种标记mark(基于轮廓)的方法:
  (一)读入图像,形态学,二值化(消除噪声)Matsrc,srcbinary,dst,srcdistance;srcimread(D:opencv练习图片维生素片机器视觉检测和计数。png);imshow(原图片,src);MatkernelgetStructuringElement(MORPHRECT,Size(3,3),Point(1,1));morphologyEx(src,dst,MORPHOPEN,kernel);imshow(形态学,dst);cvtColor(dst,dst,COLORRGB2GRAY);threshold(dst,srcbinary,100,255,THRESHOTSU);imshow(二值化,srcbinary);
  (二)距离变换(归一化显示),再二值化distanceTransform(srcbinary,srcdistance,DISTL2,3,5);normalize(srcdistance,srcdistance,0,1,NORMMINMAX);imshow(距离变换,srcdistance);threshold(srcdistance,srcdistance,0。4,1,THRESHBINARY);imshow(再二值化,srcdistance);
  经过距离变换后的二值化,可以清晰看到,药片以及完全分割开来。
  (三)打上标签(添加注水点),基于轮廓寻找标记点marsk的轮廓信息也就是分水岭的水坝srcdistance。convertTo(srcdistance,CV8UC1);vectorvectorPointcontours;findContours(srcdistance,contours,RETRTREE,CHAINAPPROXSIMPLE);创建makerMatmarkersMat::zeros(src。size(),CV32S);因为分水岭后的边缘存储是1,所以必须使用有符号的CV32Sfor(sizett0;tcontours。size();t){drawContours(markers,contours,staticcastint(t),Scalar(staticcastint(t)1),1);轮廓数字编号}circle(markers,Point(5,5),30,Scalar(255),1);关键代码(mark做一个小标记)intindex10;打印轮廓数据有值的均为轮廓线for(introw0;rowmarkers。rows;row)for(intcol0;colmarkers。cols;col){index1markers。atint(row,col);coutindex1,;}
  部分标签markers轮廓数据截图,可以看到0代表背景,轮廓线用正数索引标识。
  (四)进行分水岭操作,并给分水岭后的区域随机上色,并打印出检测的药片个数。生成随机颜色vectorVec3bcolors;for(sizeti0;icontours。size();i){intrtheRNG()。uniform(0,255);intgtheRNG()。uniform(0,255);intbtheRNG()。uniform(0,255);colors。pushback(Vec3b((uchar)b,(uchar)g,(uchar)r));}颜色填充与最终显示Matdst1Mat::zeros(markers。size(),CV8UC3);intindex0;for(introw0;rowmarkers。rows;row){for(intcol0;colmarkers。cols;col){indexmarkers。atint(row,col);if(index0indexcontours。size()){dst1。atVec3b(row,col)colors〔index1〕;}else{dst1。atVec3b(row,col)Vec3b(0,0,0);}}}imshow(结果显示,dst1);printf(药片检测个数:d,contours。size());
  再来看看第二种标记mark(基于区域)的方法:
  (一)读入图像,形态学,二值化(消除噪声)Matforeground,background,unkonwn;创建前景,背景,未知区域Matsrc,srcbinary,dst,srcdistance;srcimread(D:opencv练习图片维生素片机器视觉检测和计数。png);imshow(原图片,src);MatkernelgetStructuringElement(MORPHRECT,Size(3,3),Point(1,1));morphologyEx(src,dst,MORPHOPEN,kernel);imshow(形态学,dst);cvtColor(dst,dst,COLORRGB2GRAY);threshold(dst,srcbinary,100,255,THRESHOTSU);imshow(二值化,srcbinary);
  (二)对二值化图像进行膨胀操作,得到大部分是背景的图片得到背景图片dilate(srcbinary,background,kernel,Point(1,1),3);imshow(背景图片,background);
  (三)通过对二值图像距离变换得到前景图片(即注水点)距离变换distanceTransform(srcbinary,srcdistance,DISTL2,3,5);imshow(距离变换,srcdistance);normalize(srcdistance,srcdistance,0,255,NORMMINMAX);doublemyminv0。0,mymaxv0。0;minMaxIdx(srcbinary,myminv,mymaxv);threshold(srcdistance,foreground,0。4mymaxv,255,THRESHBINARY);foreground。convertTo(foreground,CV8U);imshow(前景图片,foreground);
  (四)通过背景与前景的差值,得到未知区域(即边缘所在区域)得到未知区域unkonwnbackgroundforeground;imshow(未知区域,unkonwn);
  (五)得到这些区域以后,我们可以获取注水点的标签,通过connectedComponents实现(即获取markers标签)创建标记点markersMatmarkersMat(src。size(),CV32S);intnumconnectedComponents(foreground,markers,8);coutnumendl;markersmarkers1;for(inti0;iunkonwn。rows;i){for(intj0;junkonwn。cols;j){if(((int)unkonwn。atuchar(i,j))255){markers。atsignedint(i,j)0;}}}
  详细理解该步骤:
  现在我们已经知道哪些是背景,哪些是药片(前景区域)。
  因此我们可以创建一个标签(和原图大小,类型为CV32S),通过connectedComponents函数对前景区域进行标记
  连通域相关博文:opencv连通域标记与分析唯有自己强大博客园(cnblogs。com)
  该函数会对前景区域连通域分析,并将背景设定为0,其他区域从1开始正整数标记(这就是我们的种子,水漫时会从这里漫出),结果返回给markers。
  但是对于分水岭算法,会将为0的区域认为是未知区域,因此要markers整体加一。
  (六)进行分水岭操作,并显示边缘watershed(src,markers);for(introw0;rowmarkers。rows;row){for(intcol0;colmarkers。cols;col){if(markers。atint(row,col)1){src。atVec3b(row,col)Vec3b(0,0,255);}}}imshow(结果,src);
  由于分水岭算法会将找到的边缘在markers置为1,因此我们对原图操作,将索引为1的位置的像素值改为红色(即显示边缘)。
  转载于:https:www。cnblogs。comxyf327p14772593。html

詹姆斯的大儿子布朗尼,可能真要进NBA了詹姆斯与湖人提前续约两年,加上旧合同剩一年,共计三年,其中第三年为球员选项。倘若执行完全部剩余合同,詹姆斯将在湖人效力至202425赛季,如果在第二年跳出球员选项,他将在……火箭队17顺位选秀备选目标二马乔恩博尚今天给大家介绍的是锋位摇摆人马乔恩博尚,出生于2000年10月12日,马上就要年满22周岁,算是年龄偏大的新秀了,上个赛季没有打过NCAA的比赛,为NBA发展联盟点燃队效力,是……人间仙境白云山(下),云海日出,登极玉皇旭日东升为了能一睹白云山著名的云海日出的胜景,前一天晚上就下定决心凌晨3点起床,这对我来说是一次巨大的生理考验。强烈的信念是可以影响生物钟的,2点50多就醒了,坐坐……中国女篮新希望!2米26260斤堪称巨无霸,被誉为女版奥尼尔众所周知,姚明的身高是2。26米,这种身高上的优势让姚明在内线如鱼得水。近段时间,在U15篮球女子组比赛中,有一名15岁的小将,身高已经达到了2。26米,体重达到了260斤。别……ZOOBET报道称安德森加盟明尼苏达森林狼队,两年1800万凯尔安德森凯尔安德森已经同意以两年1800万美元的价格加盟明尼苏达森林狼队,他将成为明尼苏达队一名强大的轮换球员!因为这支球队希望在上赛季季后赛的基础上再接再厉。作……河北又有工程完成招标,将耗资79万新建客运站,在一县城内旅行之意义并不是告诉别人这里我来过。是一种改变。旅行会改变人的气质,让人的目光变得更加长远。在旅途中,你会看到不同的人有不同的习惯,你才能了解到,并不是每个人都按照你的方式在生……安东尼不能保证本赛季会留在阿贾克斯,我会做出正确决定近日,阿贾克斯前锋安东尼接受了荷兰媒体《电信报》的采访,在采访中他被问到了与曼联的传闻。对此,这位巴西前锋表示自己不能保证本赛季是否会继续留在阿贾克斯。据此前媒体的报道,曼联正……春季,要少吃这6种蔬菜民以食为天,饮食是维持身体健康的根本,春季是吃绿叶蔬菜的黄金期,随着春天的到来,万物复苏,草长莺飞,绿叶植物纷纷露出了萌芽。爱乐养生蔬菜中含有多种对身体有益的营养成分,多……开学季千元5G手机种草售价千元左右,续航能力很强最近要上高中的妹妹想要一款手机,但是高中的学业又至关重要,又因为还有网课需要上,所以她就想买一款国产巨头品牌的手机,这款手机要容量大、性价比高、能上网课,还得是5G手机且价格亲……改变对钱的认知,是实现财富自由的第一步说出来大家可能不信,美国排名第一的畅销书作家和财务自由大师安东尼奥尼尔在19岁时,还是负债累累,无家可归,那时的他觉得人生没有方向。后来,经过调整对金钱的认知和改变习惯,……机构中国大陆智能手机厂商Q2出货季减5。2vivo跌幅最大集微网消息,根据DIGITIMESResearch的SmartphoneTracker的数据,第二季度中国大陆智能手机厂商总出货量约为1。5亿台,季减5。2,年减4。6。……1400也想拿幻神?CF周年套直售变抽奖获取,策划被玩家喷上《穿越火线》一年一度的周年庆活动,是3亿CFer绝不愿错过的活动。甭管平时氪金观念如何,到了这时候大多都会选择来捧个场。但《穿越火线》今年的周年庆活动,却因为一些事,无法做到像……
紧抓智能技术新趋势,推动机器人产业高质量发展2月24日,市经济信息化委副主任汤文侃带队赴傅利叶智能科技有限公司实地调研,参观了公司研发中心和生产部门,并主持召开座谈会,就智能机器人产业前沿技术、发展方向、产业链安全等方面……这个最上海榜单,虹口潮玩地占了一半!春天已近,气候温暖适宜,又到了户外漫步的好时节。此前,市文旅局曾首次发布最上海旅游指数。在最上海苏州河TOP10榜单中,位于虹口的潮玩地就占据一半。为什么这些虹口景点能上……我终于找到了,梦想中的电视对于热爱生活的我来说,永远在折腾小家的路上,家里常换常新带来了巨大的满足感。偶尔会把某个角落重新布置一番,会入手种草的家具和家电,整个空间又有了不一样的感觉,家就是用来折腾的呀……洪涛我看百亿补贴竞争2019年,据说最早的百亿补贴是聚划算开始的。2019年的618开始,拼多多采取了百亿补贴,开启了一场无套路降价的购物狂欢,活动结束后,百亿补贴不仅未终止,反而被升级为平台长期……请牢牢记住这八句话,让你受益终身作者:水木然一定要深交那些不合群的人!孤独者,非神即兽,他们绝不是普通人。内心越充盈的人,越喜欢独处和安静;内心越空虚的人,越喜欢热闹和喧哗。强者……吃什么对牙齿好?推荐五种对牙齿有益的食物,适合大家经常吃!生活中很多人年纪不大,牙齿却出现了问题,经常被牙齿问题折磨,非常痛苦。平时我们要注意对牙齿的保护,多吃对牙齿有益的食物,它们能维持牙齿健康,防止牙齿出现问题。保护牙齿应该从饮食……A股大势已定,下周抄底?不废话,直接上答案周末被注册制刷屏,昨天该说的包拯都已经说了,无论利空也好,利多也罢,不可否认A股即将进入一个新时代,与其抱怨不如改变,当你自身能力不足时,那就只能被淘汰。包拯有幸在A股市……华为小米出手都救不了,安卓平板市场前景一片灰暗平板电脑在过去的三年里,疫情的影响让平板电脑从最开始的娱乐工具成为了不少家庭的刚需,因为家庭中神兽们的教育以及家长们手头的工作,从线下转到了线上,这也同时意味着平板电脑的需求突……新春走基层山兰酒香黎歌欢!白沙黎乐部落让游客感受黎族风情海南日报记者曾毓慧黎家乡最美,青山绿水鸟语花香;走在乡间赏风景,闻风吹来花梨香1月25日,在白沙黎族自治县邦溪镇南牙村,在毗邻白沙学而山房邦溪水院民宿的乡村音乐广场,3名……C罗选择沉默!姐姐和女友发声责怪队友教练,葡萄牙球员怨气更大2022世界杯狂胜瑞士,带来了极大的信心,可没想到摩洛哥队轻易就将葡萄牙队摧毁了!卡塔尔世界杯临近尾声,仍然在提醒球迷们:足球是圆的!没有什么是不可能的!只不过,相比较巴……苹果MR头显据悉具备眼动和手部追踪功能,预计首年将销售约10彭博1月23日报道,苹果将推出售价约3000美元的混合现实(MR)头戴式设备,可能命名为RealityPro。知情人士透露,眼动和手部追踪功能将是该设备的主要卖点。设备本身内置……中央网信办各大平台依据辟谣标签对25万余条谣言进行标记去年8月以来,中央网信办举报中心聚焦人民群众关心关切的社会民生领域,组织微博、抖音、百度、腾讯、快手、今日头条、小红书、哔哩哔哩、360、知乎、豆瓣、UC浏览器等12家网站平台……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网